国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【python爬蟲(chóng)】10.指揮瀏覽器自動(dòng)工作(selenium)

這篇具有很好參考價(jià)值的文章主要介紹了【python爬蟲(chóng)】10.指揮瀏覽器自動(dòng)工作(selenium)。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

前言

上一關(guān),我們認(rèn)識(shí)了cookies和session。
分別學(xué)習(xí)了它們的用法,以及區(qū)別。
【python爬蟲(chóng)】10.指揮瀏覽器自動(dòng)工作(selenium),python,爬蟲(chóng),selenium
【python爬蟲(chóng)】10.指揮瀏覽器自動(dòng)工作(selenium),python,爬蟲(chóng),selenium
還做了一個(gè)項(xiàng)目:帶著小餅干登錄,然后在博客中發(fā)表評(píng)論。

除了上一關(guān)所講的登錄問(wèn)題,在爬蟲(chóng)過(guò)程中,我們還可能會(huì)遇到各種各樣棘手的問(wèn)題——

有的網(wǎng)站登錄很復(fù)雜,驗(yàn)證碼難以破解,比如大名鼎鼎的12306。

【python爬蟲(chóng)】10.指揮瀏覽器自動(dòng)工作(selenium),python,爬蟲(chóng),selenium
有的網(wǎng)站頁(yè)面交互復(fù)雜,所使用的技術(shù)難以被爬取,比如,騰訊文檔。

【python爬蟲(chóng)】10.指揮瀏覽器自動(dòng)工作(selenium),python,爬蟲(chóng),selenium
還有的網(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ì)顯得蒼白。

【python爬蟲(chóng)】10.指揮瀏覽器自動(dòng)工作(selenium),python,爬蟲(chóng),selenium
這就是我用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。

【python爬蟲(chóng)】10.指揮瀏覽器自動(dòng)工作(selenium),python,爬蟲(chóng),selenium

后來(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è)。

【python爬蟲(chóng)】10.指揮瀏覽器自動(dòng)工作(selenium),python,爬蟲(chóng),selenium
不論數(shù)據(jù)存在哪里,瀏覽器總是在向服務(wù)器發(fā)起各式各樣的請(qǐng)求,當(dāng)這些請(qǐng)求完成后,它們會(huì)一起組成開(kāi)發(fā)者工具的Elements中所展示的,渲染完成的網(wǎng)頁(yè)源代碼。

【python爬蟲(chóng)】10.指揮瀏覽器自動(dòng)工作(selenium),python,爬蟲(chóng),selenium
在遇到頁(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ù)這一步。

【python爬蟲(chóng)】10.指揮瀏覽器自動(dòng)工作(selenium),python,爬蟲(chóng),selenium

獲取數(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)閉。

【python爬蟲(chóng)】10.指揮瀏覽器自動(dòng)工作(selenium),python,爬蟲(chóng),selenium
下一步,我們要讓瀏覽器解析并提取數(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)容吧。

【python爬蟲(chóng)】10.指揮瀏覽器自動(dòng)工作(selenium),python,爬蟲(chóng),selenium
代碼我寫(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>

【python爬蟲(chóng)】10.指揮瀏覽器自動(dòng)工作(selenium),python,爬蟲(chóng),selenium
你可以看出,提取數(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()。

【python爬蟲(chóng)】10.指揮瀏覽器自動(dòng)工作(selenium),python,爬蟲(chóng),selenium

我們來(lái)舉個(gè)例子:

【python爬蟲(chóng)】10.指揮瀏覽器自動(dòng)工作(selenium),python,爬蟲(chóng),selenium
我們?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)換:

【python爬蟲(chóng)】10.指揮瀏覽器自動(dòng)工作(selenium),python,爬蟲(chóng),selenium
剛才,我們做的都是提取出網(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就好了。

【python爬蟲(chóng)】10.指揮瀏覽器自動(dòng)工作(selenium),python,爬蟲(chóng),selenium
我們來(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的工作方式吧。

【python爬蟲(chóng)】10.指揮瀏覽器自動(dòng)工作(selenium),python,爬蟲(chóng),selenium
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)是字符串了。

【python爬蟲(chóng)】10.指揮瀏覽器自動(dòng)工作(selenium),python,爬蟲(chóng),selenium
獲取到了字符串格式的網(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)擊提交。

【python爬蟲(chóng)】10.指揮瀏覽器自動(dòng)工作(selenium),python,爬蟲(chóng),selenium
網(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è)的空格處。

【python爬蟲(chóng)】10.指揮瀏覽器自動(dòng)工作(selenium),python,爬蟲(chóng),selenium
從網(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)容。

【python爬蟲(chóng)】10.指揮瀏覽器自動(dòng)工作(selenium),python,爬蟲(chóng),selenium
假如,在剛才的空格中,已經(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ì)是一樣的。

【python爬蟲(chóng)】10.指揮瀏覽器自動(dòng)工作(selenium),python,爬蟲(chóng),selenium

現(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)直完美:

【python爬蟲(chóng)】10.指揮瀏覽器自動(dòng)工作(selenium),python,爬蟲(chóng),selenium
接下來(lái)是解析與提取數(shù)據(jù):

第一種解決思路是使用selenium提取數(shù)據(jù)的方法。

【python爬蟲(chóng)】10.指揮瀏覽器自動(dòng)工作(selenium),python,爬蟲(chóng),selenium
第二種解決思路是,先獲取到完整網(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)的位置:

【python爬蟲(chóng)】10.指揮瀏覽器自動(dòng)工作(selenium),python,爬蟲(chóng),selenium
這里要注意的是,這個(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ù)。

【python爬蟲(chóng)】10.指揮瀏覽器自動(dòng)工作(selenium),python,爬蟲(chóng),selenium
這時(shí)候,寫(xiě)代碼的方法就很明朗了,首先找到【點(diǎn)擊加載更多】在網(wǎng)頁(yè)源代碼中的位置,點(diǎn)擊它,等待源代碼加載完成之后就可以把全部30個(gè)評(píng)論提取出來(lái)了。

【python爬蟲(chóng)】10.指揮瀏覽器自動(dòng)工作(selenium),python,爬蟲(chóng),selenium
請(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ù)的方法:
【python爬蟲(chóng)】10.指揮瀏覽器自動(dòng)工作(selenium),python,爬蟲(chóng),selenium
以及在這個(gè)過(guò)程中,對(duì)象的轉(zhuǎn)換過(guò)程:

【python爬蟲(chóng)】10.指揮瀏覽器自動(dòng)工作(selenium),python,爬蟲(chóng),selenium
除了上面的方法,selenium還可以搭配BeautifulSoup解析提取數(shù)據(jù),前提是先獲取字符串格式的網(wǎng)頁(yè)源代碼。

HTML源代碼字符串 = driver.page_source 

以及自動(dòng)操作瀏覽器的一些方法。

【python爬蟲(chóng)】10.指揮瀏覽器自動(dòng)工作(selenium),python,爬蟲(chóng),selenium

還有,在用完瀏覽器之后,要記得關(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/

下一關(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)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • win10取消ie瀏覽器自動(dòng)跳轉(zhuǎn)edge瀏覽器

    win10取消ie瀏覽器自動(dòng)跳轉(zhuǎn)edge瀏覽器

    建議大家看完整篇文章再作操作 隨著windows10 日漸更新,各種不同的操作,規(guī)避IE瀏覽器跳轉(zhuǎn)Edge瀏覽器的問(wèn)題 1.(失?。┧悸?協(xié)助Edge瀏覽器 管理員身份打開(kāi) PowerShell 一般edge的默認(rèn)安裝目錄是 PowerSell 進(jìn)行跳轉(zhuǎn)到上述目錄 執(zhí)行卸載命令 然后會(huì)提示 打開(kāi)任務(wù)管理器,找到所有

    2024年02月07日
    瀏覽(24)
  • 使用Selenium控制Chrome瀏覽器 --工作自動(dòng)化

    使用Selenium控制Chrome瀏覽器 --工作自動(dòng)化

    使用Selenium控制Chrome瀏覽器 --工作自動(dòng)化 最近朋友在用秒賬做帳時(shí),由于銷售單量很大,重復(fù)錄入工作一天一錄就近五個(gè)小時(shí),尋求幫助,問(wèn)能不能把這重復(fù)勞動(dòng)減少些,看后分析,使用web自動(dòng)化,應(yīng)能解決問(wèn)題,特此記錄如下: ?Selenium 簡(jiǎn)介:Selenium 是一套完整的web應(yīng)用程

    2024年02月01日
    瀏覽(87)
  • Win10系統(tǒng)下禁止ie瀏覽器自動(dòng)跳轉(zhuǎn)到Microsoft Edge瀏覽器

    Win10系統(tǒng)下禁止ie瀏覽器自動(dòng)跳轉(zhuǎn)到Microsoft Edge瀏覽器

    當(dāng)有些情況下,需要使用ie瀏覽器時(shí),但是當(dāng)我們打開(kāi)ie瀏覽器會(huì)自動(dòng)跳轉(zhuǎn)到Microsoft Edge瀏覽器,該如何設(shè)置,來(lái)禁止它自動(dòng)跳轉(zhuǎn)呢?

    2024年02月11日
    瀏覽(98)
  • Python 和 Selenium 的瀏覽器爬蟲(chóng)

    Python 和 Selenium 的瀏覽器爬蟲(chóng)

    Selenium?是一款強(qiáng)大的基于瀏覽器的開(kāi)源自動(dòng)化測(cè)試工具,最初由 Jason Huggins 于 2004 年在 ThoughtWorks 發(fā)起,它提供了一套簡(jiǎn)單易用的 API,模擬瀏覽器的各種操作,方便各種 Web 應(yīng)用的自動(dòng)化測(cè)試。 它的取名很有意思,因?yàn)楫?dāng)時(shí)最流行的一款自動(dòng)化測(cè)試工具叫做 QTP,是由 Mercur

    2024年02月08日
    瀏覽(157)
  • Python爬蟲(chóng)(2)-Selenium控制瀏覽器

    Python爬蟲(chóng)(2)-Selenium控制瀏覽器

    Selenium中提供了不少的方法來(lái)操作瀏覽器 使用driver.get(‘網(wǎng)址’)的方式來(lái)打開(kāi)瀏覽器 driver.refresh() 瀏覽器切換標(biāo)簽的方法就是, driver.current_window_handle 用selenium點(diǎn)擊新打開(kāi)了一個(gè)網(wǎng)頁(yè),需要告知selenium目前這個(gè)窗口是新的窗口,那么它才能早新的頁(yè)面進(jìn)行操作不然的話就無(wú)法操

    2024年02月08日
    瀏覽(88)
  • python爬蟲(chóng)之selenium模擬瀏覽器

    python爬蟲(chóng)之selenium模擬瀏覽器

    之前在異步加載(AJAX)網(wǎng)頁(yè)爬蟲(chóng)的時(shí)候提到過(guò),爬取這種ajax技術(shù)的網(wǎng)頁(yè)有兩種辦法:一種就是通過(guò)瀏覽器審查元素找到包含所需信息網(wǎng)頁(yè)的真實(shí)地址,另一種就是通過(guò)selenium模擬瀏覽器的方法[1]。當(dāng)時(shí)爬的是豆瓣,比較容易分析出所需信息的真實(shí)地址,不過(guò)一般大點(diǎn)的網(wǎng)站像

    2024年02月03日
    瀏覽(91)
  • python爬蟲(chóng)之selenium庫(kù),瀏覽器訪問(wèn)搜索頁(yè)面并提取信息,及隱藏瀏覽器運(yùn)行

    python爬蟲(chóng)之selenium庫(kù),瀏覽器訪問(wèn)搜索頁(yè)面并提取信息,及隱藏瀏覽器運(yùn)行

    如果鏈接簡(jiǎn)單,爬蟲(chóng)可以通過(guò)鏈接用requests庫(kù)提取頁(yè)面信息,如爬取豆瓣top250影片信息,鏈接簡(jiǎn)單易懂。參考:爬取豆瓣top250影片信息 但如果遇到一些搜索之類的,基于js動(dòng)態(tài)加載的網(wǎng)頁(yè),以上就不適合,如爬蟲(chóng)b站,搜索“爬蟲(chóng)”頁(yè)面,第一頁(yè)鏈接如下,第二頁(yè)又是很長(zhǎng)沒(méi)規(guī)

    2024年01月23日
    瀏覽(228)
  • python使用selenium控制瀏覽器進(jìn)行爬蟲(chóng)

    python使用selenium控制瀏覽器進(jìn)行爬蟲(chóng)

    這里以谷歌瀏覽器為例,需要安裝一下chromedriver,其他瀏覽器也有相對(duì)應(yīng)的driver,chromedriver下載地址:https://googlechromelabs.github.io/chrome-for-testing/ 然后是打開(kāi)python環(huán)境安裝一下依賴 pip install selenium ,驗(yàn)證一下控制瀏覽器是否成功 點(diǎn)擊運(yùn)行腳本可以看到以下頁(yè)面就成功了。 爬蟲(chóng)

    2024年02月04日
    瀏覽(89)
  • 【python爬蟲(chóng)】設(shè)計(jì)自己的爬蟲(chóng) 4. 封裝模擬瀏覽器 Selenium

    有些自動(dòng)化工具可以獲取瀏覽器當(dāng)前呈現(xiàn)的頁(yè)面的源代碼,可以通過(guò)這種方式來(lái)進(jìn)行爬取 一般常用的的有Selenium, playwright, pyppeteer,考慮到他們的使用有許多相同之處,因此考慮把他們封裝到一套api中 先看基類 Selenium是一個(gè)自動(dòng)化測(cè)試工具,利用它可以驅(qū)動(dòng)瀏覽器完成特定

    2024年02月03日
    瀏覽(91)
  • Python爬蟲(chóng)之解決瀏覽器等待與代理隧道問(wèn)題

    Python爬蟲(chóng)之解決瀏覽器等待與代理隧道問(wèn)題

    作為專業(yè)爬蟲(chóng)程序員,我們往往需要應(yīng)對(duì)一些限制性挑戰(zhàn),比如瀏覽器等待和使用代理隧道。在Python爬蟲(chóng)開(kāi)發(fā)中,這些問(wèn)題可能會(huì)導(dǎo)致我們的爬蟲(chóng)受阻。本文將為你分享解決這些問(wèn)題的方案,幫助你順利應(yīng)對(duì)瀏覽器等待和代理隧道的挑戰(zhàn)! 一、瀏覽器等待問(wèn)題 瀏覽器等待是

    2024年02月12日
    瀏覽(23)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包