最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

淺談python爬蟲使用Selenium模擬瀏覽器行為

 更新時間:2018年02月23日 10:51:59   作者:十月狐貍  
這篇文章主要介紹了淺談python爬蟲使用Selenium模擬瀏覽器行為,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

前幾天有位微信讀者問我一個爬蟲的問題,就是在爬去百度貼吧首頁的熱門動態(tài)下面的圖片的時候,爬取的圖片總是爬取不完整,比首頁看到的少。原因他也大概分析了下,就是后面的圖片是動態(tài)加載的。他的問題就是這部分動態(tài)加載的圖片該怎么爬取到。

分析

他的代碼比較簡單,主要有以下的步驟:使用BeautifulSoup庫,打開百度貼吧的首頁地址,再解析得到id為new_list標簽底下的img標簽,最后將img標簽的圖片保存下來。

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')

前面提到過,有部分圖片是動態(tài)加載的,那么首先我們得弄清楚,這部分圖片是怎么動態(tài)加載的。在瀏覽器中打開百度貼吧的首頁,可以明顯的看到,在往下滾動滾動條的時候,當滾動到底部的時候,滾動條縮短了,并向上移動了一段距離。這個現(xiàn)象也正是有DOM元素動態(tài)的添加到了html文檔的一個表現(xiàn)。動態(tài)加載數(shù)據(jù)無非就是ajax請求,而ajax本質(zhì)上就是XMLHttpRequest請求(簡稱xhr)。在谷歌瀏覽器中,我們可以通過開發(fā)者工具的network面板來監(jiān)測xhr請求。

剛打開首頁時的xhr請求,這里的請求都和要爬取的圖片無關(guān)。

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

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

滾動條向下第3次滾動到底部,再無xhr請求。

解決方案

根據(jù)上面的分析,我們已經(jīng)明白,單純使用BeautifulSoup進行爬蟲的時候,只能爬取到1-20條熱門動態(tài)里面的圖片。為了爬取到完整的熱門動態(tài)里面的圖片,我們則需要模擬瀏覽器的滾動條滾動,讓網(wǎng)頁去觸發(fā)xhr請求更多的熱門動態(tài)。

在python中,如果需要模擬瀏覽器的行為,可以使用selenium庫。selenium庫是一個自動化測試框架,可以用來模擬測試瀏覽器的各種行為,這里我們使用它來模擬瀏覽器打開百度貼吧的首頁,并模擬滾動條向下滾動到底部的操作。

安裝

pip install selenium

下載瀏覽器驅(qū)動

火狐瀏覽器驅(qū)動,其下載地址是:https://github.com/mozilla/geckodriver/releases

谷歌瀏覽器驅(qū)動,其下載地址是:http://chromedriver.storage.googleapis.com/index.html?path=2.33/

opera瀏覽器驅(qū)動,其下載地址是:https://github.com/operasoftware/operachromiumdriver/releases

對照自己電腦安裝的瀏覽器和對應(yīng)的版本,分別從上面的地址下載驅(qū)動文件,也可以從我的github項目中統(tǒng)一下載以上幾個驅(qū)動(地址:https://github.com/Sesshoumaru/attachments/tree/master/Selenium%20WebDriver)。下載解壓后,將所在的目錄添加系統(tǒng)的環(huán)境變量中。當然你也可以將下載下來的驅(qū)動放到python安裝目錄的lib目錄中,因為它本身已經(jīng)存在于環(huán)境變量(我就是這么干的)。

使用python代碼模擬瀏覽器行為

要使用selenium先需要定義一個具體browser對象,這里就定義的時候就看你電腦安裝的具體瀏覽器和安裝的哪個瀏覽器的驅(qū)動。這里以火狐瀏覽器為例:

from selenium import webdriver
browser = webdriver.Firefox()

再模擬打開貼吧首頁:

再模擬滾動條滾動到底部

for i in range(1, 5):
 browser.execute_script('window.scrollTo(0, document.body.scrollHeight)')
 time.sleep(1)

最后再使用BeautifulSoup,解析圖片標簽:

html = BeautifulSoup(browser.page_source, "lxml")
imgs = html.select("#new_list li img")

幾個注意點

必須安裝瀏覽器和瀏覽器驅(qū)動,并且瀏覽器和瀏覽器驅(qū)動要配到

即如果使用谷歌瀏覽器模擬網(wǎng)頁行為,則需要下載谷歌瀏覽器驅(qū)動;
如果使用火狐瀏覽器模擬網(wǎng)頁行為,則需要下載火狐瀏覽器驅(qū)動

瀏覽器驅(qū)動所在的目錄要在環(huán)境變量中,或者定義瀏覽器browser的時候指定驅(qū)動的路徑

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 通過name查找單個元素
# find_element_by_xpath 通過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 通過css選擇武器查找單個元素
# find_elements_by_name 通過name查找多個元素
# find_elements_by_xpath 通過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 通過css選擇武器查找多個元素

獲取元素信息

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() # 模擬點擊,可以模擬點擊加載更多

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")')

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • 解決安裝python3.7.4報錯Can''''t connect to HTTPS URL because the SSL module is not available

    解決安裝python3.7.4報錯Can''''t connect to HTTPS URL because the S

    這篇文章主要介紹了解決安裝python3.7.4報錯Can't connect to HTTPS URL because the SSL module is not available,本文給大家簡單分析了錯誤原因,給出了解決方法,需要的朋友可以參考下
    2019-07-07
  • Python中的程序流程控制語句

    Python中的程序流程控制語句

    這篇文章主要介紹了Python中的程序流程控制語句,本篇博客將會講述一下Python語言中的流程控制語句,在高中我們數(shù)學(xué)中學(xué)過程序流程題,下面我們來看看python中得流程語句會是怎么樣呢,需要的小伙伴可以參考一下
    2022-02-02
  • python實用代碼片段收集貼

    python實用代碼片段收集貼

    這篇文章主要介紹了python實用代碼片段收集貼,本文收集了如獲取一個類的所有子類、計算運行時間、SQLAlchemy簡單使用、實現(xiàn)類似Java或C中的枚舉等實用功能代碼,需要的朋友可以參考下
    2015-06-06
  • Python報錯TypeError: unsupported operand的問題分析和解決方法

    Python報錯TypeError: unsupported operand的問題分析和解決方法

    TypeError: unsupported operand 是Python中常見的一類錯誤,通常在嘗試對不兼容的數(shù)據(jù)類型進行操作時發(fā)生,比如,當你嘗試對字符串和整數(shù)進行加法操作時,Python會拋出這一錯誤,所以本文給大家介紹了Python報錯TypeError: unsupported operand的問題解決
    2024-09-09
  • paramiko使用tail實時獲取服務(wù)器的日志輸出詳解

    paramiko使用tail實時獲取服務(wù)器的日志輸出詳解

    這篇文章主要給大家介紹了關(guān)于paramiko使用tail實時獲取服務(wù)器的日志輸出的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-12-12
  • PyTorch一小時掌握之神經(jīng)網(wǎng)絡(luò)分類篇

    PyTorch一小時掌握之神經(jīng)網(wǎng)絡(luò)分類篇

    這篇文章主要介紹了PyTorch一小時掌握之神經(jīng)網(wǎng)絡(luò)分類篇,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-09-09
  • python編寫adb截圖工具的實現(xiàn)源碼

    python編寫adb截圖工具的實現(xiàn)源碼

    adb截圖工具可用于Android手機及Android終端,Android端或者Android終端的遠程截圖至本地電腦中,今天通過本文給大家介紹python編寫adb截圖工具的實現(xiàn)源碼,感興趣的朋友一起看看吧
    2021-08-08
  • Django 導(dǎo)出 Excel 代碼的實例詳解

    Django 導(dǎo)出 Excel 代碼的實例詳解

    本篇文章主要介紹了Django 導(dǎo)出 Excel 代碼的實例詳解,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-08-08
  • Python使用sort和class實現(xiàn)的多級排序功能示例

    Python使用sort和class實現(xiàn)的多級排序功能示例

    這篇文章主要介紹了Python使用sort和class實現(xiàn)的多級排序功能,涉及Python基于面向?qū)ο蟮脑乇闅v、列表排序、添加等相關(guān)操作技巧,需要的朋友可以參考下
    2018-08-08
  • Python字符串處理實例詳解

    Python字符串處理實例詳解

    這篇文章主要介紹了Python字符串處理實例詳解的相關(guān)資料,需要的朋友可以參考下
    2017-05-05

最新評論

都匀市| 合水县| 鄂托克前旗| 定日县| 北海市| 北安市| 广南县| 惠水县| 沾化县| 宣化县| 禹州市| 大竹县| 大化| 阳东县| 彭泽县| 广宗县| 涪陵区| 连州市| 博爱县| 绥江县| 呈贡县| 嘉禾县| 衢州市| 西安市| 张北县| 长沙县| 平阴县| 临汾市| 陇南市| 易门县| 赤水市| 清徐县| 马龙县| 和硕县| 南丰县| 拉孜县| 丰宁| 临武县| 紫金县| 肃南| 绥滨县|