需求
开始是需要把省份的名称,省份编码经纬度导入数据库,为后面接口提供数据。
需要爬取的经纬度地址:(因为开始就找到这个)
思路
先通过WebDriver把页面爬取下来,然后观察结构解析需要的表格部分,最后把爬取下来的数据用excel保存再导入数据库
前期准备:
- 安装Selenium WebDriver
pip install selenium
Selenium WebDriver提供了各种语言的编程接口,来进行Web自动化开发。
安装完成后,运行python解释器,执行命令import selenium,如果没有异常,则表示安装成功了,如下所示
- 下载浏览器的驱动
chrom浏览器的web driver(chromedriver.exe),可以在下面网址访问:
http://npm.taobao.org/mirrors/chromedriver/
firefox(火狐浏览器)的web driver (geckodriver.exe)在这里访问:
https://github.com/mozilla/geckodriver/releases
其他浏览器驱动可以见下面列表:
Edge:https://developer.microsoft.com/en-us/micrsosft-edage/tools/webdriver
Safari:https://webkit.org/blog/6900/webdriver-support-in-safari-10/
下载对应版本:
下载BeautifulSoup
BeautifulSoup4是一个HTML/XML的解析器,主要的功能是解析和提取HTML/XML的数据。和lxml库一样。
BeautifulSoup4用来解析HTML比较简单,API使用非常人性化,支持CSS选择器,是Python标准库中的HTML解析器,也支持lxml解析器。
pip install beautifulsoup4
下载openpyxl
OpenPyXl是一个Python的模块 可以用来处理excle表格
安装:
直接pip install openpyxl
就可以
实现步骤
- 先引入需要模块
from selenium import webdriver
from bs4 import BeautifulSoup
from openpyxl.workbook import Workbook
from openpyxl.writer.excel import ExcelWriter
- 指定chrom驱动页面最大化
driver = webdriver.Chrome("C:\Program Files (x86)\Google\Chrome\Application\chromedriver.exe") # 这是我的驱动地址自己改改
driver.maximize_window()
- get 方法 打开指定网址
driver.get(
"https://blog.csdn.net/abcmaopao/article/details/79554904")
html = driver.execute_script("return document.documentElement.outerHTML")
- 通过beautifulSoup解析
使用BeautifulSoup类解析这段代码,获取一个BeautifulSoup的对象,然后按照标准格式输出。
soup = BeautifulSoup(html, 'lxml')
- 获取市级的excel表格
if(soup):
# 创建工作簿获取当前工作表sheet然后取个名字
wb = Workbook()
ws = wb.active
ws.title = u'省份经纬度'
# list用来保存数据
list=[]
# 遍历表的的每一行,然后把每一行的每一列变成一个数组
# 再把这个数组压入list中
for tr in soup.find_all('tr'):
col = []
for td in tr.find_all('td'):
col.append(td.get_text())
# ws.cell(row=i, column=j).value = td.get_text()
list.append(col)
print(list)
# 输出看看然后导入excel表格
i = 0
for r in list:
if(i==0):
j = 0
for c in r:
ws.cell(row=i+1, column=j+1).value = c
print(i,j,c)
j += 1
i += 1
elif(i>0 and int(r[1])%10000!=0):
j = 0
for c in r:
ws.cell(row=i+1, column=j+1).value = c
print(i,j,c)
j += 1
i += 1
# 保存
wb.save('市级.xlsx')
print("保存成功!")
driver.quit()
保存出来的表结构
完整代码
from selenium import webdriver
import time
from bs4 import BeautifulSoup
from openpyxl.workbook import Workbook
from openpyxl.writer.excel import ExcelWriter
driver = webdriver.Chrome("C:\Program Files (x86)\Google\Chrome\Application\chromedriver.exe")
driver.maximize_window()
driver.get(
"https://blog.csdn.net/abcmaopao/article/details/79554904")
html = driver.execute_script("return document.documentElement.outerHTML")
soup = BeautifulSoup(html, 'lxml')
if(soup):
wb = Workbook()
ws = wb.active
ws.title = u'省份经纬度'
list=[]
for tr in soup.find_all('tr'):
col = []
for td in tr.find_all('td'):
col.append(td.get_text())
# ws.cell(row=i, column=j).value = td.get_text()
list.append(col)
print(list)
i = 0
for r in list:
if(i==0):
j = 0
for c in r:
ws.cell(row=i+1, column=j+1).value = c
print(i,j,c)
j += 1
i += 1
elif(i>0 and int(r[1])%10000!=0):
j = 0
for c in r:
ws.cell(row=i+1, column=j+1).value = c
print(i,j,c)
j += 1
i += 1
# j += 1
# i+=1
wb.save('市级.xlsx')
print("保存成功!")
driver.quit()
抽取全国各省市的DataV.GeoAtlas json地图数据
然后现在需要把[全国地图json api] (http://datav.aliyun.com/tools/atlas/#&lat=30.316551722910077&lng=104.20306438764393&zoom=3.5) 下载到本地,但这次要省级的
一样的思路把省级的行政编码爬取下来
也就是把elif(i>0 and int(r[1])%10000!=0):
改成elif(i>0 and int(r[1])%10000==0):
然后这次变成读取每一个省份的编码,动态爬取json保存
完整代码
from openpyxl.workbook import Workbook
from openpyxl import load_workbook
def getJson(code):
path = "https://geo.datav.aliyun.com/areas/bound/geojson?code="
driver.get(path + code+'_full')
html = driver.execute_script("return document.documentElement.outerHTML")
soup = BeautifulSoup(html, 'lxml')
print(soup.get_text())
if (soup.get_text()):
f = open(code + '_full.json', 'w',encoding='utf-8')
f.write(soup.get_text())
f.close()
print("保存成功" + code)
driver = webdriver.Chrome("C:\Program Files (x86)\Google\Chrome\Application\chromedriver.exe")
driver.maximize_window()
code = "100000"
getJson(code)
wb = load_workbook('test1.xlsx')["省份经纬度"]
print(wb.rows)
list=[]
i = 0
for row in wb.rows:
if(i>0):
chil = []
print(row[1].value)
code = row[1].value
getJson(code)
i += 1
driver.quit()