淺談python爬蟲(chóng)使用Selenium模擬瀏覽器行為
前幾天有位微信讀者問(wèn)我一個(gè)爬蟲(chóng)的問(wèn)題,就是在爬去百度貼吧首頁(yè)的熱門(mén)動(dòng)態(tài)下面的圖片的時(shí)候,爬取的圖片總是爬取不完整,比首頁(yè)看到的少。原因他也大概分析了下,就是后面的圖片是動(dòng)態(tài)加載的。他的問(wèn)題就是這部分動(dòng)態(tài)加載的圖片該怎么爬取到。
分析
他的代碼比較簡(jiǎn)單,主要有以下的步驟:使用BeautifulSoup庫(kù),打開(kāi)百度貼吧的首頁(yè)地址,再解析得到id為new_list標(biāo)簽底下的img標(biāo)簽,最后將img標(biāo)簽的圖片保存下來(lái)。
headers = {
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36'
}
data=requests.get("https://tieba.baidu.com/index.html",headers=headers)
html=BeautifulSoup(data.text,'lxml')
前面提到過(guò),有部分圖片是動(dòng)態(tài)加載的,那么首先我們得弄清楚,這部分圖片是怎么動(dòng)態(tài)加載的。在瀏覽器中打開(kāi)百度貼吧的首頁(yè),可以明顯的看到,在往下滾動(dòng)滾動(dòng)條的時(shí)候,當(dāng)滾動(dòng)到底部的時(shí)候,滾動(dòng)條縮短了,并向上移動(dòng)了一段距離。這個(gè)現(xiàn)象也正是有DOM元素動(dòng)態(tài)的添加到了html文檔的一個(gè)表現(xiàn)。動(dòng)態(tài)加載數(shù)據(jù)無(wú)非就是ajax請(qǐng)求,而ajax本質(zhì)上就是XMLHttpRequest請(qǐng)求(簡(jiǎn)稱(chēng)xhr)。在谷歌瀏覽器中,我們可以通過(guò)開(kāi)發(fā)者工具的network面板來(lái)監(jiān)測(cè)xhr請(qǐng)求。
剛打開(kāi)首頁(yè)時(shí)的xhr請(qǐng)求,這里的請(qǐng)求都和要爬取的圖片無(wú)關(guān)。

滾動(dòng)條向下第1次滾動(dòng)到底部,這里請(qǐng)求的是第20-40條熱門(mén)動(dòng)態(tài),包含要爬取圖片。

滾動(dòng)條向下第2次滾動(dòng)到底部,這里請(qǐng)求的是第40-60條熱門(mén)動(dòng)態(tài),包含要爬取圖片。并且返回的的has_more:false表明沒(méi)有跟多數(shù)據(jù)了。

滾動(dòng)條向下第3次滾動(dòng)到底部,再無(wú)xhr請(qǐng)求。
解決方案
根據(jù)上面的分析,我們已經(jīng)明白,單純使用BeautifulSoup進(jìn)行爬蟲(chóng)的時(shí)候,只能爬取到1-20條熱門(mén)動(dòng)態(tài)里面的圖片。為了爬取到完整的熱門(mén)動(dòng)態(tài)里面的圖片,我們則需要模擬瀏覽器的滾動(dòng)條滾動(dòng),讓網(wǎng)頁(yè)去觸發(fā)xhr請(qǐng)求更多的熱門(mén)動(dòng)態(tài)。
在python中,如果需要模擬瀏覽器的行為,可以使用selenium庫(kù)。selenium庫(kù)是一個(gè)自動(dòng)化測(cè)試框架,可以用來(lái)模擬測(cè)試瀏覽器的各種行為,這里我們使用它來(lái)模擬瀏覽器打開(kāi)百度貼吧的首頁(yè),并模擬滾動(dòng)條向下滾動(dòng)到底部的操作。
安裝
pip install selenium
下載瀏覽器驅(qū)動(dòng)
火狐瀏覽器驅(qū)動(dòng),其下載地址是:https://github.com/mozilla/geckodriver/releases
谷歌瀏覽器驅(qū)動(dòng),其下載地址是:http://chromedriver.storage.googleapis.com/index.html?path=2.33/
opera瀏覽器驅(qū)動(dòng),其下載地址是:https://github.com/operasoftware/operachromiumdriver/releases
對(duì)照自己電腦安裝的瀏覽器和對(duì)應(yīng)的版本,分別從上面的地址下載驅(qū)動(dòng)文件,也可以從我的github項(xiàng)目中統(tǒng)一下載以上幾個(gè)驅(qū)動(dòng)(地址:https://github.com/Sesshoumaru/attachments/tree/master/Selenium%20WebDriver)。下載解壓后,將所在的目錄添加系統(tǒng)的環(huán)境變量中。當(dāng)然你也可以將下載下來(lái)的驅(qū)動(dòng)放到python安裝目錄的lib目錄中,因?yàn)樗旧硪呀?jīng)存在于環(huán)境變量(我就是這么干的)。

使用python代碼模擬瀏覽器行為
要使用selenium先需要定義一個(gè)具體browser對(duì)象,這里就定義的時(shí)候就看你電腦安裝的具體瀏覽器和安裝的哪個(gè)瀏覽器的驅(qū)動(dòng)。這里以火狐瀏覽器為例:
from selenium import webdriver browser = webdriver.Firefox()
再模擬打開(kāi)貼吧首頁(yè):
browser.get(https://tieba.baidu.com/index.html)
再模擬滾動(dòng)條滾動(dòng)到底部
for i in range(1, 5):
browser.execute_script('window.scrollTo(0, document.body.scrollHeight)')
time.sleep(1)
最后再使用BeautifulSoup,解析圖片標(biāo)簽:
html = BeautifulSoup(browser.page_source, "lxml")
imgs = html.select("#new_list li img")
幾個(gè)注意點(diǎn)
必須安裝瀏覽器和瀏覽器驅(qū)動(dòng),并且瀏覽器和瀏覽器驅(qū)動(dòng)要配到
即如果使用谷歌瀏覽器模擬網(wǎng)頁(yè)行為,則需要下載谷歌瀏覽器驅(qū)動(dòng);
如果使用火狐瀏覽器模擬網(wǎng)頁(yè)行為,則需要下載火狐瀏覽器驅(qū)動(dòng)
瀏覽器驅(qū)動(dòng)所在的目錄要在環(huán)境變量中,或者定義瀏覽器browser的時(shí)候指定驅(qū)動(dòng)的路徑
selenium更多用法
查找元素
from selenium import webdriver
browser = webdriver.Firefox()
browser.get("https://tieba.baidu.com/index.html")
new_list = browser.find_element_by_id('new_list')
user_name = browser.find_element_by_name ('user_name')
active = browser.find_element_by_class_name ('active')
p = browser.find_element_by_tag_name ('p')
# find_element_by_name 通過(guò)name查找單個(gè)元素
# find_element_by_xpath 通過(guò)xpath查找單個(gè)元素
# find_element_by_link_text 通過(guò)鏈接查找單個(gè)元素
# find_element_by_partial_link_text 通過(guò)部分鏈接查找單個(gè)元素
# find_element_by_tag_name 通過(guò)標(biāo)簽名稱(chēng)查找單個(gè)元素
# find_element_by_class_name 通過(guò)類(lèi)名查找單個(gè)元素
# find_element_by_css_selector 通過(guò)css選擇武器查找單個(gè)元素
# find_elements_by_name 通過(guò)name查找多個(gè)元素
# find_elements_by_xpath 通過(guò)xpath查找多個(gè)元素
# find_elements_by_link_text 通過(guò)鏈接查找多個(gè)元素
# find_elements_by_partial_link_text 通過(guò)部分鏈接查找多個(gè)元素
# find_elements_by_tag_name 通過(guò)標(biāo)簽名稱(chēng)查找多個(gè)元素
# find_elements_by_class_name 通過(guò)類(lèi)名查找多個(gè)元素
# find_elements_by_css_selector 通過(guò)css選擇武器查找多個(gè)元素
獲取元素信息
btn_more = browser.find_element_by_id('btn_more')
print(btn_more.get_attribute('class')) # 獲取屬性
print(btn_more.get_attribute('href')) # 獲取屬性
print(btn_more.text) # 獲取文本值
元素交互操作
btn_more = browser.find_element_by_id('btn_more')
btn_more.click() # 模擬點(diǎn)擊,可以模擬點(diǎn)擊加載更多
input_search = browser.find_element(By.ID,'q')
input_search.clear() # 清空輸入
執(zhí)行JavaScript
# 執(zhí)行JavaScript腳本
browser.execute_script('window.scrollTo(0, document.body.scrollHeight)')
browser.execute_script('alert("To Bottom")')
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- python中的selenium安裝的步驟(瀏覽器自動(dòng)化測(cè)試框架)
- selenium+python自動(dòng)化測(cè)試之使用webdriver操作瀏覽器的方法
- python selenium 對(duì)瀏覽器標(biāo)簽頁(yè)進(jìn)行關(guān)閉和切換的方法
- Python+selenium 獲取瀏覽器窗口坐標(biāo)、句柄的方法
- python用selenium打開(kāi)瀏覽器后秒關(guān)閉瀏覽器的解決辦法
- python用selenium打開(kāi)chrome瀏覽器保持登錄方式
- Python+Selenium實(shí)現(xiàn)瀏覽器標(biāo)簽頁(yè)的切換
- 詳解Python多線(xiàn)程Selenium跨瀏覽器測(cè)試
- 如何在Python中引入和使用瀏覽器驅(qū)動(dòng)
相關(guān)文章
python 爬蟲(chóng) 批量獲取代理ip的實(shí)例代碼
今天小編就為大家分享一篇python 爬蟲(chóng) 批量獲取代理ip的實(shí)例代碼,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-05-05
Python多線(xiàn)程threading join和守護(hù)線(xiàn)程setDeamon原理詳解
這篇文章主要介紹了Python多線(xiàn)程threading join和守護(hù)線(xiàn)程setDeamon原理詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-03-03
詳解tensorflow之過(guò)擬合問(wèn)題實(shí)戰(zhàn)
這篇文章主要介紹了詳解tensorflow之過(guò)擬合問(wèn)題實(shí)戰(zhàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-11-11
langchain中的chat?models介紹和使用實(shí)例
這篇文章主要介紹了langchain中的chat?models介紹和使用實(shí)例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-11-11
Python matplotlib的使用并自定義colormap的方法
今天小編就為大家分享一篇Python matplotlib的使用并自定義colormap的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-12-12
淺談python 線(xiàn)程池threadpool之實(shí)現(xiàn)
這篇文章主要介紹了淺談python 線(xiàn)程池threadpool之實(shí)現(xiàn),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-11-11
Python持續(xù)監(jiān)聽(tīng)文件變化代碼實(shí)例
這篇文章主要介紹了Python持續(xù)監(jiān)聽(tīng)文件變化代碼實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-07-07
Python異步發(fā)送日志到遠(yuǎn)程服務(wù)器詳情
這篇文章主要介紹了Python異步發(fā)送日志到遠(yuǎn)程服務(wù)器詳情,文章通過(guò)簡(jiǎn)單輸出到cmd和文件中的代碼展開(kāi)詳情,需要的朋友可以參考一下2022-07-07

