iT邦幫忙

2

如何用selenium載入全部的google map評論

------更新------
我剛剛用了一個超笨的方法成功了!
我先算評論的總數然後除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") #這個完全沒用,完全不會滑動

我上網查了超多資料都失敗 請問我是哪一步做錯了呢?
謝謝大家幫忙!

看更多先前的討論...收起先前的討論...
lulu_meat iT邦新手 3 級 ‧ 2021-07-28 15:28:26 檢舉
我真的完全失敗耶 記錄一下失敗的語法:
driver.execute_script("window.scrollTo(0, 1000);") -> 不會動
driver.execute_script("window.scrollTo(0, document.body.scrollHeight);") ->不會動
js="var q=document.documentElement.scrollTop=10000"
driver.execute_script(js) ->不會動
用 Google Map Place API吧
https://medium.com/front-end-augustus-study-notes/google-map-api-4-d8fba4a71e00
lulu_meat iT邦新手 3 級 ‧ 2021-07-28 16:35:30 檢舉
謝謝您! 因為需要抓的資料太大了 我又很窮 所以可能沒辦法負擔他產生的費用
因此我就沒有用 Google Map Place API試了
又由於我想抓全台灣保險業的評論資料,所以才想說用selenium最方便 可以一直自動搜尋~ 所以才會想先用selenium寫
謝謝您~
5
froce
iT邦大師 1 級 ‧ 2021-07-28 16:00:45
最佳解答

來,神奇網址。
爬蟲不要只想要用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

11到20篇 1i10
https://www.google.com.tw/maps/preview/review/listentitiesreviews?authuser=0&hl=zh-TW&gl=tw&pb=!1m2!1y3765761885276804585!2y256517638374155818!2m2!1i10!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)
看更多先前的回應...收起先前的回應...
lulu_meat iT邦新手 3 級 ‧ 2021-07-28 16:02:26 檢舉

不好意思 可以請問您那個網址是甚麼嗎? 我點開來看到一個檔案
請問我是不是點開的方式有錯誤 還是公司擋掉甚麼東西了嗎?

froce iT邦大師 1 級 ‧ 2021-07-28 16:26:50 檢舉

這網址就是你要的評論的json

lulu_meat iT邦新手 3 級 ‧ 2021-07-29 11:32:00 檢舉

謝謝您! 我剛剛終於懂怎麼用您給的連結抓資料了 但是我還要查一下要怎麼一次讓他自動往下取連結XD

froce iT邦大師 1 級 ‧ 2021-07-29 14:44:58 檢舉

後來研究了一下,並不完全是我說的那樣,有相關修改,請看正文。

lulu_meat iT邦新手 3 級 ‧ 2021-07-29 16:03:24 檢舉

不好意思>< 我剛剛執行程式不知道為甚麼評論內容無法顯示 我還在研究您的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那一行設變數 然後用迴圈控制他一直加一就可以了呢?

froce iT邦大師 1 級 ‧ 2021-07-29 16:14:54 檢舉

requests你有裝嗎?

pip install requests

連結要從瀏覽器的開發者模式(開啟頁面後按F12->網路)

lulu_meat iT邦新手 3 級 ‧ 2021-07-29 16:28:42 檢舉

真的可以了耶! 我好想哭 終於不用用難用的selenium了><
真是太感謝了!!

3
海綿寶寶
iT邦大神 1 級 ‧ 2021-07-28 16:41:32

Cue 我幹嘛
爬蟲我不會啦
/images/emoticon/emoticon18.gif

Google 到
這個人會(2021年)
這個人也會(2020年)

lulu_meat iT邦新手 3 級 ‧ 2021-07-29 09:23:36 檢舉

謝謝您的回覆! 我剛剛才發現我用selenium抓資料不是好方法XD

別這麼說
每年都有人在寫 selenium 的文章
2020
2019
2018

等著看
是否今年的鐡人賽也會有人寫 selenium/爬蟲
/images/emoticon/emoticon06.gif

froce iT邦大師 1 級 ‧ 2021-07-29 13:04:56 檢舉

爬蟲要我寫鐵人賽的話,我會寫去寫一陣子網頁你自然就會爬蟲了。XD

1
tsai_ithome
iT邦新手 5 級 ‧ 2021-08-13 17:06:27

您好~借這篇發問~
最近因為需求,想爬取GOOGLE MAP評論做分析,但依照上面listentitiesreviews方式,好像只能爬取1~10筆(也有依照上面大大提供的方式改過1i0第1~10篇評論 1i0,改為1i20就好,以此類推...目前測過最多則是199則,不知道有沒辦法抓全部評論?),
有另外再找找網路上其他爬文或GITHUB,不知道是否一定要GOOGLE MAP API才能抓全部幾百或幾千則評論?
或是還有其他方式呢?3Q
PS:我是PYTHON初學者,非常謝謝

我要發表回答

立即登入回答