百度地图api爬虫
两年前的一个老项目了,当时有挺多人想要我帮忙爬取百度地图上的坐标等数据,决定利用百度地图的api结合tkinter写一个有GUI界面的小软件方便同学的使用。
爬虫部分
很简单,参考百度地图api的公开文档利用requests库专递参数就能返回想要的数据了
1
2
3
4
5
6
7
8def download(self):
root_dir = self.input.get() #获取需要保存文件的位置
query=self.carear.get() #选取的地理范围
#region=self.addre.get()
shen=self.shen.get() #省
shi=self.shi.get() #市
qu=self.qu.get() #区
···1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46if qu=='all': #选择 all的时候爬取分别爬取 每个区的数据
region=self.qu['value'][1:]
else:
region=[qu]
#ak=self.ak.get()
f=root_dir+'\\' +shen+shi+qu+query+'.csv'
out=open(f,'a',newline='')
csv_write=csv.writer(out,dialect='excel') #将爬取到的数据存储在csv中
for j in region:
urls=[]
addr=shen+shi+j
ak = '########' #换自己申请的ak
url1='http://api.map.baidu.com/place/v2/search?query='+query+'®ion='+addr+'&coord_type=1&page_size=20&page_num=0&output=json&ak='+ak #百度地图的api
todata=requests.get(url1)
todata=todata.json() #将返回的数据进行json格式化 后序则可以像字典一样提取返回的数据
total=todata['total']
self.info.insert('end','正在爬取'+addr+'\n')
self.info.insert('end','总计'+str(total)+'\n')
self.info.update() #刷新软件的文本显示框
for i in range(0,(int(total)%20)+1):
page_num=str(i)
url='http://api.map.baidu.com/place/v2/search?query='+query+'®ion='+addr+'&coord_type=1&page_size=20&page_num='+str(page_num)+'&output=json&ak='+ak
urls.append(url)
for url in urls:
time.sleep(2)
html=requests.get(url)#获取网页信息
data=html.json()#获取网页信息的json格式数据
for item in data['results']:
jname1 = item['province'] #返回数据中的省
jname2 = item['city'] #返回数据中的城市
jname3 = item['area'] #返回数据中的行政区
jname4 = item['name'] #返回数据中的地点名字
jname=jname2+jname3+jname4
#j_uid=item['uid']
#jstreet_id=item.get('street_id')
jlat=item['location']['lat'] #获取地点的经纬度数据
jlon=item['location']['lng']
jaddress=item['address'] #获取地点的地址
jphone=item.get('telephone') #获取地点的电话信息
j_str=(jname1,jname2,jname3,jname4,str(jlat),str(jlon),jaddress,jphone)
self.info.insert('end',str(j_str)+'\n')
#time.sleep(0.1)
self.info.update()
#print(j_str)
csv_write.writerow(j_str) #将数据逐条写入文件中
self.info.see(END)1
2
3
4import tkinter as tk
from tkinter import ttk
from tkinter import *
from tkinter.filedialog import askdirectory1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26def __init__(self):
self.window = tk.Tk() #创建window窗口
self.window.title("百度地图") # 定义窗口名称
self.window.resizable(0,0) # 禁止调整窗口大小
self.shen = ttk.Combobox(self.window,width=10) #选择框
self.shi = ttk.Combobox(self.window,width=10)
self.qu = ttk.Combobox(self.window,width=10)
self.path = StringVar() #选择保存路径的按钮
self.lab1 = tk.Label(self.window, text = "目标路径:")
self.lab2 = tk.Label(self.window, text="爬取的行业:")
self.lab3 = tk.Label(self.window, text="省/直辖市")
self.lab5=tk.Label(self.window,text="市")
self.lab6=tk.Label(self.window,text="区")
self.lab4=tk.Label(self.window,text="密码:")
self.ak=tk.Entry(self.window,width=20) #提供输入ak的输入框
self.carear= tk.Entry(self.window, width=20) #爬取关键词的输入框
self.input = tk.Entry(self.window, textvariable = self.path, width=80)
self.info = tk.Text(self.window, height=20,width=100) # 创建一个文本展示框,并设置尺寸
self.shen['value']=['北京市', '天津市', '河北省', '山西省', '内蒙古', '辽宁省', '吉林省', '黑龙江省', '上海市', '江苏省', '浙江省', '安徽省', '福建省', '江西省', '山东省', '河南省', '湖北省', '湖南省', '广东省', '广西', '海南省', '重庆市', '四川省', '贵州省', '云南省', '西藏', '陕西省', '甘肃省', '青海省', '宁夏', '新疆', '台湾省', '澳门', '香港']
# 添加一个按钮,用于选择保存路径
self.t_button = tk.Button(self.window, text='选择路径', relief=tk.RAISED, width=8, height=1, command=self.select_Path)
# 添加一个按钮,用于触发爬取功能
self.t_button1 = tk.Button(self.window, text='爬取', relief=tk.RAISED, width=8, height=1,command=lambda:self.thread_it(self.download))
# 添加一个按钮,用于触发清空输出框功能
self.c_button2 = tk.Button(self.window, text='清空输出', relief=tk.RAISED,width=8, height=1, command=self.cle)
self.stop1=tk.Button(self.window,text='停止爬取', relief=tk.RAISED,width=8, height=1, command=self.stop)1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21def gui_arrang(self):
"""完成页面元素布局,设置各部件的位置"""
self.lab1.grid(row=0,column=0,sticky=E)
self.lab2.grid(row=1, column=0,sticky=E)
self.lab3.grid(row=2, column=0,sticky=E,columnspan=1)
self.lab4.grid(row=3,column=0,sticky=E)
self.lab5.grid(row=2,column=2,sticky=W)
self.lab6.grid(row=2,column=4,sticky=W)
self.ak.grid(row=3,column=1,columnspan=2,sticky=W)
self.carear.grid(row=1,column=1,columnspan=2,sticky=W)
self.shen.grid(row=2, column=1,sticky=W)
self.shi.grid(row=2, column=3,sticky=W)
self.qu.grid(row=2, column=5,sticky=W)
self.input.grid(row=0,column=1,columnspan=8,sticky=W)
self.info.grid(row=4,rowspan=5,column=0,columnspan=10,padx=15,pady=15,sticky=W)
self.t_button.grid(row=0,column=11,padx=5,pady=5,sticky=tk.W)
self.t_button1.grid(row=1,column=12)
self.c_button2.grid(row=0,column=12,padx=5,pady=5,sticky=tk.W)
self.stop1.grid(row=3,column=12,padx=5,pady=5,sticky=tk.W)
self.shen.bind('<<ComboboxSelected>>',self.changeshi)
self.shi.bind('<<ComboboxSelected>>',self.changequ) 运行的过程
然后就能在目标路径下生产存储数据的文件了
完整项目可以到github仓库进行查看