Selenium的使用

1.初始化webdriver

from selenium importwebdriver

driver =webdriver.Chrome('./chromedriver')

driver.get("http://v.youku.com/v_show/id_XMTY2NTk5ODAwMA==.html?from=y1.3-idx-beta-1519-23042.223465.3-3")

這里需要初始化 selenium 的WebDriver, 由于我們使用的是Chrome,所以需要調(diào)用:

webdriver.Chrome('ChromeDriver的路徑')

其中,ChromeDriver的路徑如果和代碼在一起,那么就需要寫為:./chromedriver

在OS X下的這個ChromeDriver沒有后綴名,而如果大家是在Windows下面,ChromeDriver是一個exe的可執(zhí)行程序,大家就需要把 .exe 加上。另外需要特別注意斜杠的問題,在Windows下面路徑中的反斜杠需要使用特殊處理,例如:

webdriver.Chrome(r'D:\test\chromedriver.exe')

注意這里的“r”不能少。

2. 等待信息出現(xiàn)

由于被動態(tài)加載的內(nèi)容會延遲出現(xiàn),因此我們需要等待它出現(xiàn)以后才開始抓取。需要使用到WebDriverWait,By 和 expected_conditions

from selenium.webdriver.support.ui import WebDriverWait

from selenium.webdriver.common.byimportBy

from selenium.webdriver.support import expected_conditions as EC

WebDriverWait(driver, 300).until(EC.presence_of_element_located((By.CLASS_NAME, "con")))

WebDriverWait會阻塞程序的運行,并每0.5秒檢查一次網(wǎng)頁源代碼,看我們需要的內(nèi)容是否已經(jīng)出現(xiàn)。如果沒有出現(xiàn)就繼續(xù)等待。

在上面的代碼中,設(shè)定了超時時間為300秒。在300秒內(nèi),如果有某個元素出現(xiàn),那么就解除阻塞,繼續(xù)運行后面的代碼;如果等待的內(nèi)容始終不出現(xiàn),那么就會拋出一個超時的Exception。

我們來看一下:

EC.presence_of_element_located((By.CLASS_NAME, "con"))

這里的EC其實就是expected_conditions,也就是期望的條件。Python接近英語的語法讓我們可以非常輕松的看懂這一段代碼:

期望的條件.元素出現(xiàn)

而這里的元素就是一個class="con"的元素。

這里除了指定class以外,還可以指定很多其他的屬性,例如:

By.IDBy.NAMEBy.XPATH

通過元組的形式傳遞給presence_of_element_located方法。

在網(wǎng)頁中尋找我們需要的內(nèi)容,可以使用類似與Beautiful Soup4 的語法:

element= driver.find_element_by_id("passwd-id") #如果有多個符合條件的,返回第一個

element= driver.find_element_by_name("passwd") #如果有多個符合條件的,返回第一個

element_list= driver.find_elements_by_id("passwd-id") #以列表形式返回所有的符合條件的element?

element_list= driver.find_elements_by_name("passwd") #以列表形式返回所有的符合條件的element

也可以使用XPath:

element= driver.find_element_by_xpath("http://input[@id='passwd-id']")#如果有多個符合條件的,返回第一個element = driver.find_element_by_xpath("http://input[@id='passwd-id']")#以列表形式返回所有的符合條件的element

但是有一點需要特別注意:這些名字都是find_element開頭的,因此他們返回的都是element對象。這些方法他們的目的是尋找element,而不是提取里面的值。

所以當我們使用find_element_by_xpath的時候,不能使用text()這個語句。如果我們想獲取里面的文本信息,需要在獲取到element以后,再使用element.text。例如:

comment = driver.find_elements_by_xpath('//p[starts-with(@id, "content_")]')

foreachincomment:print(each.text)

更多Selenium的使用方法,可以參閱它的Python文檔:http://selenium-python.readthedocs.io/getting-started.html

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容