1. 程式人生 > >Python3.7爬取騰訊地圖關鍵詞位置及電話資訊

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