前言:
还在一个一个的查找商家的信息以及地址,别忘记了,现在已经是信息时代了,还有什么是不能用技术解决的。
背景:有的时候我们需要批量获取这个城市某个行业的全部商家信息,以便打电话调研行业信息,一个个查询,效率太低,如果能够批量获
取商家地址和联系方式的信息会事半功倍。
实现过程:
我们先看一下全部的Python语句。
Python学习交流Q群:906715085###
import requests
import json
import pandas as pd
def request_hospital_data(ct,keywords):
ak="zCHWeNGOn0Gopj3IbbO2gGGiENRRzfnC" # 换成自己的 AK,需要申请
url = "http://api.map.baidu.com/place/v2/search?query="+keywords+"&page_size=20&scope=1®ion=" + ct + "&output=json&ak=" + ak params = {
'page_num':0} # 请求参数,页码
request = requests.get(url,params=params)
total = json.loads(request.text)['total'] # 数据的总条数
total_page_num = (total+19) // 20 # 每个页面大小是20,计算总页码 items = [] # 存放所有的记录,每一条记录是一个元素 for i in range(total_page_num):
params['page_num'] = i
request = requests.get(url,params=params)
for item in json.loads(request.text)['results']:
if "telephone" in item: #为了保证查询结果中包含电话信息
name = item['name']
telephone = item.get('telephone', '') #如果没有电话则返回默认值,即第二个参数
province = item['province']
city = item['city']
area = item['area']
address = item['address']
new_item = (name,telephone,province,city,area,address)
items.append(new_item) #使用pandas的DataFrame对象保存二维数组
df = pd.DataFrame(items, columns=['name','telephone','province','city','area','address'])
print(df)
df.to_excel("E:/公众号/地图采集/" + keywords + "_" + ct + ".xlsx")
request_hospital_data('参数一','参数二')
在实现这串代码正常运行之前,需要在百度地图开发平台(https://lbsyun.baidu.com/index.php)申请自己的AK,作用类似我们可以获取百度地图的接口。
申请步骤:
1.将上述网址复制之后,我们进入百度地图开发平台首页;
2.在搜索框(上表标红框的位置)搜索“AK”,点击第2个“获取密钥(AK)流程”,按照流程申请即可。
注意事项:
1.申请的时候需要自己的IP地址,如果不知道自己的IP地址可以直接百度“IP地址”,百度就会告知你自己的IP地址;
2.IP地址可能会变,所以不同日期的执行语句的时候,需要在设置(红框位置)修改AK的IP地址。
如果单纯使用的话,按照上文介绍的方法申请自己的AK,将语句中我的AK替换为自己的AK,更改request_hospital_data(‘参数一’,‘参数二’)
两个参数更改为自己要搜索的城市和关键词就可以运行了。
下面是对语句的详解,不感兴趣可以跳出了。
import requests # Requests是一常用的http请求库,它使用python语言编写,可以方便地发送http请求,以及方便地处理响应结果。
import json #主要用于将python对象编码为json格式输出或存储,以及将json格式对象解码为python对象。
import pandas as pd # Pandas库是Python中最流行的数据操作库。可实现基础的数据处理工作。
def #定义函数,调用函数。就是对一个新函数的自定义,有简单的函数也有复杂的函数。在一对括号中可以附上一些变量名;在行的末尾加冒号.
例如“def request_hospital_data(ct,keywords):”,我们自定义函数名request_hospital_data(ct,keywords),里面有两个参数ct,keywords,第
一个参数是城市名称,第二个参数是搜索的关键词。
这个函数的好处是可以重复调用,减少重复的代码量。
for #循环可以遍历任何序列的项目,如一个列表或者一个字符串。
在我们的实例中,有两个for语句,第一个for是对查询结果页面的循环,第二个for是对同一页面的所有查询结果的循环。
if判断语句在本例中主要是筛选出有电话信息的结果,防止对无效信息的抓取。
to_excel 是将最后的运算结果保存进Excel文件,为了方便对文件进行区分,将文件名由关键词+城市两部分组成。
写在最后
我们通过AK密钥方式访问的是百度公司给IT开发人员使用的地图,与用户使用的百度地图不是同一个地图,所以这个方法搜索出来的信息,
与直接在网页版百度地图搜索的结果有差异,批量搜索可以使用该方法,搜索结果较少时请直接使用百度地图。
直接在百度地图爬取信息难度较大,后面再和大家分享。喜欢这篇文章的小伙伴记得点赞收藏,有问题的小伙伴可以提出问题哟!!!