前言
上一關(guān),我們認(rèn)識(shí)了cookies和session。
分別學(xué)習(xí)了它們的用法,以及區(qū)別。
還做了一個(gè)項(xiàng)目:帶著小餅干登錄,然后在博客中發(fā)表評(píng)論。
除了上一關(guān)所講的登錄問(wèn)題,在爬蟲(chóng)過(guò)程中,我們還可能會(huì)遇到各種各樣棘手的問(wèn)題——
有的網(wǎng)站登錄很復(fù)雜,驗(yàn)證碼難以破解,比如大名鼎鼎的12306。
有的網(wǎng)站頁(yè)面交互復(fù)雜,所使用的技術(shù)難以被爬取,比如,騰訊文檔。
還有的網(wǎng)站,對(duì)URL的加密邏輯很復(fù)雜,比如,第4關(guān)爬過(guò)的QQ音樂(lè)歌曲評(píng)論,URL的參數(shù)變量找起來(lái)挺費(fèi)勁的。
以上這些情況,想要攻破這些網(wǎng)站的反爬蟲(chóng)技術(shù)會(huì)有一些難度。
不過(guò),你也不用擔(dān)心,在本關(guān),我將為你傳授一個(gè)終極武器——selenium,通過(guò)它,可以解決以上所有問(wèn)題。
selenium是什么
selenium是什么呢?它是一個(gè)強(qiáng)大的Python庫(kù)。
它可以做什么呢?它可以用幾行代碼,控制瀏覽器,做出自動(dòng)打開(kāi)、輸入、點(diǎn)擊等操作,就像是有一個(gè)真正的用戶在操作一樣。
來(lái)看一小段錄屏吧,文字在視頻面前會(huì)顯得蒼白。
這就是我用selenium寫(xiě)的腳本,讓瀏覽器自動(dòng)打開(kāi)網(wǎng)頁(yè),然后輸入文字,點(diǎn)擊提交按鈕。這里用到的代碼我都會(huì)在后面講到。
這里要表?yè)P(yáng)一個(gè)我之前教過(guò)的用戶,他們公司內(nèi)網(wǎng)的登錄和操作很繁瑣,登錄之后的操作又機(jī)械重復(fù),他學(xué)會(huì)了selenium之后,就去寫(xiě)了一個(gè)Python程序。
他每天上班的第一件事,就是打開(kāi)電腦運(yùn)行自己寫(xiě)的腳本,讓瀏覽器自動(dòng)打開(kāi)公司內(nèi)網(wǎng)完成登錄,那些重復(fù)的工作也緊跟著一起完成。而他自己,則是坐在那里悠閑地喝茶。
selenium能控制瀏覽器,這對(duì)解決我們剛剛提出的那幾個(gè)問(wèn)題,有什么幫助呢?
首先,當(dāng)你遇到驗(yàn)證碼很復(fù)雜的網(wǎng)站時(shí),selenium允許讓人去手動(dòng)輸入驗(yàn)證碼,然后把剩下的操作交給機(jī)器。
而對(duì)于那些交互復(fù)雜、加密復(fù)雜的網(wǎng)站,selenium問(wèn)題簡(jiǎn)化,爬動(dòng)態(tài)網(wǎng)頁(yè)如爬靜態(tài)網(wǎng)頁(yè)一樣簡(jiǎn)單。
什么是動(dòng)態(tài)網(wǎng)頁(yè),什么又是靜態(tài)網(wǎng)頁(yè)呢?其實(shí)兩種網(wǎng)頁(yè)你都已經(jīng)接觸過(guò)了。
第2關(guān)教你用html寫(xiě)出的網(wǎng)頁(yè),就是靜態(tài)網(wǎng)頁(yè)。我們使用BeautifulSoup爬取這類型網(wǎng)頁(yè),因?yàn)榫W(wǎng)頁(yè)源代碼中就包含著網(wǎng)頁(yè)的所有信息,因此,網(wǎng)頁(yè)地址欄的URL就是網(wǎng)頁(yè)源代碼的URL。
后來(lái),你開(kāi)始接觸更復(fù)雜的網(wǎng)頁(yè),比如QQ音樂(lè),要爬取的數(shù)據(jù)不在HTML源代碼中,而是在json中,你就不能直接使用網(wǎng)址欄的URL了,而需要找到j(luò)son數(shù)據(jù)的真實(shí)URL。這就是一種動(dòng)態(tài)網(wǎng)頁(yè)。
不論數(shù)據(jù)存在哪里,瀏覽器總是在向服務(wù)器發(fā)起各式各樣的請(qǐng)求,當(dāng)這些請(qǐng)求完成后,它們會(huì)一起組成開(kāi)發(fā)者工具的Elements中所展示的,渲染完成的網(wǎng)頁(yè)源代碼。
在遇到頁(yè)面交互復(fù)雜或是URL加密邏輯復(fù)雜的情況時(shí),selenium就派上了用場(chǎng),它可以真實(shí)地打開(kāi)一個(gè)瀏覽器,等待所有數(shù)據(jù)都加載到Elements中之后,再把這個(gè)網(wǎng)頁(yè)當(dāng)做靜態(tài)網(wǎng)頁(yè)爬取就好了。
說(shuō)了這么多優(yōu)點(diǎn),使用selenium時(shí),當(dāng)然也有美中不足之處。
由于要真實(shí)地運(yùn)行本地瀏覽器,打開(kāi)瀏覽器以及等待網(wǎng)渲染完成需要一些時(shí)間,selenium的工作不可避免地犧牲了速度和更多資源,不過(guò),至少不會(huì)比人慢。
知道了它的優(yōu)缺點(diǎn),我們就開(kāi)始學(xué)習(xí)如何使用selenium吧。
怎么用
首先,和其它所有Python庫(kù)一樣,selenium需要安裝,方法也很簡(jiǎn)單, 使用pip安裝。
pip install selenium # Windows電腦安裝selenium
pip3 install selenium # Mac電腦安裝selenium
selenium的腳本可以控制所有常見(jiàn)瀏覽器的操作,在使用之前,需要安裝瀏覽器的驅(qū)動(dòng)。
我推薦的是Chrome瀏覽器,打開(kāi)下面的鏈接,就可以下載Chrome的安裝包了,Windows和Mac都有。
https://localprod.pandateacher.com/python-manuscript/crawler-html/chromedriver/ChromeDriver.html
我強(qiáng)烈建議你現(xiàn)在立刻馬上就下載它,并且在自己的電腦中安裝好瀏覽器驅(qū)動(dòng),因?yàn)檫@個(gè)關(guān)卡比較特別,需要你邊學(xué)習(xí),邊在本地環(huán)境中運(yùn)行代碼。
這是因?yàn)椋抑荒苡靡恍﹦?dòng)圖為你展示它的運(yùn)行效果。
由此造成的影響是,在學(xué)習(xí)本關(guān)的內(nèi)容時(shí),如果你想更直觀地看到瀏覽器的操作過(guò)程,就要在本地電腦中運(yùn)行腳本。
在正式開(kāi)始知識(shí)的講解之前,我想首先讓你體驗(yàn)一下selenium腳本程序在你的本地終端運(yùn)行的效果。因?yàn)樵趯W(xué)習(xí)selenium之初,如果能親自看到瀏覽器自動(dòng)彈出后的操作效果,對(duì)你后續(xù)的學(xué)習(xí)會(huì)有很大幫助。
下面的代碼就是本節(jié)課開(kāi)頭動(dòng)圖的代碼。你現(xiàn)在不需要去理解具體的意思,等會(huì)兒就會(huì)學(xué)到每一行的用法。
現(xiàn)在只需要把這段代碼復(fù)制到本地的代碼編輯器中運(yùn)行,體驗(yàn)一下你的瀏覽器為你自動(dòng)工作的效果。當(dāng)然,前提是你已經(jīng)安裝好了selenium庫(kù)以及Chrome瀏覽器驅(qū)動(dòng)。
# 本地Chrome瀏覽器設(shè)置方法
from selenium import webdriver
import time
driver = webdriver.Chrome()
driver.get('https://localprod.pandateacher.com/python-manuscript/hello-spiderman/')
time.sleep(4)
teacher = driver.find_element_by_id('teacher')
teacher.send_keys('必須是吳楓呀')
assistant = driver.find_element_by_name('assistant')
assistant.send_keys('都喜歡')
time.sleep(1)
button = driver.find_element_by_class_name('sub')
time.sleep(1)
button.click()
time.sleep(1)
driver.close()
除了看程序運(yùn)行,不如手動(dòng)打開(kāi)這個(gè)網(wǎng)站看看,做一遍和程序中一樣的操作,URL給你:
https://localprod.pandateacher.com/python-manuscript/hello-spiderman/
首先引入眼簾的是【你好,蜘蛛俠!】幾個(gè)大字,一秒之后,它會(huì)自動(dòng)跳轉(zhuǎn)到一個(gè)新的頁(yè)面,請(qǐng)你輸入最喜歡的老師和助教,你點(diǎn)擊提交之后,它又會(huì)跳轉(zhuǎn)到Python之禪的中英對(duì)照頁(yè)面。
仔細(xì)看,你會(huì)發(fā)現(xiàn),在這個(gè)過(guò)程中,網(wǎng)頁(yè)URL一直沒(méi)有變化,可見(jiàn)【你好,蜘蛛俠!】是個(gè)動(dòng)態(tài)網(wǎng)頁(yè)。
體驗(yàn)了selenium之后,我們接下來(lái)正式開(kāi)始代碼的講解。
設(shè)置瀏覽器引擎
和以前一樣,使用一個(gè)新的Python庫(kù),首先要調(diào)用它。selenium有點(diǎn)不同,除了調(diào)用,還需要設(shè)置瀏覽器引擎。
# 本地Chrome瀏覽器設(shè)置方法
from selenium import webdriver #從selenium庫(kù)中調(diào)用webdriver模塊
driver = webdriver.Chrome() # 設(shè)置引擎為Chrome,真實(shí)地打開(kāi)一個(gè)Chrome瀏覽器
以上就是瀏覽器的設(shè)置方式:把Chrome瀏覽器設(shè)置為引擎,然后賦值給變量driver。driver是實(shí)例化的瀏覽器,在后面你會(huì)總是能看到它的影子,這也可以理解,因?yàn)槲覀円刂七@個(gè)實(shí)例化的瀏覽器為我們做一些事情。
配置好了瀏覽器,就可以開(kāi)始讓它幫我們干活啦!
接下來(lái),我們學(xué)習(xí)selenium的具體用法,這個(gè)部分的知識(shí)講解,都會(huì)以你已經(jīng)見(jiàn)到好幾次的,【你好蜘蛛俠!】這個(gè)網(wǎng)站為例:
https://localprod.pandateacher.com/python-manuscript/hello-spiderman/
我們還是按照爬蟲(chóng)四步來(lái)講解selenium的用法,看看selenium如何獲取、解析與提取數(shù)據(jù)。由于本關(guān)中提取出的數(shù)據(jù)都不太復(fù)雜,直接在終端打印就好,不會(huì)涉及到儲(chǔ)存數(shù)據(jù)這一步。
獲取數(shù)據(jù)
首先看一下獲取數(shù)據(jù)的代碼怎么寫(xiě)吧。
import time
# 本地Chrome瀏覽器設(shè)置方法
from selenium import webdriver #從selenium庫(kù)中調(diào)用webdriver模塊
driver = webdriver.Chrome() # 設(shè)置引擎為Chrome,真實(shí)地打開(kāi)一個(gè)Chrome瀏覽器
driver.get('https://localprod.pandateacher.com/python-manuscript/hello-spiderman/') # 打開(kāi)網(wǎng)頁(yè)
time.sleep(1)
driver.close() # 關(guān)閉瀏覽器
前面三行代碼都是你學(xué)過(guò)的,調(diào)用模塊,并且設(shè)置瀏覽器,只有后兩行代碼是新的。
get(URL)是webdriver的一個(gè)方法,它的使命是為你打開(kāi)指定URL的網(wǎng)頁(yè)。
剛才說(shuō)過(guò)driver在這里是一個(gè)實(shí)例化的瀏覽器,因此,就是通過(guò)這個(gè)瀏覽器打開(kāi)網(wǎng)頁(yè)。
當(dāng)一個(gè)網(wǎng)頁(yè)被打開(kāi),網(wǎng)頁(yè)中的數(shù)據(jù)就加載到了瀏覽器中,也就是說(shuō),數(shù)據(jù)被我們獲取到了。
driver.close()是關(guān)閉瀏覽器驅(qū)動(dòng),每次調(diào)用了webdriver之后,都要在用完它之后加上一行driver.close()用來(lái)關(guān)閉它。
就像是,每次打開(kāi)冰箱門(mén),把東西放進(jìn)去之后,都要記得關(guān)上門(mén),使用selenium調(diào)用了瀏覽器之后也要記得關(guān)閉瀏覽器。
把上面的代碼復(fù)制粘貼在你的本地電腦中運(yùn)行,你可以看到,一個(gè)瀏覽器自動(dòng)啟動(dòng),并為你打開(kāi)一個(gè)網(wǎng)頁(yè),停留一秒之后,瀏覽器關(guān)閉。
下一步,我們要讓瀏覽器解析并提取數(shù)據(jù),然后打印出來(lái),讓我們看到返回的運(yùn)行結(jié)果。
解析與提取數(shù)據(jù)
我們?cè)谇懊婊▋蓚€(gè)關(guān)卡學(xué)習(xí)了使用BeautifulSoup解析網(wǎng)頁(yè)源代碼,然后提取其中的數(shù)據(jù)。
selenium庫(kù)同樣也具備解析數(shù)據(jù)、提取數(shù)據(jù)的能力。它和BeautifulSoup的底層原理一致,但在一些細(xì)節(jié)和語(yǔ)法上有所出入。
首先明顯的一個(gè)不同即是:selenium所解析提取的,是Elements中的所有數(shù)據(jù),而B(niǎo)eautifulSoup所解析的則只是Network中第0個(gè)請(qǐng)求的響應(yīng)。
本關(guān)開(kāi)頭我說(shuō)過(guò),用selenium把網(wǎng)頁(yè)打開(kāi),所有信息就都加載到了Elements那里,之后,就可以把動(dòng)態(tài)網(wǎng)頁(yè)用靜態(tài)網(wǎng)頁(yè)的方法爬取了。
selenium是如何解析與提取數(shù)據(jù)的呢?我們現(xiàn)在來(lái)試試提取【你好蜘蛛俠!】網(wǎng)頁(yè)中,<label>
元素的內(nèi)容吧。
代碼我寫(xiě)好了,你可以運(yùn)行看看吧!提示:如果出現(xiàn)參考代碼運(yùn)行報(bào)錯(cuò)請(qǐng)復(fù)制后自己修改運(yùn)行!
from selenium import webdriver # 從selenium庫(kù)中調(diào)用webdriver模塊
from bs4 import BeautifulSoup # 調(diào)用BeautifulSoup庫(kù)
import time
chrome_options = webdriver.ChromeOptions() # 實(shí)例化Option對(duì)象
chrome_options.add_argument('--headless') # 對(duì)瀏覽器的設(shè)置
driver = webdriver.Chrome(options=chrome_options) # 聲明瀏覽器對(duì)象
driver.get('https://localprod.pandateacher.com/python-manuscript/hello-spiderman/') # 訪問(wèn)頁(yè)面
time.sleep(2) # 等待2秒
label = driver.find_element_by_tag_name('label') # 解析網(wǎng)頁(yè)并提取第一個(gè)<label>標(biāo)簽
print(label.text) # 打印label的文本
driver.close() # 關(guān)閉瀏覽器
輸出結(jié)果:
(提示:吳楓)
從運(yùn)行結(jié)果中可以看到,我們提取出了<label>
(提示:吳楓)</label>
中的文本(提示:吳楓)。
上面這段代碼只有最后幾行代碼是新增的,第11行:等待2秒;第12行:然后解析網(wǎng)頁(yè)并提取網(wǎng)頁(yè)中第一個(gè)<label>
標(biāo)簽;第13行:打印label的文本內(nèi)容。
用time.sleep(3)等待三秒,是由于瀏覽器緩沖加載網(wǎng)頁(yè)需要耗費(fèi)一些時(shí)間,以及我在這個(gè)網(wǎng)頁(yè)中設(shè)置了一秒之后才從首頁(yè)跳轉(zhuǎn)到輸入頁(yè)面,所以,等待三秒再去解析和提取比較穩(wěn)妥。
這樣來(lái)看,解析與提取數(shù)據(jù),在這里其實(shí)只用了一行代碼:
label = driver.find_element_by_tag_name('label') # 解析網(wǎng)頁(yè)并提取第一個(gè)<label>標(biāo)簽中的文字
你能否看出,是哪部分在做解析,哪部分在做提取?
先回想下,使用BeautifulSoup解析提取數(shù)據(jù)時(shí),首先要把Response對(duì)象解析為BeautifulSoup對(duì)象,然后再?gòu)闹刑崛?shù)據(jù)。
而在selenium中,獲取到的網(wǎng)頁(yè)存在了driver中,而后,解析與提取是同時(shí)做的,都是由driver這個(gè)實(shí)例化的瀏覽器完成。
所以,上個(gè)問(wèn)題的答案是:解析數(shù)據(jù)是由driver自動(dòng)完成的,提取數(shù)據(jù)是driver的一個(gè)方法。
清楚了解析與提取的本質(zhì),我們接下來(lái)詳細(xì)講解析數(shù)據(jù)的方法。
selenium當(dāng)然不光能通過(guò)標(biāo)簽來(lái)提取數(shù)據(jù),還有很多查找和提取元素的方法,都是非常直截了當(dāng)?shù)姆椒ā?/p>
你可以看出,提取數(shù)據(jù)的方法都是英文直譯的意思。舉例給你看看它們的用法,請(qǐng)仔細(xì)閱讀下面代碼的注釋:
# 以下方法都可以從網(wǎng)頁(yè)中提取出'你好,蜘蛛俠!'這段文字
find_element_by_tag_name:通過(guò)元素的名稱選擇
# 如<h1>你好,蜘蛛俠!</h1>
# 可以使用find_element_by_tag_name('h1')
find_element_by_class_name:通過(guò)元素的class屬性選擇
# 如<h1 class="title">你好,蜘蛛俠!</h1>
# 可以使用find_element_by_class_name('title')
find_element_by_id:通過(guò)元素的id選擇
# 如<h1 id="title">你好,蜘蛛俠!</h1>
# 可以使用find_element_by_id('title')
find_element_by_name:通過(guò)元素的name屬性選擇
# 如<h1 name="hello">你好,蜘蛛俠!</h1>
# 可以使用find_element_by_name('hello')
#以下兩個(gè)方法可以提取出超鏈接
find_element_by_link_text:通過(guò)鏈接文本獲取超鏈接
# 如<a href="spidermen.html">你好,蜘蛛俠!</a>
# 可以使用find_element_by_link_text('你好,蜘蛛俠!')
find_element_by_partial_link_text:通過(guò)鏈接的部分文本獲取超鏈接
# 如<a >你好,蜘蛛俠!</a>
# 可以使用find_element_by_partial_link_text('你好')
以上就是提取單個(gè)元素的方法了。
那么,我們提取出的元素是什么類呢?這種對(duì)象有什么屬性和方法呢?我們現(xiàn)在就來(lái)看看。請(qǐng)閱讀下面的代碼,然后點(diǎn)擊運(yùn)行:
from selenium import webdriver # 從selenium庫(kù)中調(diào)用webdriver模塊
from bs4 import BeautifulSoup # 調(diào)用BeautifulSoup庫(kù)
import time
options = webdriver.ChromeOptions()
options.add_argument('--headless') # 開(kāi)啟無(wú)頭模式
chrome_options = webdriver.ChromeOptions() # 實(shí)例化Option對(duì)象
chrome_options.add_argument('--headless') # 對(duì)瀏覽器的設(shè)置
driver = webdriver.Chrome(options=chrome_options) # 聲明瀏覽器對(duì)象
driver.get('https://localprod.pandateacher.com/python-manuscript/hello-spiderman/') # 訪問(wèn)頁(yè)面
time.sleep(2) # 等待2秒
label = driver.find_element_by_tag_name('label') # 解析網(wǎng)頁(yè)并提取第一個(gè)<label>標(biāo)簽中的文字
print(type(label)) # 打印label的數(shù)據(jù)類型
print(label.text) # 打印label的文本
print(label) # 打印label
driver.close() # 關(guān)閉瀏覽器
運(yùn)行結(jié)果:
<class 'selenium.webdriver.remote.webelement.WebElement'>
(提示:吳楓)
<selenium.webdriver.remote.webelement.WebElement (session="6d400c6ad6f0aa4f5a241b4332ea0c4c", element="0.9387651316030954-1")>
運(yùn)行結(jié)果有3行
可見(jiàn),提取出的數(shù)據(jù)屬于WebElement類對(duì)象,如果直接打印它,返回的是一串對(duì)它的描述。
而它與BeautifulSoup中的Tag對(duì)象類似,也有一個(gè)屬性.text,可以把提取出的元素用字符串格式顯示。
還想補(bǔ)充的是,WebElement類對(duì)象與Tag對(duì)象類似,它也有一個(gè)方法,可以通過(guò)屬性名提取屬性的值,這個(gè)方法是.get_attribute()。
我們來(lái)舉個(gè)例子:
我們?cè)囋?,通過(guò)class="teacher"定位到上圖中標(biāo)亮的元素,然后提取出type這個(gè)屬性的值text。
from selenium import webdriver # 從selenium庫(kù)中調(diào)用webdriver模塊
from bs4 import BeautifulSoup # 調(diào)用BeautifulSoup庫(kù)
import time
options = webdriver.ChromeOptions()
options.add_argument('--headless') # 開(kāi)啟無(wú)頭模式
chrome_options = webdriver.ChromeOptions() # 實(shí)例化Option對(duì)象
chrome_options.add_argument('--headless') # 對(duì)瀏覽器的設(shè)置
driver = webdriver.Chrome(options=chrome_options) # 聲明瀏覽器對(duì)象
driver.get('https://localprod.pandateacher.com/python-manuscript/hello-spiderman/') # 訪問(wèn)頁(yè)面
time.sleep(2) # 等待2秒
label = driver.find_element_by_class_name('teacher') # 根據(jù)類名找到元素
print(type(label)) # 打印label的數(shù)據(jù)類型
print(label.get_attribute('type')) # 獲取type這個(gè)屬性的值
driver.close() # 關(guān)閉瀏覽器
運(yùn)行結(jié)果:
<class 'selenium.webdriver.remote.webelement.WebElement'>
text
因此,我們可以總結(jié)出,selenium解析與提取數(shù)據(jù)的過(guò)程中,我們操作的對(duì)象轉(zhuǎn)換:
剛才,我們做的都是提取出網(wǎng)頁(yè)中的第一個(gè)符合要求的數(shù)據(jù),接下來(lái),我們就看看提取多個(gè)元素的方法吧。
find_element_by_與BeautifulSoup中的find類似,可以提取出網(wǎng)頁(yè)中第一個(gè)符合要求的元素;既然BeautifulSoup有提取所有元素的方法find_all,selenium也同樣有方法。
方法也一樣很簡(jiǎn)單,把剛才的element換成復(fù)數(shù)elements就好了。
我們來(lái)試試提取出【你好,蜘蛛俠!】的所有l(wèi)abel標(biāo)簽中的文字。
from selenium import webdriver # 從selenium庫(kù)中調(diào)用webdriver模塊
from bs4 import BeautifulSoup # 調(diào)用BeautifulSoup庫(kù)
import time
options = webdriver.ChromeOptions()
options.add_argument('--headless') # 開(kāi)啟無(wú)頭模式
chrome_options = webdriver.ChromeOptions() # 實(shí)例化Option對(duì)象
chrome_options.add_argument('--headless') # 對(duì)瀏覽器的設(shè)置
driver = webdriver.Chrome(options=chrome_options) # 聲明瀏覽器對(duì)象
driver.get('https://localprod.pandateacher.com/python-manuscript/hello-spiderman/') # 訪問(wèn)頁(yè)面
time.sleep(2) # 等待2秒
labels = driver.find_elements_by_tag_name('label') # 根據(jù)標(biāo)簽名提取所有元素
print(type(labels)) # 打印labels的數(shù)據(jù)類型
print(labels) # 打印labels
driver.close() # 關(guān)閉瀏覽器
運(yùn)行結(jié)果:
<class 'list'>
[<selenium.webdriver.remote.webelement.WebElement (session="87d373c4e7a09aef4dd31f5940f8cf84", element="0.794826797904179-1")>, <selenium.webdriver.remote.webelement.WebElement (session="87d373c4e7a09aef4dd31f5940f8cf84", element="0.794826797904179-2")>]
從運(yùn)行結(jié)果可以看到,提取出的是一個(gè)列表,<class ‘list’>。而列表的內(nèi)容就是WebElements對(duì)象,這些符號(hào)是對(duì)象的描述,我們剛才學(xué)過(guò),需要用.text才能返回它的文本內(nèi)容。
既然得到了列表,就可以和find_all返回的結(jié)果類似,同樣用for循環(huán)遍歷列表就可以提取出列表中的每一個(gè)值了。
那么,請(qǐng)你寫(xiě)一下這個(gè)代碼吧:
參考代碼:
labels=driver.find_elements_by_tag_name('label')
for i in labels:
print(i.text)
以上就是selenium的解析與提取數(shù)據(jù)的方法了。
除了用selenium解析與提取數(shù)據(jù),還有一種解決方案,那就是,使用selenium獲取網(wǎng)頁(yè),然后交給BeautifulSoup解析和提取。
接下來(lái),我們就看看,selenium與BeautifulSoup如何快樂(lè)地合作。
我們回顧一下BeautifulSoup的工作方式吧。
BeautifulSoup需要把字符串格式的網(wǎng)頁(yè)源代碼解析為BeautifulSoup對(duì)象,然后再?gòu)闹刑崛?shù)據(jù)。
selenium剛好可以獲取到渲染完整的網(wǎng)頁(yè)源代碼。
如何獲取呢?也是使用driver的一個(gè)方法:page_source。
HTML源代碼字符串 = driver.page_source
我們現(xiàn)在就來(lái)實(shí)操一下,獲取【你好,蜘蛛俠!】的網(wǎng)頁(yè)源代碼:
from selenium import webdriver # 從selenium庫(kù)中調(diào)用webdriver模塊
from bs4 import BeautifulSoup # 調(diào)用BeautifulSoup庫(kù)
import time
options = webdriver.ChromeOptions()
options.add_argument('--headless') # 開(kāi)啟無(wú)頭模式
chrome_options = webdriver.ChromeOptions() # 實(shí)例化Option對(duì)象
chrome_options.add_argument('--headless') # 對(duì)瀏覽器的設(shè)置
driver = webdriver.Chrome(options=chrome_options) # 聲明瀏覽器對(duì)象
driver.get('https://localprod.pandateacher.com/python-manuscript/hello-spiderman/') # 訪問(wèn)頁(yè)面
time.sleep(2) # 等待2秒
pageSource = driver.page_source # 獲取完整渲染的網(wǎng)頁(yè)源代碼
print(type(pageSource)) # 打印pageSource的類型
print(pageSource) # 打印pageSource
driver.close() # 關(guān)閉瀏覽器
我們成功獲取并打印出了網(wǎng)頁(yè)源代碼O(∩_∩)O~~而且它的數(shù)據(jù)類型是<class 'str'>
。
你還記不記得,用requests.get()獲取到的是Response對(duì)象,在交給BeautifulSoup解析之前,需要用到.text的方法才能將Response對(duì)象的內(nèi)容以字符串的形式返回。
而使用selenium獲取到的網(wǎng)頁(yè)源代碼,本身已經(jīng)是字符串了。
獲取到了字符串格式的網(wǎng)頁(yè)源代碼之后,就可以用BeautifulSoup解析和提取數(shù)據(jù)了,這是我留給你的一個(gè)課后作業(yè)。
到這里,解析與提取數(shù)據(jù)的方法就講解完了。
關(guān)于selenium的用法,還有什么沒(méi)有講呢?對(duì)!就是我們?cè)诒娟P(guān)開(kāi)頭演示的功能,控制瀏覽器自動(dòng)輸入文本,并且點(diǎn)擊提交。
網(wǎng)頁(yè)URL再給你一次:
https://localprod.pandateacher.com/python-manuscript/hello-spiderman/
我現(xiàn)在就為你解開(kāi)這個(gè)謎底。
自動(dòng)操作瀏覽器
其實(shí),要做到上面動(dòng)圖中顯示的效果,你只需要新學(xué)兩個(gè)方法就好了:
.send_keys() # 模擬按鍵輸入,自動(dòng)填寫(xiě)表單
.click() # 點(diǎn)擊元素
用這兩行代碼,再搭配剛才所講的解析提取數(shù)據(jù)的方法,就可以完成操作瀏覽器的效果了。
學(xué)到這里,我們就可以寫(xiě)下全部代碼了,這也正是我在開(kāi)頭給你的,讓你復(fù)制到本地運(yùn)行過(guò)的代碼。
# 本地Chrome瀏覽器設(shè)置方法
from selenium import webdriver # 從selenium庫(kù)中調(diào)用webdriver模塊
import time # 調(diào)用time模塊
driver = webdriver.Chrome() # 設(shè)置引擎為Chrome,真實(shí)地打開(kāi)一個(gè)Chrome瀏覽器
driver.get('https://localprod.pandateacher.com/python-manuscript/hello-spiderman/') # 訪問(wèn)頁(yè)面
time.sleep(3) # 暫停三秒,等待瀏覽器緩沖
teacher = driver.find_element_by_id('teacher') # 找到【請(qǐng)輸入你喜歡的老師】下面的輸入框位置
teacher.send_keys('必須是吳楓呀') # 輸入文字
assistant = driver.find_element_by_name('assistant') # 找到【請(qǐng)輸入你喜歡的助教】下面的輸入框位置
assistant.send_keys('都喜歡') # 輸入文字
button = driver.find_element_by_class_name('sub') # 找到【提交】按鈕
button.click() # 點(diǎn)擊【提交】按鈕
time.sleep(1)
driver.close() # 關(guān)閉瀏覽器
由于這個(gè)代碼的命令都是控制瀏覽器做一些操作,因此終端不會(huì)返回任何結(jié)果。
你在抄寫(xiě)的時(shí)候,有沒(méi)有發(fā)現(xiàn),最后的6行代碼是兩兩對(duì)應(yīng)的,在每一次輸入和點(diǎn)擊之前,都要先定位到對(duì)應(yīng)的位置,查找定位用的方法就是前面學(xué)過(guò)的,解析與提取數(shù)據(jù)的方法。
比如,在輸入你喜歡的老師之前,首先要在網(wǎng)頁(yè)源代碼中找到輸入框的位置,方法還是我們之前學(xué)過(guò)的方法,點(diǎn)擊開(kāi)發(fā)者工具左上角的小箭頭,然后把鼠標(biāo)放在網(wǎng)頁(yè)的空格處。
從網(wǎng)頁(yè)源代碼可以看出,可以根據(jù)id=“teacher”,或者class="teacher"查找定位到這里。
把提取到的位置信息賦值給teacher,然后再用teacher.send_keys()的方法輸入你想填到這個(gè)空里的文本。
這樣就完成了一個(gè)完整的操作,后面的兩個(gè)操作,方法都是類似的。由此,整個(gè)代碼也就寫(xiě)出來(lái)了。
還想補(bǔ)充一個(gè)小知識(shí),除了輸入和點(diǎn)擊的兩個(gè)方法,經(jīng)常配合它們會(huì)用到的,還有一個(gè)方法.clear(),用于清除元素的內(nèi)容。
假如,在剛才的空格中,已經(jīng)輸入了【蜘蛛俠】,如果你想改成【吳楓】,就需要先用.clear()清除掉【蜘蛛俠】這幾個(gè)文字,再填寫(xiě)新的文字。
到這里,本關(guān)知識(shí)講解的部分就全部完成了,我們接下來(lái)一起做一個(gè)項(xiàng)目吧~
每次學(xué)到新知識(shí),都要及時(shí)通過(guò)實(shí)操練習(xí),鞏固所學(xué)的知識(shí),這樣才能對(duì)知識(shí)形成更深的理解和記憶。
實(shí)操運(yùn)用
確認(rèn)目標(biāo)
我們這次試試用selenium爬取QQ音樂(lè)的歌曲評(píng)論,我選的歌是《甜甜的》。
https://y.qq.com/n/yqq/song/000xdZuV2LcQ19.html
不知道你還有沒(méi)有印象,在第5關(guān)學(xué)json時(shí),爬過(guò)QQ音樂(lè)的歌曲最新評(píng)論,我們這次來(lái)爬精彩評(píng)論,兩種評(píng)論的爬取方法本質(zhì)是一樣的。
現(xiàn)在帶你用selenium再做一次之前做過(guò)的項(xiàng)目,當(dāng)然不是我偷懶拍腦袋的決定,而是經(jīng)過(guò)了深思熟慮,因?yàn)椋粋€(gè)項(xiàng)目可以做兩次,甚至可以做很多次。
使用不同的路徑,到達(dá)相同的目的,這種學(xué)習(xí)和訓(xùn)練方法,會(huì)幫你把知識(shí)搞得更加透徹。
確認(rèn)了目標(biāo),我們就開(kāi)始行動(dòng)吧!照舊,在寫(xiě)代碼之前,要先分析思路。
分析過(guò)程
依舊按照爬蟲(chóng)的四個(gè)步驟來(lái)分析。
首先是獲取數(shù)據(jù):
通過(guò)第5關(guān)的學(xué)習(xí),你已經(jīng)知道,網(wǎng)頁(yè)源代碼中沒(méi)有我們想要的評(píng)論,而是存在了Json中,需要通過(guò)查看XHR,找到每一頁(yè)評(píng)論的Json數(shù)據(jù)真實(shí)URL,才能獲取到數(shù)據(jù)。
我們這次是用selenium,就不需要花費(fèi)精力去查找和破解URL了,因?yàn)?,通過(guò)selenium打開(kāi)瀏覽器的操作,數(shù)據(jù)就被加載到elements中了。
獲取更多的評(píng)論的方法,也變得非常簡(jiǎn)單,直接使用selenium控制瀏覽器點(diǎn)擊【點(diǎn)擊加載更多】的按鈕,評(píng)論數(shù)據(jù)自然就都加載到elements中了,簡(jiǎn)直完美:
接下來(lái)是解析與提取數(shù)據(jù):
第一種解決思路是使用selenium提取數(shù)據(jù)的方法。
第二種解決思路是,先獲取到完整網(wǎng)頁(yè)源代碼,然后用BeautifulSoup抓取。這兩種方法都能完成解析提取的工作。
最后的存儲(chǔ)數(shù)據(jù)這一步我們跳過(guò)不做了,直接在終端打印。
梳理清楚了全部過(guò)程,就可以開(kāi)始寫(xiě)!代!碼!啦!
代碼實(shí)現(xiàn)
首先,調(diào)用所有需要的模塊,設(shè)置好Chrome瀏覽器引擎,訪問(wèn)網(wǎng)頁(yè),獲取數(shù)據(jù)。
from selenium import webdriver # 從selenium庫(kù)中調(diào)用webdriver模塊
from bs4 import BeautifulSoup # 調(diào)用BeautifulSoup庫(kù)
options = webdriver.ChromeOptions()
options.add_argument('--headless') # 開(kāi)啟無(wú)頭模式
chrome_options = webdriver.ChromeOptions() # 實(shí)例化Option對(duì)象
chrome_options.add_argument('--headless') # 對(duì)瀏覽器的設(shè)置
driver = webdriver.Chrome(options=chrome_options) # 聲明瀏覽器對(duì)象
driver.get('https://y.qq.com/n/yqq/song/000xdZuV2LcQ19.html') # 訪問(wèn)頁(yè)面
然后,用selenium的解析提取方法,獲取歌曲評(píng)論并打印。
需要注意的是,在獲取到網(wǎng)頁(yè)之后,解析與提取之前,要加上time.sleep(2),因?yàn)榫W(wǎng)頁(yè)的加載需要零點(diǎn)幾秒的時(shí)間,保險(xiǎn)起見(jiàn),我們等待2秒。
提取數(shù)據(jù)的時(shí)候,首先需要知道數(shù)據(jù)存在了網(wǎng)頁(yè)的什么位置,還是老辦法,【右鍵-檢查】,把鼠標(biāo)放在歌曲精彩評(píng)論那里,找到Elements中對(duì)應(yīng)的位置:
這里要注意的是,這個(gè)網(wǎng)頁(yè)源代碼中,評(píng)論所在的元素中,class屬性就有好多個(gè),而使用selenium時(shí),只能用其中一個(gè)屬性來(lái)提取數(shù)據(jù)。
通過(guò)分析網(wǎng)頁(yè)結(jié)構(gòu),我們選擇用class_name與tag_name來(lái)提取數(shù)據(jù)。獲取這首歌曲第一頁(yè)精彩評(píng)論的代碼就可以寫(xiě)出來(lái)了:
from selenium import webdriver # 從selenium庫(kù)中調(diào)用webdriver模塊
from bs4 import BeautifulSoup # 調(diào)用BeautifulSoup庫(kù)
import time
options = webdriver.ChromeOptions()
options.add_argument('--headless') # 開(kāi)啟無(wú)頭模式
chrome_options = webdriver.ChromeOptions() # 實(shí)例化Option對(duì)象
chrome_options.add_argument('--headless') # 對(duì)瀏覽器的設(shè)置
driver = webdriver.Chrome(options=chrome_options) # 聲明瀏覽器對(duì)象
driver.get('https://y.qq.com/n/yqq/song/000xdZuV2LcQ19.html') # 訪問(wèn)頁(yè)面
time.sleep(2)
comments = driver.find_element_by_class_name('js_hot_list').find_elements_by_class_name('js_cmt_li') # 使用class_name找到評(píng)論
print(len(comments)) # 打印獲取到的評(píng)論個(gè)數(shù)
for comment in comments: # 循環(huán)
sweet = comment.find_element_by_tag_name('p') # 找到評(píng)論
print ('評(píng)論:%s\n ---\n'%sweet.text) # 打印評(píng)論
driver.close() # 關(guān)閉瀏覽器
運(yùn)行結(jié)果:
15
評(píng)論:想起那晚我在你耳邊輕輕的的說(shuō)愛(ài)你,你一臉害羞的看著我并且點(diǎn)點(diǎn)頭,你此時(shí)此刻的笑像夾心餅干,雙手捂著嘴,而你的臉龐笑的卻如此可愛(ài),這或許就是戀愛(ài)最甜甜的趣事吧 Jay在錄制這一首歌的時(shí)候,就考慮到這歌曲風(fēng)格甜美是否適合自己以往的演唱,但想到這首歌能表達(dá)出Jay對(duì)學(xué)生時(shí)代那種單純感覺(jué)的懷念,于是造就了現(xiàn)在的經(jīng)典 那一晚過(guò)后,我們的每次相約,你的眼中只有我,望著我的樣子眼神中充滿滿滿寵溺,我用擁抱給了你一切的回應(yīng) 我喜歡的樣子你都有
---
評(píng)論:我想留著西瓜最中間的一勺,摻雜著巧克力屑的奶油蛋糕,草莓曲奇的第一口,雙皮奶的最上層,偷喝妹妹奶粉的最后一口,所有我見(jiàn)過(guò)最甜蜜的。卻沒(méi)有甜過(guò)有我所有喜歡的樣子的你,你眼中的只有最喜歡你的我。
---
評(píng)論:這首一定是婚禮必備。這首歌里最喜歡的歌詞是“啾!”,告訴我不止我一個(gè)人
---
評(píng)論:我也超喜歡杰倫這首《甜甜的》!從高中聽(tīng)到結(jié)婚生子!依舊沒(méi)有改變那種甜甜的旋律!
---
評(píng)論:第一次實(shí)在廣告里面聽(tīng)的,然后就開(kāi)始找啊找,找的好辛苦啊。。。。一聽(tīng)鐘情!
---
評(píng)論:這首甜甜的 滿滿的都是中學(xué)時(shí)代的回憶。 那時(shí)候還很懵懂,那時(shí)候還不懂什么是愛(ài)情,就是喜歡某個(gè)女生 喜歡和她一起的那個(gè)時(shí)光, 午后的操場(chǎng) 六樓的鋼琴室 學(xué)校周邊的街道 … 如今再也回不去了,但是這首歌里滿滿的都是回憶。
---
評(píng)論:聽(tīng)到這首歌想起了初中的時(shí)候,每個(gè)人心中都住著那么一個(gè)人,不是愛(ài),也不是喜歡,但是每次見(jiàn)到哪怕是提到他的名字就會(huì)怦然心動(dòng)的感覺(jué),要怪就怪當(dāng)時(shí)沒(méi)有提起勇氣告訴他,也許有些人就是用來(lái)懷念的
---
評(píng)論:這首歌?。≌娴某措u炒雞甜!炒雞甜!甜到掉牙!好了,我要去看書(shū)了
---
評(píng)論:劉霞,你在哪里。我為你跑了很遠(yuǎn)很遠(yuǎn)。我知道你喜歡周董,希望你能看到。我相信緣分,,,,
---
評(píng)論:歌如其名,如果你有心上人,大概會(huì)不自主的想到ta吧?嘴角一定也是上揚(yáng)露出笑容,因?yàn)?,我喜歡的樣子你都有~
---
評(píng)論:聽(tīng)到這首歌想起了初中的時(shí)候,每個(gè)人心中都住著那么一個(gè)人,不是愛(ài),是喜歡,但是每次見(jiàn)到哪怕是提到她的名字就會(huì)怦然心動(dòng)的感覺(jué),要怪就怪當(dāng)時(shí)沒(méi)有提起勇氣告訴她,也許有些人就是用來(lái)懷念的
---
評(píng)論:早晨領(lǐng)份狗糧去上課那句「啾」真的萌爆了以前竟然都沒(méi)注意過(guò),這也是首適合告白的歌
---
評(píng)論:又啥都沒(méi)干聽(tīng)了兩小時(shí)周杰倫了…
---
評(píng)論:明明很煽情卻一點(diǎn)都沒(méi)有膩的感覺(jué),這就是周董的實(shí)力吧!聽(tīng)到廣告就覺(jué)得很海森!大愛(ài)!
---
評(píng)論:如果用周杰倫的歌代表我對(duì)感情的認(rèn)知,應(yīng)該是從情竇初開(kāi)的<簡(jiǎn)單愛(ài)>到熱戀期的<甜甜的>,倆個(gè)人的世界滿滿的好<星晴>,然而異地戀開(kāi)始了,我們中間隔了一片<珊瑚海>。最后我選擇了<退后>,失去了關(guān)于你的<軌跡>,但我承認(rèn)這一切都是我的錯(cuò),是我<擱淺>了我們之間的感情。再后來(lái)我們失去了聯(lián)系,而<一路向北>也成了我的單曲循環(huán)。
---
這次提取出了15個(gè)評(píng)論,下一步,我們要獲取更多評(píng)論。點(diǎn)擊網(wǎng)頁(yè)中的【點(diǎn)擊加載更多】,就會(huì)加載出新的15個(gè)評(píng)論的數(shù)據(jù)。
這時(shí)候,寫(xiě)代碼的方法就很明朗了,首先找到【點(diǎn)擊加載更多】在網(wǎng)頁(yè)源代碼中的位置,點(diǎn)擊它,等待源代碼加載完成之后就可以把全部30個(gè)評(píng)論提取出來(lái)了。
請(qǐng)你嘗試把后面的補(bǔ)全吧:
參考代碼:
from selenium import webdriver # 從selenium庫(kù)中調(diào)用webdriver模塊
from bs4 import BeautifulSoup # 調(diào)用BeautifulSoup庫(kù)
import time
options = webdriver.ChromeOptions()
options.add_argument('--headless') # 開(kāi)啟無(wú)頭模式
chrome_options = webdriver.ChromeOptions() # 實(shí)例化Option對(duì)象
chrome_options.add_argument('--headless') # 對(duì)瀏覽器的設(shè)置
driver = webdriver.Chrome(options=chrome_options) # 聲明瀏覽器對(duì)象
driver.get('https://y.qq.com/n/yqq/song/000xdZuV2LcQ19.html') # 訪問(wèn)頁(yè)面
time.sleep(2)
loadmore=driver.find_element_by_class_name('comment__show_all').find_element_by_tag_name('a')
loadmore.click()
time.sleep(2)
comments = driver.find_element_by_class_name('js_hot_list').find_elements_by_class_name('js_cmt_li')
for i in comments:
txt=i.find_element_by_tag_name('p')
print(txt.text)
成功獲取到了兩頁(yè)的評(píng)論,掌聲給你~
如果你還想獲取更多評(píng)論,再加上一個(gè)循環(huán),和一個(gè)條件判斷——能否找到點(diǎn)擊翻頁(yè)的選項(xiàng),就可以實(shí)現(xiàn)啦。代碼我在這里就不寫(xiě)了,你可以自己在課后練習(xí),練習(xí)的目的是學(xué)會(huì)方法,而沒(méi)有必要真的把上千條評(píng)論全部獲取到。
剛才用的是第一種解析與提取的方法,當(dāng)然還可以使用第二種方法:selenium和BeautifulSoup結(jié)合。
先用selenium獲取完整的網(wǎng)頁(yè)源代碼,然后使用你已經(jīng)熟悉的BeautifulSoup解析和提取數(shù)據(jù)。
代碼我寫(xiě)好了,和剛才的區(qū)別就是最后幾行代碼:
from selenium import webdriver # 從selenium庫(kù)中調(diào)用webdriver模塊
from bs4 import BeautifulSoup # 調(diào)用BeautifulSoup庫(kù)
import time
options = webdriver.ChromeOptions()
options.add_argument('--headless') # 開(kāi)啟無(wú)頭模式
chrome_options = webdriver.ChromeOptions() # 實(shí)例化Option對(duì)象
chrome_options.add_argument('--headless') # 對(duì)瀏覽器的設(shè)置
driver = webdriver.Chrome(options=chrome_options) # 聲明瀏覽器對(duì)象
driver.get('https://y.qq.com/n/yqq/song/000xdZuV2LcQ19.html') # 訪問(wèn)頁(yè)面
time.sleep(2)
button = driver.find_element_by_class_name('js_get_more_hot') # 根據(jù)類名找到【點(diǎn)擊加載更多】
button.click() # 點(diǎn)擊
time.sleep(2) # 等待兩秒
pageSource = driver.page_source # 獲取Elements中渲染完成的網(wǎng)頁(yè)源代碼
soup = BeautifulSoup(pageSource,'html.parser') # 使用bs解析網(wǎng)頁(yè)
comments = soup.find('ul',class_='js_hot_list').find_all('li',class_='js_cmt_li') # 使用bs提取元素
print(len(comments)) # 打印comments的數(shù)量
for comment in comments: # 循環(huán)
sweet = comment.find('p') # 提取評(píng)論
print ('評(píng)論:%s\n ---\n'%sweet.text) # 打印評(píng)論
driver.close() # 關(guān)閉瀏覽器 # 關(guān)閉瀏覽器
到這里,代碼就全部寫(xiě)完了。
我們用了與第5關(guān)不同的方法,完成了相同的項(xiàng)目。而且,在解析與提取數(shù)據(jù)的時(shí)候,也采用了兩種方法去實(shí)現(xiàn)。
學(xué)會(huì)了這么多種方法,以后再遇到類似問(wèn)題,就可以根據(jù)實(shí)際情況來(lái)評(píng)估,用哪些方法可以實(shí)現(xiàn),然后挑選其中一種方法去做項(xiàng)目了。
本關(guān)總結(jié)
感謝努力的你,學(xué)完了全部知識(shí),還做了項(xiàng)目,我們現(xiàn)在又到了關(guān)卡快要結(jié)束的時(shí)刻了。
在這一關(guān),我教你安裝了selenium與Chrome驅(qū)動(dòng),然后介紹了瀏覽器的設(shè)置方法:
# 本地Chrome瀏覽器的可視模式設(shè)置:
from selenium import webdriver #從selenium庫(kù)中調(diào)用webdriver模塊
driver = webdriver.Chrome() # 設(shè)置引擎為Chrome,真實(shí)地打開(kāi)一個(gè)Chrome瀏覽器
這種設(shè)置方法可以讓你看到瀏覽器的操作過(guò)程。我想在這里補(bǔ)充的是,在本地的操作環(huán)境中,你還可以把自己電腦中的Chrome瀏覽器設(shè)置為靜默模式,也就是說(shuō),讓瀏覽器只是在后臺(tái)運(yùn)行,并不在電腦中打開(kāi)它的可視界面。
因?yàn)樵谧雠老x(chóng)時(shí),通常不需要打開(kāi)瀏覽器,爬蟲(chóng)的目的是爬到數(shù)據(jù),而不是觀看瀏覽器的操作過(guò)程,在這種情況下,就可以使用瀏覽器的靜默模式,
它的設(shè)置方法是這樣的:
# 本地Chrome瀏覽器的靜默模式設(shè)置:
from selenium import webdriver #從selenium庫(kù)中調(diào)用webdriver模塊
from selenium.webdriver.chrome.options import Options # 從options模塊中調(diào)用Options類
chrome_options = Options() # 實(shí)例化Option對(duì)象
chrome_options.add_argument('--headless') # 把Chrome瀏覽器設(shè)置為靜默模式
driver = webdriver.Chrome(options = chrome_options) # 設(shè)置引擎為Chrome,在后臺(tái)默默運(yùn)行
與上面瀏覽器的可視設(shè)置相比,3、5、6行代碼是新增的,首先調(diào)用了一個(gè)新的類——Options,然后通過(guò)它的方法和屬性,給瀏覽器輸入了一個(gè)參數(shù)——headless。第7行代碼中,把剛才所做的瀏覽器設(shè)置傳給了Chrome瀏覽器。
瀏覽器的可視模式與靜默模式的設(shè)置,就是以上四行代碼的區(qū)別。你懂的,這之后所有代碼都是一樣的。
囑咐好了所有要講給你的知識(shí),那就繼續(xù)每一關(guān)結(jié)尾例行的總結(jié)吧~
我們剛才學(xué)習(xí)了使用selenium獲取數(shù)據(jù)的方法:.get(‘URL’)。
解析與提取數(shù)據(jù)的方法:
以及在這個(gè)過(guò)程中,對(duì)象的轉(zhuǎn)換過(guò)程:
除了上面的方法,selenium還可以搭配BeautifulSoup解析提取數(shù)據(jù),前提是先獲取字符串格式的網(wǎng)頁(yè)源代碼。
HTML源代碼字符串 = driver.page_source
以及自動(dòng)操作瀏覽器的一些方法。
還有,在用完瀏覽器之后,要記得關(guān)閉它,以免資源浪費(fèi),在代碼的結(jié)尾處加一行driver.close()就好。
到這里,你應(yīng)該能感受到,Selenium是一個(gè)強(qiáng)大的網(wǎng)絡(luò)數(shù)據(jù)采集工具,它的優(yōu)勢(shì)是簡(jiǎn)單直觀,而它當(dāng)然也有缺點(diǎn)。
由于是真實(shí)地模擬人操作瀏覽器,需要等待網(wǎng)頁(yè)緩沖的時(shí)間,在爬取大量數(shù)據(jù)的時(shí)候,速度會(huì)比較慢。
通常情況,在爬蟲(chóng)項(xiàng)目中,selenium都是用在其它方法無(wú)法解決,或是很難解決的問(wèn)題時(shí),才會(huì)用到。
當(dāng)然,除了爬蟲(chóng),selenium的使用場(chǎng)景還有很多。比如:它可以控制網(wǎng)頁(yè)中圖片文件的顯示、控制CSS和JavaScript的加載與執(zhí)行等等。
我們的課程只是帶你入門(mén),講了一些簡(jiǎn)單常用的操作,還想進(jìn)一步學(xué)習(xí)的話,可以通過(guò)selenium的官方文檔鏈,目前只有英文版:
https://seleniumhq.github.io/selenium/docs/api/py/api.html
還可以參考這個(gè)中文文檔:
https://selenium-python-zh.readthedocs.io/en/latest/文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-689875.html
下一關(guān),我們還會(huì)講一個(gè)實(shí)用的方法,定時(shí)與通知,期待與你相見(jiàn)!文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-689875.html
到了這里,關(guān)于【python爬蟲(chóng)】10.指揮瀏覽器自動(dòng)工作(selenium)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!