Python3.7爬取騰訊地圖關鍵詞位置及電話資訊
朋友創業需要拓展客戶,閒來無事幫朋友搞些資料,網上看到的全是爬取百度地圖的資料,無奈百度地圖AK一直申請不來,便摸索著做個騰訊地圖的小爬蟲,些許小感慨:資料時代,共享無限,隱私難藏啊!
實現功能
通過指定關鍵詞,自動搜尋騰訊地圖全國範圍內的相關位置及電話資訊,並將結果輸出至指定Excel檔案。
開發環境
Python 3.7,騰訊地圖AK
實現原理
首先獲取全國城市列表,並根據輸入關鍵詞,生成請求URL;通過呼叫騰訊地圖WebService API服務,對返回JSON檔案資訊進行解析,並對搜尋結果進行少選過濾,將結果寫入Excel檔案。
程式碼模組
此處程式碼僅實現基本需求,如需過程檢測或功能定製,加入相應程式碼即可。
- 去除重複電話資訊
#去除重複資料
def getDictinctData(data):
distinctdata=[]
for dt in (data):
if dt not in distinctdata:
distinctdata.append(dt)
return distinctdata
- 獲取全國城市列表
#獲取全部城市
def getAllCity(cities):
ak='申請的AK'
url='https://apis.map.qq.com/ws/district/v1/list?key='+ak
req=requests.get(url)
content=req.content
data=json.loads(content)
#將城市列表存入list
#返回的result資訊中有三個元素,第一個為省份,第二個為市級,第三個為區縣
for i in range(len(data['result'][1])):
cities.append(data['result'][1][i]['name'])
- 篩選電話中手機號
#過濾電話:篩選規則為11位數字且不含'-'字元
def getPhoneNumber(tel):
phonenumber=''
#切分電話字串,逐個判斷電話還是手機
for i in range(len(tel.split(';'))):
if (len(tel.split(';')[i])==11):
if not ('-' in tel.split(';')[i]):
phonenumber=phonenumber+tel.split(';')[i]+'\n'
return phonenumber.strip()#去除尾行換行符
寫入Excel表格檔案
#資料寫入Excel
def writeData2Excel(filename,tbname,data):
#將Excel檔案生成至當前檔案同級的result目錄下
if not os.path.exists(os.getcwd()+'/result'):
os.mkdir(os.getcwd()+'/result')
#生成Excel檔案
file=Workbook(encoding = 'utf-8')
tb=file.add_sheet(tbname)
#設定自動換行
style=easyxf('align:wrap on')
#寫入首行標題
tb.write(0,0,'序號')
tb.write(0,1,'地點')
tb.write(0,2,'具體地址')
tb.write(0,3,'聯絡電話')
tb.write(0,4,'省份')
tb.write(0,5,'城市')
tb.write(0,6,'區縣')
#將資料寫入對應列
for i in range(len(data)):
tb.write(i+1,0,i+1)
tb.write(i+1,1,data[i][0],style)
tb.write(i+1,2,data[i][1],style)
tb.write(i+1,3,data[i][2],style)
tb.write(i+1,4,data[i][3],style)
tb.write(i+1,5,data[i][4],style)
tb.write(i+1,6,data[i][5],style)
#設定相應列寬
tb.col(0).width=2000
tb.col(1).width=5000
tb.col(2).width=20000
tb.col(3).width=5000
tb.col(4).width=5000
tb.col(5).width=5000
tb.col(6).width=5000
#輸出Excel檔案
file.save(os.getcwd()+'/result/'+filename+'.xls')
- 獲取位置資訊並輸出
#獲取全國含關鍵詞的地址及電話
ak='申請的AK'
methods=['search']#使用位置搜尋
keywords=['酒店']#搜尋關鍵詞列表
filters=['tel<>null']#過濾掉沒有電話的結果
page_size='20'#搜尋結果每頁數量
regions=[]#搜尋範圍
querydata=[]#查詢結果
page_count=20
page_index='1'#預設展示搜尋結果頁
#獲取全國城市列表
getAllCity(regions)
#遍歷關鍵詞及城市
for i in range(len(keywords)):
for j in range(len(regions)):
url='https://apis.map.qq.com/ws/place/v1/'+methods[0]+'?boundary=region('+regions[j]+')&keyword='+keywords[i]+'&filter='+filters[0]+'&page_size='+page_size+'&page_index='+str(page_index)+'&key='+ak
req=requests.get(url)
content=req.content
data=json.loads(content)
#將首頁查詢結果存入
if ('data' in data):
for k in range(len(data['data'])):
if(getPhoneNumber(data['data'][k]['tel'])!=''):
querydata.append([data['data'][k]['title'],\
data['data'][k]['address'],\
getPhoneNumber(data['data'][k]['tel']),\
data['data'][k]['ad_info']['province'],\
data['data'][k]['ad_info']['city'],\
data['data'][k]['ad_info']['district']])
#遍歷全部頁面結果存入
if ('count' in data):
page_count=int(int(data['count'])/20)
for x in range(2,page_count):
url='https://apis.map.qq.com/ws/place/v1/'+methods[0]+'?boundary=region('+regions[j]+')&keyword='+keywords[i]+'&filter='+filters[0]+'&page_size='+page_size+'&page_index='+str(x)+'&key='+ak
req=requests.get(url)
content=req.content
data=json.loads(content)
if ('data' in data):
for m in range(len(data['data'])):
if(getPhoneNumber(data['data'][m]['tel'])!=''):
querydata.append([data['data'][m]['title'],\
data['data'][m]['address'],\
getPhoneNumber(data['data'][m]['tel']),\
data['data'][m]['ad_info']['province'],\
data['data'][m]['ad_info']['city'],\
data['data'][m]['ad_info']['district']])
#將結果寫入Excel表中
writeData2Excel(keywords[i],'data',getDictinctData(querydata))
print("Serach finished .")
原始碼下載:https://github.com/Angryshark128/Python.git