------更新------
我剛剛用了一個超笨的方法成功了!
我先算評論的總數然後除10的數字,再讓迴圈跑評論的總數/10次 就可以到底了!!
不好意思打擾各位><
我想寫一個程式可以爬取某店家所有google map的評論,並存到excel裡面
但是google map的評論一次只能顯示10條
其他的評論要滑到最下面才看的到
我用selenium寫爬蟲的程式,但到了拉到評論最下方卻一直失敗
部分程式碼如下:
from selenium import webdriver
import time
from selenium.webdriver.common.by import By
options = webdriver.ChromeOptions()
prefs = {
'profile.default_content_setting_values':
{
'notifications': 2
}
}
options.add_experimental_option('prefs', prefs)
options.add_argument("disable-infobars")
driver = webdriver.Chrome(options=options)
driver.maximize_window()
driver.get("https://www.google.com.tw/maps/place/%E5%AF%8C%E9%82%A6%E7%94%A2%E9%9A%AA_%E5%85%A7%E6%B9%96%E9%80%9A%E8%A8%8A%E8%99%95/@25.0715679,121.5690505,15z/data=!4m9!1m2!2m1!1z5a-M6YKm5Lq65aO9!3m5!1s0x3442ac7b98a115e9:0x38f556ed9e9e62a!8m2!3d25.0737343!4d121.5756891!15sCgzlr4zpgqbkurrlo70iA4gBAZIBEWluc3VyYW5jZV9jb21wYW55?hl=zh-TW")
time.sleep(2)
driver.find_element_by_class_name("widget-pane-link").click()
time.sleep(2)
#pane = driver.find_element_by_xpath('//*[@id="pane"]/div/div[1]/div/div/div[2]')
#driver.execute_script("arguments[0].scrollTop = arguments[0].scrollHeight", pane) ps.這個是成功可以滑動的,但是我不知道要怎麼讓她偵測滑到最底部停止
driver.execute_script("var q=document.documentElement.scrollTop=10000") #這個完全沒用,完全不會滑動
我上網查了超多資料都失敗 請問我是哪一步做錯了呢?
謝謝大家幫忙!
來,神奇網址。
爬蟲不要只想要用selenium硬幹好嗎...
//這是錯的// 只要第一次送出get之後,後續持續送出最新的cookie就好
google的這個網址有編碼,我不知道他們用什麼編碼,但透過觀察可得
控制評論的參數是pb,用!分隔參數,其中控制頁數的參數是 1i0
第1~10篇評論 1i0
https://www.google.com.tw/maps/preview/review/listentitiesreviews?authuser=0&hl=zh-TW&gl=tw&pb=!1m2!1y3765761885276804585!2y256517638374155818!2m2!1i0!2i10!3e1!4m5!3b1!4b1!5b1!6b1!7b1!5m2!1sOw0BYfC-DvaGr7wPvJes8AM!7e81
測試過第21到30篇
改為1i20就好,以此類推
如果沒有評論,會回傳類似下面這樣的回應
)]}'
[null,null,null,null,null,[14,0,2,8,44],null,null,null,null,null,null,null,[["Google","https://www.gstatic.com/images/branding/product/1x/googleg_48dp.png",null,"google",5]]]
所以程式只要這樣寫
from requests import session
s = session()
stopRes = ")]}'\n[null,null,null,"
counter = 0
pagetext = ""
url = 'https://www.google.com.tw/maps/preview/review/listentitiesreviews?authuser=0&hl=zh-TW&gl=tw&pb=!1m2!1y3776576089817954217!2y1706015396231623092!2m2!1i{}0!2i10!3e1!4m5!3b1!4b1!5b1!6b1!7b1!5m2!1sXU8CYa6xB8mRr7wPo8uucA!7e81'
r = s.get(url.format(pagetext)).text
while r.startswith(stopRes) is not True:
counter = counter + 1
pagetext = str(counter)
r = s.get(url.format(pagetext)).text
print(r)
不好意思 可以請問您那個網址是甚麼嗎? 我點開來看到一個檔案
請問我是不是點開的方式有錯誤 還是公司擋掉甚麼東西了嗎?
這網址就是你要的評論的json
謝謝您! 我剛剛終於懂怎麼用您給的連結抓資料了 但是我還要查一下要怎麼一次讓他自動往下取連結XD
後來研究了一下,並不完全是我說的那樣,有相關修改,請看正文。
不好意思>< 我剛剛執行程式不知道為甚麼評論內容無法顯示 我還在研究您的url的那一行 有點不太懂那個連結是怎麼來的
import requests
import json
url = "https://www.google.com.tw/maps/preview/review/listentitiesreviews?authuser=0&hl=zh-TW&gl=tw&pb=!1m2!1y3765760982289754137!2y6299881497848853427!2m2!1i170!2i10!3e1!4m5!3b1!4b1!5b1!6b1!7b1!5m2!1stCUCYevsOYn30ATQsrHwBA!7e81"
text = requests.get(url).text
pretext = ')]}\''
text = text.replace(pretext,'')
soup = json.loads(text)
conlist = soup[2]
for i in conlist:
print("username:"+str(i[0][1]))
print("time:"+str(i[1]))
print("comment:"+str(i[3]))
我在想是不是把url那一行的1i170那一行設變數 然後用迴圈控制他一直加一就可以了呢?
requests你有裝嗎?
pip install requests
連結要從瀏覽器的開發者模式(開啟頁面後按F12->網路)
真的可以了耶! 我好想哭 終於不用用難用的selenium了><
真是太感謝了!!
Cue 我幹嘛
爬蟲我不會啦
Google 到
這個人會(2021年)
這個人也會(2020年)
您好~借這篇發問~
最近因為需求,想爬取GOOGLE MAP評論做分析,但依照上面listentitiesreviews方式,好像只能爬取1~10筆(也有依照上面大大提供的方式改過1i0第1~10篇評論 1i0,改為1i20就好,以此類推...目前測過最多則是199則,不知道有沒辦法抓全部評論?),
有另外再找找網路上其他爬文或GITHUB,不知道是否一定要GOOGLE MAP API才能抓全部幾百或幾千則評論?
或是還有其他方式呢?3Q
PS:我是PYTHON初學者,非常謝謝