python selenium爬虫豆瓣_Python爬虫:学习selenium的正确方式
selenium的安裝
是不是會有很多小伙伴會認為這個安裝有必要講嗎?不就是一個pip就可以搞定嘛,當然沒有那么簡單了。
selenium是一個自動化測試工具,利用它我們可以驅動瀏覽器執行特定的動作,如點擊、下拉等操作。對于一些javascript渲染的頁面來說,這招還是很有效的。
pip 安裝
安裝方式:我推薦pip安裝
驗證安裝
進入Python命令交互模式,導入selenium包,如果沒有報錯,那么就說明安裝成功。
但是這樣還不夠,但是這樣還不夠,因為我們需要用到瀏覽器(如Chrome、Firefox)來配合selenium工作。有了瀏覽器我們才能配合selenium進行頁面抓取。
ChromeDriver的安裝
當然,首先得下載好Chrome瀏覽器,可以自行百度下載并安裝。
隨后安裝ChromeDriver。因為只有安裝了ChromeDriver之后,才能驅動Chrome瀏覽器完成相應的操作。1、準備工作
在這之前請務必確定已經安裝成功Chrome瀏覽器。
2、查看版本
點擊Chrome設置——>點擊關于Chrome,即可查看Chrome的版本。如下圖所示:
這里我的瀏覽器版本號是88.0。
請記住Chrome的版本號,因為等一下選擇ChromeDriver版本的時候需要用到。
下載ChromeDriver
環境變量配置
將剛剛下載好的驅動解壓出來,并將其放入Python的Scripts目錄下即可。如下圖所示:
驗證安裝
配置完成之后可以在命令行輸入chromedriver命令,如果輸入之后出現如下圖所示的界面,則說明環境變量配置好了。
selenium的基本使用介紹
簡單示例
那么接下來就是對上面的代碼進行簡單的分析。
selenium.webdriver提供了所有的webdriver實現,當前支持的webdriver有:Firefox、Chrome、IE和Remote。Keys類提供鍵盤支持,比如:F1、enter等等。
接下來創建一個Chrome實例
driver.get()方法將打開URL中填寫的地址,webdriver將等待,直到頁面完全加載完畢(其實是等待onload方法執行完畢),然后繼續執行腳本。值得注意的是,如果頁面使用了大量的Ajax加載,webdriver可能不知道什么時候加載完畢。
下一行使用assert的方式確認標題是否含有python一詞。當assert語句后面為False時,將會拋出異常。
同時webdriver也提供了大量的查找頁面元素的方法。,例如:find_element_by_*, *就是屬性。
接下來發送一個關鍵字,這個方法類似于使用鍵盤輸入關鍵字。特殊的按鍵可以使用Keys類來輸入,該類是繼承selenium.webdriver.common.keys,為了安全起見,需要先清除input輸入框里面的內容,避免對搜索結果存在影響。
提交頁面之后,你會得到所有的結果。為了使特定的結果被找到,使用assert如下:
最后關閉瀏覽器。值得注意的是close()方法只會關閉一個標簽,因此,可以使用quit()方法代替close()方法,quit()方法是關閉整個瀏覽器。
查找元素
在一個頁面中有很多不同的策略可以定位一個元素。在你的項目中可以選擇最合適的方法去查找元素。selenium提供的方法如下所示:find_element_by_id
find_element_by_name
find_element_by_xpath
find_element_by_link_text
find_element_by_partial_link_text
find_element_by_tag_name
find_element_by_class_name
find_element_by_css_selector
一次查找多個元素(這些元素會返回一個list列表)find_elements_by_id
find_elements_by_name
find_elements_by_xpath
find_elements_by_link_text
find_elements_by_partial_link_text
find_elements_by_tag_name
find_elements_by_class_name
find_elements_by_css_selector
等待頁面加載完成
現在大多數的web應用程序是使用Ajax技術。當一個頁面被加載到瀏覽器時,該頁面內的元素可以在不同的時間點被加載。這使得定位元素變得困難,如果元素不再頁面之中,會拋出ElementNotVisibleException 異常。使用waits,我們可以解決這個問題。waits提供了一些操作之間的間隔,主要是定位元素或針對該元素的任何操作。
selenium webdriver提供兩種等待方式,一種是顯示等待,一種是隱式等待。
顯式等待
它指定要查找的節點,然后指定一個最長的等待時間,如果規定時間內加載出來了這個節點,就返回查找的節點;如果規定時間內沒有加載出該節點,就拋出超時異常。
接下來,我們就用一個簡單的例子來表示:
首先打開京東并打開開發者工具。如下圖所示:
如上圖,我們需要尋找id為key的節點和class為button的節點。具體代碼如下所示:
接下來對上面代碼進行簡單的說明,首先引入WebDriverWait這個對象,并指定最長時間,然后調用它的until()方法,傳入要等待的條件expected_conditions,比如這里傳入了presence_of_element_located這個條件,代表節點出現的意思,其參數是節點定位的元組,也就是ID為key的搜索框。
這樣做到的效果是,在10秒如果ID為key的節點成功加載出來,就返回該節點;如果超過20秒還沒有加載出來就會拋出異常。
運行代碼之后,網速不錯的話,是可以成功加載出來的。
輸出結果如下:
可以看到,控制臺成功輸出了兩個節點,它們都是WebElement類型。
隱式等待
當使用隱式等待執行測試的時候,如果Selenium沒有在DOM中找到節點,將繼續等待,超出設定時間后,則拋出找不到節點的異常。換句話說,當查找節點而節點并沒有出現的時候,隱式等待將等待一段時間再查找DOM,默認時間是0,示例如下:
這里的implicitly_wait()方法實現了隱式等待。
隱式等待的效果其實沒有那么好,因為我們只規定了一個固定時間,而頁面的加載時間會受到網絡條件的影響。
等待條件
關于等待條件,其實還有很多,比如判斷標題內容,判斷某個節點是否出現了某文字等。具體如下表所示:
前進和后退
平常使用的瀏覽器都有前進和后退的功能,Selenium也可以完成這個操作,它使用back()方法后退,使用forward()方法前進,具體代碼如下所示:
這里我們連續訪問了三個頁面,然后調用back()方法返回第二個頁面,等待2秒之后,再次進入第三個頁面。
Cookie
使用Selenium,還可以方便的對Cookies進行操作,例如獲取、添加、刪除Cookies等。具體代碼如下所示:
在這里需要注意一點,在增加cookie的時候,長度需要與你獲取的cookie的長度相同。當全部cookie刪除的時候,獲取到的cookie就為空。
異常處理
在使用selenium的時候,難免會遇到一些異常,例如超時、節點未找到的錯誤等等。一旦出現此類錯誤,程序便無法運行下去了。這里我們可以使用try except語句來捕獲異常。
具體代碼如下所示:
這里我們使用的是try except來捕獲異常。比如,我們對find_element_by_id()查找節點的方法捕獲NoSuchElementException的異常。一旦出現了這樣的錯誤,就進行異常處理,程序就不會中斷了。
本次的分享到這里就結束了。
最后
沒有什么事情是可以一蹴而就的,生活如此,學習亦是如此。因此,哪里會有什么三天速成、七天速成的說法呢?唯有堅持,方能成功!
總結
以上是生活随笔為你收集整理的python selenium爬虫豆瓣_Python爬虫:学习selenium的正确方式的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java logic_Java Logi
- 下一篇: java线程方法_Java线程的三种方式