iT邦幫忙

1

Pytho Selenium 爬蟲問題

  • 分享至 

  • xImage

各位大大好,最近練習網頁爬蟲中,有一個我平常反覆做的事情想拿來試試
就是看廣告抽獎,從登入帳號到點選廣告開始播放都已經寫好了可以順利運行。
但是有一個問題是廣告看完後要點選X關閉廣告(如圖)
https://ithelp.ithome.com.tw/upload/images/20220203/201446152TBt91PhL2.png
那我用F12查看它的網頁標籤發現它是一個img src 沒有其他標籤可以供我選取了。我就用xpath的方式來抓
https://ithelp.ithome.com.tw/upload/images/20220203/20144615wpa1QW9ZvK.png
抓到的路徑為/html/body/div/img[3]
完整輸入進python裡面就是
driver.find_element_by_xpath("/html/body/div/img[3]").click()
卻顯示NoSuchElementException錯誤
不知道是哪邊設定錯了,還是我用XPATH抓取的方法有誤
是否有解決方法呢

https://ithelp.ithome.com.tw/upload/images/20220203/20144615XSYHhq7qUq.png

這樣看不太出來是不是xpath的問題,能把詳細F12的內容截圖上來或貼上來嗎?
888god888 iT邦新手 5 級 ‧ 2022-02-03 23:17:01 檢舉
已貼但不是全部只有片段,因為全部太多了也不好閱讀
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中
0
jiatool
iT邦研究生 2 級 ‧ 2022-02-04 18:32:08
最佳解答

哈哈
我也有做這個XD

"點選X關閉廣告"的部分我 CSS Selectors 是這樣寫,給你參考:

'#google-rewarded-video > img:nth-child(4), ' +
'#close_button #close_button_icon, ' +
'.videoAdUiSkipButtonExperimentalText'

但因為它廣告其實有幾種不同的版面,所以我上面的寫法有時候還是會沒成功。
(也要注意上面網友提到的 sleep)

補充:
可能跟你想問的有關,網頁它是使用 iframe 標籤來內嵌廣告,所以要先 switch_to.frame() 切換到 iframe 內,才能定位到裡面的元素。
參考:https://stackoverflow.com/questions/44834358

看更多先前的回應...收起先前的回應...
jiatool iT邦研究生 2 級 ‧ 2022-02-04 18:39:45 檢舉

提醒~
有些新商品第一次看廣告前會需要回答問題(只有第一次),不然無法觀看廣告,目前我是自己手動點啦XD

888god888 iT邦新手 5 級 ‧ 2022-02-05 19:17:03 檢舉

感覺你跟我試的網站根本一樣XD 我改成CSS SELECTOR方法試試

888god888 iT邦新手 5 級 ‧ 2022-02-05 19:17:43 檢舉

回答問題我還沒去研究 目前也是先自己點XD

888god888 iT邦新手 5 級 ‧ 2022-02-05 19:23:16 檢舉

然後他有時候廣告會有不一樣多跳一個要確認的視窗那種,我還要研究怎麼應付這種情形哈哈哈

jiatool iT邦研究生 2 級 ‧ 2022-02-06 10:17:48 檢舉

你也是巴哈的,對吧XD

是指"繼續有聲播放"這種嗎?
我是用

.videoAdUi .rewardDialogueWrapper:last-of-type .rewardResumebutton

像是 5 秒內沒抓到此 CSS 就跳過 (因為其他廣告沒有這個確認視窗)

jiatool iT邦研究生 2 級 ‧ 2022-02-06 10:25:57 檢舉

啊 對了
可能跟你想問的有關,它是使用 iframe 標籤來內嵌廣告,所以要先 switch_to.frame() 切換到 iframe 內,才能定位到裡面的元素。
https://stackoverflow.com/questions/44834358

888god888 iT邦新手 5 級 ‧ 2022-02-06 21:38:39 檢舉

我加入這幾串代碼
iframe=driver.find_element_by_xpath('//iframe[@id="google-rewarded-video"]/img[3]')

abc=driver.switch_to.frame(iframe)

abc.click()

這樣寫對嗎,還是報錯

jiatool iT邦研究生 2 級 ‧ 2022-02-08 06:40:44 檢舉

你要先定位的 iframe 元素就好

大概是以下這種感覺:
你現在在門外,看不到房子內的東西,
所以要先定位到門(iframe),進去(switch_to)後,才能找到關閉廣告的元素(類似我的那串CSS Selectors)

888god888 iT邦新手 5 級 ‧ 2022-02-09 09:33:22 檢舉

好,我朝那方向試試

0
camelcheng
iT邦新手 4 級 ‧ 2022-02-04 00:15:52

我覺得可能的原因是,點擊的元件的時候,網頁的廣告還沒長出來,看要不要做個等待的動作或用sleep幾秒先看看點不點的到。
另外xpath我推薦可以寫成 //div[@id='google-rewarded-vedio']/img[3],先試試看有問題再討論!

888god888 iT邦新手 5 級 ‧ 2022-02-04 03:01:32 檢舉

本來有設定time.sleep(5)了 還試試看更極端等到20秒還是沒有成功,
改成driver.find_element_by_xpath("//div[@id='google-rewarded-vedio']/img[3]").click()
仍然顯示NoSuchElementException錯誤,是有打錯嗎

會不會是按了play後前端代碼有改變,或是有其他隱藏視窗?

888god888 iT邦新手 5 級 ‧ 2022-02-05 19:13:35 檢舉

我是在廣告PLAY中跟PALY完都抓一次XPATH路徑 都一樣

0
huahualiu
iT邦新手 2 級 ‧ 2022-02-04 10:31:49

你可以試試看在 devtool 中對著你的目標物件 【右鍵】>【Copy】>【Copy Xpath】來抓他的絕對路徑,自己寫有時候可能中間會漏節點,導致 Selenium 在抓的時候判斷錯誤
https://ithelp.ithome.com.tw/upload/images/20220204/20110872sI71DYzI8a.png

看更多先前的回應...收起先前的回應...
huahualiu iT邦新手 2 級 ‧ 2022-02-04 10:33:51 檢舉

然後先在不隱藏 Chrome Driver 的情況下測試看看是否有上面幾位大大提到的 AD 還沒跳出的情況。

或者就是在 Exception 出現的時候,用 Chrome Driver 開 Dev Tool 來找找看該物件是不是真的沒出現

888god888 iT邦新手 5 級 ‧ 2022-02-05 19:16:10 檢舉

XPATH有分成完整路徑跟一般路徑
我抓一般路徑是
//*[@id="google-rewarded-video"]/img[3]
完整路徑是
/html/body/div/img[3]
同樣貼到
driver.find_element_by_xpath("")裡面一般路徑會Invaild syntax
所以我都貼完整路徑就不會顯示了,但是會有NosuchElement error
是不能這樣貼嗎

888god888 iT邦新手 5 級 ‧ 2022-02-05 19:29:31 檢舉

我路徑都是用DEV TOOL抓的 自己不會抓哈哈

huahualiu iT邦新手 2 級 ‧ 2022-02-05 21:54:36 檢舉

會 Invalid Syntax 應該是因為 Function 跟 xpath 都有 雙引號導致的吧?
把 driver.find_element_by_xpath("") 改成 driver.find_element_by_xpath('') 試試看 ?

888god888 iT邦新手 5 級 ‧ 2022-02-06 01:06:49 檢舉
  • 改成單引號沒有Invalid Syntax 錯誤了但是一樣有NosuchElement錯誤,當下用DEV TOOL看也是有那個元素,猜想是不是因為這本來是一個圖片所以不能支援點擊的動作呢

我要發表回答

立即登入回答