Python爬蟲中的Selenium庫(kù)剖析

這期內(nèi)容當(dāng)中小編將會(huì)給大家?guī)碛嘘P(guān)Python爬蟲中的Selenium庫(kù)剖析,文章內(nèi)容豐富且以專業(yè)的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。

成都創(chuàng)新互聯(lián)專業(yè)為企業(yè)提供天河網(wǎng)站建設(shè)、天河做網(wǎng)站、天河網(wǎng)站設(shè)計(jì)、天河網(wǎng)站制作等企業(yè)網(wǎng)站建設(shè)、網(wǎng)頁(yè)設(shè)計(jì)與制作、天河企業(yè)網(wǎng)站模板建站服務(wù),十多年天河做網(wǎng)站經(jīng)驗(yàn),不只是建網(wǎng)站,更提供有價(jià)值的思路和整體網(wǎng)絡(luò)服務(wù)。

Selenium 是一個(gè)用于測(cè)試 Web 應(yīng)用程序的框架,該框架測(cè)試直接在瀏覽器中運(yùn)行,就像真實(shí)用戶操作一樣。它支持多種平臺(tái):Windows、Linux、Mac,支持多種語言:Python、Perl、PHP、C# 等,支持多種瀏覽器:Chrome、IE、Firefox、Safari 等。

1 安裝

(1)安裝 Selenium

pip install selenium

(2)安裝 WebDriver

主要瀏覽器 WebDriver 地址如下:

Chrome:http://chromedriver.storage.googleapis.com/index.html

Firefox:https://github.com/mozilla/geckodriver/releases/

IE:http://selenium-release.storage.googleapis.com/index.html

本文以 Chrome 為例,本機(jī)為 Windows 系統(tǒng),WebDriver 使用版本 78.0.3904.11,Chrome 瀏覽器版本為 78.0.3880.4 驅(qū)動(dòng)程序下載好后解壓,將 chromedriver.exe 放到 Python 安裝目錄下即可。

2 操作瀏覽器

2.1 打開瀏覽器

(1)普通方式

以打開去 163 郵箱為例,使用 Chrome 瀏覽器

from selenium import webdriver
browser = webdriver.Chrome()
browser.get('https://mail.163.com/')

使用 Firefox 瀏覽器

from selenium import webdriver
browser = webdriver.Firefox()
browser.get('https://mail.163.com/')

使用 IE 瀏覽器

from selenium import webdriver
browser = webdriver.Ie()
browser.get('https://mail.163.com/')

(2)加載配置方式

以 Chrome 為例,在 Chrome 瀏覽器地址欄輸入 chrome://version/ 打開,如圖所示:

Python爬蟲中的Selenium庫(kù)剖析

我們可以看到個(gè)人資料路徑這一項(xiàng),取到路徑:C:\Users\admin\AppData\Local\Google\Chrome\User Data,取到 User Data 使用自己設(shè)置的配置,取到 Default 使用默認(rèn)配置??聪率纠?/p>

from selenium import webdriver
option = webdriver.ChromeOptions()
# 自己的數(shù)據(jù)目錄(需要將復(fù)制的路徑中的 \ 替換成 / 或進(jìn)行轉(zhuǎn)義 \\)
# option.add_argument('--user-data-dir=C:/Users/admin/AppData/Local/Google/Chrome/User Data')
option.add_argument('--user-data-dir=C:\\Users\\admin\\AppData\\Local\\Google\\Chrome\\User Data')
browser = webdriver.Chrome(chrome_options=option)
browser.get('https://mail.163.com/')
# 關(guān)閉
browser.quit()

如果執(zhí)行時(shí)報(bào)錯(cuò)沒有打開指定頁(yè)面,可先將瀏覽器關(guān)閉再執(zhí)行。

(3)Headless 方式

前兩種方式都是有瀏覽器界面的方式,Headless 模式是 Chrome 瀏覽器的無界面形態(tài),可以在不打開瀏覽器的前提下,使用所有 Chrome 支持的特性運(yùn)行我們的程序。這種方式更加方便測(cè)試 Web 應(yīng)用、獲得網(wǎng)站的截圖、做爬蟲抓取信息等??聪率纠?/p>

from selenium import webdriver
chrome_options = webdriver.ChromeOptions()
# 使用 headless 無界面瀏覽器模式
chrome_options.add_argument('--headless')
# 禁用 gpu 加速
chrome_options.add_argument('--disable-gpu')
# 啟動(dòng)瀏覽器,獲取網(wǎng)頁(yè)源代碼
browser = webdriver.Chrome(chrome_options=chrome_options)
url = 'https://mail.163.com/'
browser.get(url)
print('browser text = ',browser.page_source)
browser.quit()

2.2 設(shè)置瀏覽器窗口

最大化顯示

browser.maximize_window()

最小化顯示

browser.minimize_window()

自定義大小

# 寬 500,高 800
browser.set_window_size(500,800)

2.3 前進(jìn)后退

前進(jìn)

browser.forward()

后退

browser.back()

3 元素定位

當(dāng)我們想要操作一個(gè)元素時(shí),首先需要找到它,Selenium 提供了多種元素定位方式,我們以 Chrome 瀏覽器 Headless 方式為例??聪率纠?/p>

from selenium import webdriver
chrome_options = webdriver.ChromeOptions()
chrome_options.add_argument('--headless')
chrome_options.add_argument('--disable-gpu') 
browser = webdriver.Chrome(chrome_options=chrome_options)
url = 'https://xxx.xxx.com/'
browser.get(url)
data = browser.page_source

假設(shè)訪問地址 https://xxx.xxx.com/,返回 data 為如下內(nèi)容。

<html>
    <body>
        <form>
            <input id="fid" name="fid" type="text" />
            <input id="firstName" name="fname" class="fname" type="text" />
            <input id="lastName" name="fname" class="fname" type="text" />
            <a href="index.html">index</a>
        </form>
    </body>
<html>

(1)根據(jù) id 定位

browser.find_element_by_id('fid')

(2)根據(jù) name 定位

# 返回第一個(gè)元素
browser.find_element_by_name('fname')
# 返回所有元素
browser.find_elements_by_name('fname')

(3)根據(jù) class 定位

# 返回第一個(gè)元素
browser.find_element_by_class_name('fname')
# 返回所有元素
browser.find_elements_by_class_name('fname')

(4)根據(jù)標(biāo)簽名定位

# 返回第一個(gè)元素
browser.find_element_by_tag_name('input')
# 返回所有元素
browser.find_elements_by_tag_name('input')

(5)使用 CSS 定位

# 返回第一個(gè)元素
browser.find_element_by_css_selector('.fname')
# 返回所有元素
browser.find_elements_by_css_selector('.fname')

(6)使用鏈接文本定位超鏈接

# 返回第一個(gè)元素
browser.find_element_by_link_text('index')
# 返回所有元素
browser.find_elements_by_link_text('index')
# 返回第一個(gè)元素
browser.find_element_by_partial_link_text('index')
# 返回所有元素
browser.find_elements_by_partial_link_text('index')

(7)使用 xpath 定位

# 返回第一個(gè)元素
browser.find_elements_by_xpath("//input[@id='fid']")
# 返回所有元素
browser.find_elements_by_xpath("//input[@name='fname']")

4 等待事件

Web 應(yīng)用大多都使用 AJAX 技術(shù)進(jìn)行加載,瀏覽器載入一個(gè)頁(yè)面時(shí),頁(yè)面內(nèi)的元素可能會(huì)在不同的時(shí)間載入,這會(huì)加大定位元素的困難程度,因?yàn)樵夭辉?DOM 里,會(huì)拋出 ElementNotVisibleException 異常,使用 Waits,我們就可以解決這個(gè)問題。

Selenium WebDriver 提供了顯式和隱式兩種 Waits 方式,顯式的 Waits 會(huì)讓 WebDriver 在更深一步的執(zhí)行前等待一個(gè)確定的條件觸發(fā),隱式的 Waits 則會(huì)讓 WebDriver 試圖定位元素的時(shí)候?qū)?DOM 進(jìn)行指定次數(shù)的輪詢。

4.1 顯示等待

WebDriverWait 配合該類的 until() 和 until_not() 方法,就能夠根據(jù)判斷條件而進(jìn)行靈活地等待了。它主要流程是:程序每隔 x 秒檢查一下,如果條件成立了,則執(zhí)行下一步操作,否則繼續(xù)等待,直到超過設(shè)置的最長(zhǎng)時(shí)間,然后拋出 TimeoutException 異常。先看一下方法:

__init__(driver, timeout, poll_frequency=POLL_FREQUENCY, ignored_exceptions=None)

·driver: 傳入 WebDriver 實(shí)例;

·timeout: 超時(shí)時(shí)間,單位為秒;

·poll_frequency: 調(diào)用 until 或 until_not 中方法的間隔時(shí)間,默認(rèn)是 0.5 秒;

·ignored_exceptions: 忽略的異常,如果在調(diào)用 until 或 until_not 的過程中拋出這個(gè)元組中的異常,則不中斷代碼,繼續(xù)等待,如果拋出的是這個(gè)元組外的異常,則中斷代碼,拋出異常。默認(rèn)只有 NoSuchElementException。

until(method, message='')

·method: 在等待期間,每隔一段時(shí)間(init 中的 poll_frequency)調(diào)用這個(gè)方法,直到返回值不是 False;

·message: 如果超時(shí),拋出 TimeoutException,將 message 傳入異常。

until_not(method, message='')

until 方法是當(dāng)某條件成立則繼續(xù)執(zhí)行,until_not 方法與之相反,它是當(dāng)某條件不成立則繼續(xù)執(zhí)行,參數(shù)與 until 方法相同。

以去 163 郵箱為例,看一下示例:

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
browser = webdriver.Chrome()
browser.get('https://mail.163.com/')
try:
    # 超時(shí)時(shí)間為 5 秒
    data = WebDriverWait(browser,5).until(
        EC.presence_of_element_located((By.ID,'lbNormal'))
    )
    print(data)
finally:
    browser.quit()

示例中代碼會(huì)等待 5 秒,如果 5 秒內(nèi)找到元素則立即返回,否則會(huì)拋出 TimeoutException 異常,WebDriverWait 默認(rèn)每 0.5 秒調(diào)用一下 ExpectedCondition 直到它返回成功為止。

4.2 隱式等待

當(dāng)我們要找一個(gè)或者一些不能立即可用的元素的時(shí)候,隱式 Waits 會(huì)告訴 WebDriver 輪詢 DOM 指定的次數(shù),默認(rèn)設(shè)置是 0 次,一旦設(shè)定,WebDriver 對(duì)象實(shí)例的整個(gè)生命周期的隱式調(diào)用也就設(shè)定好了??匆幌路椒ǎ?/p>

implicitly_wait(time_to_wait)

隱式等待是設(shè)置了一個(gè)最長(zhǎng)等待時(shí)間 time_to_wait,該時(shí)間是針對(duì)全局設(shè)置的,如果在規(guī)定時(shí)間內(nèi)網(wǎng)頁(yè)加載完成,則執(zhí)行下一步,否則一直等到時(shí)間截止,然后執(zhí)行下一步??吹搅诉@里,我們會(huì)感覺有點(diǎn)像 time.sleep(),它們的區(qū)別是:time.sleep() 必須等待指定時(shí)間后才能繼續(xù)執(zhí)行, time_to_wait 是在指定的時(shí)間范圍加載完成即執(zhí)行,time_to_wait 比 time.sleep() 更靈活一些。

看下示例:

from selenium import webdriver
browser = webdriver.Chrome()
browser.implicitly_wait(5)
browser.get('https://mail.163.com/')
data = browser.find_element_by_id('lbNormal')
print(data)
browser.quit()

5 登錄 163 郵箱

最后,我們用 Selenium 來做個(gè)登錄 163 郵箱的實(shí)戰(zhàn)例子。

5.1 方式一

我們通過地址 https://email2.163.com/ 登錄,如圖所示:

Python爬蟲中的Selenium庫(kù)剖析

從圖中我們發(fā)現(xiàn)直接進(jìn)了 163 郵箱用戶名、密碼登錄頁(yè),我們直接輸入用戶名、密碼,點(diǎn)擊登錄按鈕即可。示例如下:

from selenium import webdriver
browser = webdriver.Chrome()
browser.implicitly_wait(2)
browser.get('https://email2.163.com/')
browser.switch_to.frame(browser.find_element_by_xpath('//iframe[starts-with(@id,"x-URS")]'))
# 自己的用戶名
browser.find_element_by_xpath('//input[@name="email"]').send_keys('xxx')
# 自己的密碼
browser.find_element_by_xpath('//input[@name="password"]').send_keys('xxx')
browser.find_element_by_xpath('//*[@id="dologin"]').click()
print(browser.page_source)
# 關(guān)閉
browser.quit()

5.2 方式二

第二種方式我們使用地址 https://mail.163.com/,先手動(dòng)打開看一下:

Python爬蟲中的Selenium庫(kù)剖析

從圖中我們會(huì)發(fā)現(xiàn),登錄頁(yè)面首先展示的是二維碼登錄方式,因此我們需要先點(diǎn)擊上圖紅框圈住的位置切換到用戶名、密碼的登錄方式,如圖所示:

Python爬蟲中的Selenium庫(kù)剖析

此時(shí),我們先輸入用戶名、密碼,然后點(diǎn)擊登錄按鈕即可。

上述就是小編為大家分享的Python爬蟲中的Selenium庫(kù)剖析了,如果剛好有類似的疑惑,不妨參照上述分析進(jìn)行理解。如果想知道更多相關(guān)知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。

網(wǎng)頁(yè)題目:Python爬蟲中的Selenium庫(kù)剖析
網(wǎng)址分享:http://muchs.cn/article12/pppsdc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供企業(yè)網(wǎng)站制作、ChatGPT、響應(yīng)式網(wǎng)站、網(wǎng)站營(yíng)銷企業(yè)建站、網(wǎng)站制作

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

小程序開發(fā)