先看效果
一、工具
1、爬虫工具:requests(爬虫包)、xpath(定位指定信息)
2、分析工具:pandas(数据分析工具)、tableau(可视化)
3、数据来源:高德地图、国家统计局官网
备注:想现在excel版最新城市名称数据,可点击中国省市名称数据.xlsx
二、调用高德地图API
在高德地图开发文档里面创建应用以后获得自己的key,然后根据需要查看开发文档(本处选择“搜索POI”)
爬取到的数据默认是json格式,通过关键字逐层筛选就可以获得指定信息
代码如下:
searchword = '机场'
url = 'https://restapi.amap.com/v3/place/text?'
#uri = url + 'keywords=' + searchword + '&key=' + selkey +'&city='+city+ '&subdistrict=1' + '&extensions=all'
uri = url + 'keywords=' + searchword + '&key=' + selkey +'&subdistrict=1' + '&extensions=all'
r = requests.get(url=uri, timeout=30)
if r.status_code == 200:
print(r.text,'\n')
html = json.loads(r.text)
for city in html['suggestion']['cities']:
print(city)
数据写入excel后,通过tableau在中国地图显示数据(有部分城市,Tableau无法自动识别)
从数量上可以看出,东西分布差异很明显。为了更进一步查看,接下来想办法为这230个城市匹配到各自的省份。230个城市中有很多听都没听过,所以人工匹配还是很麻烦的。接着从网上找数据吧。。。
三、爬取全国所有城市信息
通过一番查找,发现国家统计局的官网上就有这些数据:
点击指定省份,就会可以看到该省份下面所有的城市先爬取省份信息,再爬取每个省份子页面中的城市信息即可:
代码如下:
req = requests.get(url,timeout =30,headers=header)
req.encoding = "gb2312"
# #print(req.text)
# provices = re.findall('<a href=11.html">(.*?)<br></a>',req.text)
# #print(provices)
html = etree.HTML(req.text)
infos = html.xpath('//table[@class = "provincetable"]/*') #定位表格数据
dic ={}
for info in infos:
#print(info)
proviceses=info.xpath('./td//a/text()') #/html/body/table[2]/tbody/tr[1]/td/table/tbody/tr[2]/td/table/tbody/tr/td/table/tbody/tr[7]/td[6]/a/text()
#print(proviceses)
hrefs = info.xpath('./td//a/@href')
if (len(proviceses)>0):
for province,href in zip(proviceses,hrefs):
href = url1+href
cities = get_chrildren_html(href,header)
dic.update({province:cities})
data_matching(dic)
def get_chrildren_html(href,header):
req = requests.get(href,headers=header)
req.encoding = "gb2312"
html = etree.HTML(req.text)
infos = html.xpath('//table[@class = "citytable"]/*') #定位表格数据
cities =[]
for info in infos:
# print(info)
city = info.xpath('./td[2]//a/text()')
if(len(city)>0):
cities.append(city[0])
return cities
四、城市&省份之间映射
没想到什么好办法,这里是通过字典遍历,查找城市所在的省份信息:
dt = pd.read_excel('E:\workhxc\study_hxc\\testdata\\airport.xlsx', sheet_name='Sheet1') #读取机场数据
dt['省份'] = dt['城市']
for k, v in dic.items(): #遍历字典
print(k,v)
dt['省份']= dt['省份'].replace(v, k)
在tableau中对“省份”和“城市”字段创建分层结构:通过地图展示数据,最后就有了这张可爱的中国地图:
最后,欢迎大家提出各种技术性建议!!共同学习!