簡單粗暴徹底解決selenium+chromedriver無法定位各種元素的方法
阿新 • • 發佈:2018-12-31
等等等!客官不要心急,等全部加載出來了就完全是你的了
經過近一週時間終於搞定了,由於ajax網頁內部非常複雜,導致爬蟲爬取的時候如果網頁內部一些元素尚未完全出現會出現各種webdriver.find_element定位不準的問題,並且由於不同的瀏覽器工作細節並不完全相同,導致使用chromedriver能定位的phantomjs不行,反之亦然,這方面是常常遇到的,看看github上coder們的困惑:
發生問題多種,比如無法找到,無法定位到,有遮罩等,其實問題就是一個,網頁還沒有完全載入完畢,下面的解答:
關於selenium 的應用,這個部落格下面還有很多相關文章不錯推薦學習。
下面是我的程式碼,一個技術小白只追求能弄出來的程式碼:
# -*- coding: utf-8 -*-
from selenium import webdriver
from selenium.webdriver.common.keys import Keys #匯入模擬點選
import re
import codecs
from time import sleep #匯入等待 無比重要的等待
browser = webdriver.Chrome() #mac系統的話chromedriver()放到 usr/local/bin/ 下面就可以 不需要禁用sip
browser.get('https://www.你的網址' )
elem = browser.find_element_by_class_name("J-search-input")
sleep(5)
elem.send_keys(u'搜尋框輸入中文')
elem.send_keys(Keys.RETURN)
sleep(5)
browser.find_element_by_partial_link_text("你要點選的").click() #用phantomjs返回找不到,應該也是網頁沒有完全載入完成導致的
print (browser.current_url)
htmlstart = browser.page_source
digurl = re.findall(r'''data-hippo-type="shop" title=(.*?)>''' ,htmlstart,re.S)
i=0
for each in digurl:
i +=1
print (each)
for j in range(0, 2):
browser.find_element_by_partial_link_text('下一頁').click()
browser.implicitly_wait(100) #隱式等待100秒,對於我這個資料愛好者來說,這個時間完全可以等
print(browser.current_url)
htmlloop = browser.page_source
digurlloop = re.findall(r'''data-hippo-type="shop" title=(.*?)>''',htmlloop,re.S)
k = 0
for each in digurlloop:
k += 1
print (each)
browser.quit() #這點比phantomjs好,因為chrome自動退出就知道執行完成了。
#上面的時間等待如果可以就直接爬到第50頁,如果被攔截,就可以點選到第10頁,第20頁這樣
summary:
open Chrome, Firefox or phantomjs and sleep for 1 minute to wait for all html loaded.
昨日執行程式碼,明明可以點選,今日又定位不到元素了,原因應該是網頁開啟之後一個活動推廣圖片蓋住元素,但是等待再久也沒用,於是換了phantomjs解決了,還是不去研究網頁自己怎麼載入的,只要網頁一改 也還要改程式碼,如果等待也還是解決不了的話,就是更換driver,driver其實很多,東方不亮西方亮