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