iT邦幫忙

0

google map 爬蟲

大家好,小弟用下方API成功爬到google的商家評論,但只有一間門市,而且每次都要改url,想詢問怎麼一次爬完所有分店(以麥當勞為例的話),另外這個API要錢嗎(覺得怕)

import requests
from bs4 import BeautifulSoup
import time #for sleep 禮貌
import json
import pandas as pd
import numpy as np
from datetime import datetime

'預設1500篇'
null = np.nan #將api裡的null變成nan,不然會報錯
final = []
end = 0
i = 0
while end == 0: #判斷何時停止
    if i%5 == 0 : print(i,end='->')
     url ='https://www.google.com.tw/maps/preview/review/listentitiesreviews?authuser=0&hl=zh-TW&gl=tw&pb=!1m2!1y3765757233225575679!2y9104663542408472851!2m2!1i'+str(i*10)+'!2i10!3e2!4m5!3b1!4b1!5b1!6b1!7b1!5m2!1scXLQYLygDom2mAW94IjYBw!7e81'
    # 留言處> F12> network> 滑動看新增甚麼> url複製過來> 3e1改3e2> li拆兩段
    print(url) # chk 搜尋會下載個txt檔
    req_text = requests.get(url)
    res = eval(req_text.text.replace(')]}\'\n','')) #整理一下
    if type(res[2]) == float: #評論資訊是nan就停止,代表沒留言了
        print('stop')
        end = 1 
    else:
        for data in res[2]: #評論資訊都在這
            res_dict = {}
            for j in range(len(data)):
                res_dict[j] = data[j]
                res_dict['scrap_time'] = datetime.now().strftime("%Y/%m/%d %H:%M:%S")
            final.append(res_dict)      
    i+=1    
    if i > 150: #避免無線迴圈,要爬多少則留言(留言數 = i*10)
        end = 1
    time.sleep(.5) #禮貌啦哪次不禮貌

# print(final)

df = pd.DataFrame(final)

#將epoch time轉成時間 (建議用df apply但我不會...QQ)
arr = []
for i in range(len(df)):
    arr.append(time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(int(round(df[27][i]/1000)))))

df['post_time'] = arr

new_df = df[[0,3,4,10,11,12,14,16,18,27,30,32,39,'post_time','scrap_time']] 
#篩選重要欄位
new_df_columns = ['用戶資料', '留言內容', '評分', '某id1', '某id2',
                  '用戶資訊詳細','圖片資訊詳細', '讚數', '圖片清單連結', 
                  '貼文epoch時間','恩災(感覺重要)', '語言','恩災2',
                  '貼文時間','爬蟲時間'] #欄位重新命名
new_df.columns = new_df_columns

new_df

new_df.to_csv('D:/Gmap爬蟲檔案範例.csv',encoding="utf-8-sig")

尚未有邦友回答

立即登入回答