溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

如何使用selenium+chromedriver+xpath爬取動(dòng)態(tài)加載信息

發(fā)布時(shí)間:2022-02-10 14:29:18 來源:億速云 閱讀:333 作者:小新 欄目:開發(fā)技術(shù)

這篇文章主要介紹如何使用selenium+chromedriver+xpath爬取動(dòng)態(tài)加載信息,文中介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們一定要看完!

使用selenium實(shí)現(xiàn)動(dòng)態(tài)渲染頁面的爬取,selenium是瀏覽器自動(dòng)化測(cè)試框架,是一個(gè)用于Web應(yīng)用程序測(cè)試的工具,可以直接運(yùn)行在瀏覽器當(dāng)中,并可以驅(qū)動(dòng)瀏覽器執(zhí)行指定的動(dòng)作,如點(diǎn)擊、下拉、填充數(shù)據(jù)、刪除cookie等操作,還可以獲取瀏覽器當(dāng)前頁面的源代碼,就像用戶在瀏覽器中操作一樣。該工具所支持的瀏覽器有IE瀏覽器、Mozilla Firefox以及Google Chrome等。

安裝selenium模塊

首先打開Anaconda Prompt(Anaconda)命令行窗口,然后輸入“pip install selenium“命令(如果沒有安裝Anaconda, 可以在cmd命令行窗口中執(zhí)行安裝模塊的命令),接著按下(回車)鍵,如下圖:

如何使用selenium+chromedriver+xpath爬取動(dòng)態(tài)加載信息

說 明

selenium有很多語言的版本,比如:Java、Ruby、Python等。

下載瀏覽器驅(qū)動(dòng)

selenium模塊安裝完成以后還需要選擇一個(gè)瀏覽器,然后下載對(duì)應(yīng)的瀏覽器驅(qū)動(dòng),此時(shí)才可以通過selenium模塊來控制瀏覽器的操作。這里選擇Chrome瀏覽器Version 98.0.4758.80 (Official Build) (x86_64),然后在(http://chromedriver.storage.googleapis.com/index.html?path=98.0.4758.80/)谷歌瀏覽器驅(qū)動(dòng)中下載瀏覽器驅(qū)動(dòng)。如下圖:

如何使用selenium+chromedriver+xpath爬取動(dòng)態(tài)加載信息

說 明

在下載谷歌瀏覽器驅(qū)動(dòng)時(shí),根據(jù)自己的電腦系統(tǒng)下載對(duì)應(yīng)的瀏覽器驅(qū)動(dòng)。

selenium模塊的使用

谷歌瀏覽器驅(qū)動(dòng)下載完成后, 將名稱為chromedriver.exe文件拖放到/usr/bin 目錄下(python.exe文件的同級(jí)路徑)。然后需要通過Python代碼進(jìn)行谷歌瀏覽器驅(qū)動(dòng)的加載,這樣才可以啟動(dòng)瀏覽器驅(qū)動(dòng)并控制瀏覽器了。

針對(duì)不同瀏覽器有不同的driver。以下列出不同瀏覽器及其對(duì)應(yīng)的driver,如下表:

BrowersDriverLink
ChromeChromedriver(.exe)http://chromedriver.storage.googleapis.com/index.html
Internet ExplorerIEDriverServer.exehttp://selenium-release.storage.googleapis.com/index.html
EdgeMicrosoftWebDriver.msihttp://go.microsoft.com/fwlink/?LinkId=619687
Firefoxgeckodriver(.exe)https://github.com/mozilla/geckodriver/releases/
PhantomJSphantomjs(.exe)http://phantomjs.org/
Operaoperadriver(.exe)https://github.com/operasoftware/operachromiumdriver/releases
SafariSafariDriver.safariextzhttp://selenium-release.storage.googleapis.com/index.html

獲取京東商品信息,示例代碼如下:

#_*_coding:utf-8_*_
# 作者      :liuxiaowei
# 創(chuàng)建時(shí)間   :2/7/22 6:43 PM
# 文件      :獲取京東商品信息.py
# IDE      :PyCharm

from selenium import webdriver  # 導(dǎo)入瀏覽器驅(qū)動(dòng)模塊
from selenium.webdriver.support.wait import WebDriverWait  # 導(dǎo)入等待類
from selenium.webdriver.support import expected_conditions as EC  # 等待條件
from selenium.webdriver.common.by import By                       # 節(jié)點(diǎn)定位

#from selenium.webdriver.chrome.service import Service

try:
    # 創(chuàng)建谷歌瀏覽器驅(qū)動(dòng)參數(shù)對(duì)象
    chrome_options = webdriver.ChromeOptions()
    # 不加載圖片
    prefs = {"profile.managed_default_content_settings.images": 2}
    chrome_options.add_experimental_option("prefs", prefs)
    # 使用headless無界面瀏覽器模式
    chrome_options.add_argument('--headless')
    chrome_options.add_argument('--disable-gpu')
    # 加載谷歌瀏覽器驅(qū)動(dòng)
		driver = webdriver.Chrome(options = chrome_options, executable_path='chromedriver')
    # 請(qǐng)求地址
    driver.get('https://item.jd.com/12353915.html')
    wait = WebDriverWait(driver,10)    # 等待10秒
    # 等待頁面加載class名稱為m-item-inner的節(jié)點(diǎn),該節(jié)點(diǎn)中包含商品信息
    wait.until(EC.presence_of_element_located((By.CLASS_NAME,"w")))

    # 獲取name節(jié)點(diǎn)中所有div節(jié)點(diǎn)
    name_div1 = driver.find_element(By.XPATH,'//div[@class="sku-name"]')
    name_div2 = driver.find_element(By.XPATH, '//div[@class="news"]/div[@class="item hide"]')
    name_div3 = driver.find_element(By.XPATH, '//div[@class="p-author"]')
    summary_price = driver.find_element(By.XPATH, '//div[@class="summary-price J-summary-price"]')
    print('提取的商品標(biāo)題如下:')
    print(name_div1.text)         # 打印商品標(biāo)題
    print('提取的商品宣傳語如下:')
    print(name_div2.text)         # 打印宣傳語
    print('提取的編著信息如下:')
    print(name_div3.text)         # 打印編著信息
    print('提取的價(jià)格信息如下:')
    print(summary_price.text.strip('降價(jià)通知'))       # 打印價(jià)格信息
    driver.quit()  # 退出瀏覽器驅(qū)動(dòng)
except Exception as e:
    print('顯示異常信息!', e)

程序運(yùn)行結(jié)果如下:

提取的商品標(biāo)題如下:
零基礎(chǔ)學(xué)Python(Python3.9全彩版)(編程入門 項(xiàng)目實(shí)踐 同步視頻)
提取的商品宣傳語如下:
彩色代碼更易學(xué)。Python編程從入門到實(shí)踐書籍,網(wǎng)絡(luò)爬蟲、游戲開發(fā)、數(shù)據(jù)分析等深度學(xué)習(xí)。贈(zèng)全程視頻+源碼+課后題+實(shí)物掛圖+學(xué)習(xí)應(yīng)用地圖+電子書+圖書答疑
提取的編著信息如下:
明日科技 著
提取的價(jià)格信息如下:
京 東 價(jià)
¥ 72.00 [9.03折] [定價(jià) ¥79.80] 

selenium 模塊的常用方法

selenium 模塊支持多種獲取網(wǎng)頁節(jié)點(diǎn)的方法,其中比較常用的方法如下表:

selenium 模塊獲取網(wǎng)頁節(jié)點(diǎn)的常用方法及描述

常用方法描 述
driver.find_element_by_id()根據(jù)id獲取節(jié)點(diǎn),參數(shù)為字符類型id對(duì)應(yīng)的值
driver.find_element_by_name()根據(jù)name獲取節(jié)點(diǎn),參數(shù)為字符類型name對(duì)應(yīng)的值
driver.find_element_by_xpath()根據(jù)XPATH獲取節(jié)點(diǎn),參數(shù)為字符類型XPATH對(duì)應(yīng)的值
driver.find_element_by_link_text()根據(jù)鏈接文本獲取節(jié)點(diǎn),參數(shù)為字符類型鏈接文本
driver.find_element_by_tag_name()根據(jù)節(jié)點(diǎn)名稱獲取節(jié)點(diǎn),參數(shù)為字符類型節(jié)點(diǎn)文本
driver.find_element_by_class_name()根據(jù)class獲取節(jié)點(diǎn),參數(shù)為字符類型class對(duì)應(yīng)的值
driver.find_element_by_css_selector()根據(jù)CSS選擇器獲取節(jié)點(diǎn),參數(shù)為字符類型的CSS選擇器語法

說 明

上表所有獲取節(jié)點(diǎn)的方法均為獲取單個(gè)節(jié)點(diǎn)的方法,如需要獲取符合條件的多個(gè)節(jié)點(diǎn)時(shí),可以在對(duì)應(yīng)方法中element后面添加s即可。

除了以上常用的獲取節(jié)點(diǎn)的方法外,還可以使用driver.find_element()方法獲取單個(gè)節(jié)點(diǎn),使用driver.find_elements()方法獲取多個(gè)節(jié)點(diǎn)。只是在調(diào)用這兩種方法時(shí),需要為其指定by與value參數(shù)。其中by參數(shù)表示獲取節(jié)點(diǎn)的方式,而value為獲取方式對(duì)應(yīng)的值(可以理解為條件)。示例代碼如下:

		# 獲取商品信息節(jié)點(diǎn)中的所有div節(jié)點(diǎn)
  	name_div = driver.find_element(By.XPATH,'//div[@class="itemInfo-wrap"]').find_elements(By.TAG_NAME, 'div')

    # 提取并輸出單個(gè)div節(jié)點(diǎn)的內(nèi)容
    print('提取的商品標(biāo)題如下:')
    print(name_div[0].text)         # 打印商品標(biāo)題
    print('提取的商品宣傳語如下:')		 # 打印商品宣傳語
    print(name_div[1].text)

程序運(yùn)行結(jié)果如下:

提取的商品標(biāo)題如下:
零基礎(chǔ)學(xué)Python(Python3.9全彩版)(編程入門 項(xiàng)目實(shí)踐 同步視頻)
提取的商品宣傳語如下:
彩色代碼更易學(xué)。Python編程從入門到實(shí)踐書籍,網(wǎng)絡(luò)爬蟲、游戲開發(fā)、數(shù)據(jù)分析等深度學(xué)習(xí)。贈(zèng)全程視頻+源碼+課后題+實(shí)物掛圖+學(xué)習(xí)應(yīng)用地圖+電子書+圖書答疑
明日科技 著

說 明

以上代碼中首先使用find_element()方法獲取class值為“itemInfo-warp“的整個(gè)節(jié)點(diǎn),然后在該節(jié)點(diǎn)中通過find_elements()方法獲取節(jié)點(diǎn)名稱div的所有節(jié)點(diǎn),最后通過name_div[0].text,name_div[1].text獲取所有div中第一個(gè)第二個(gè)div內(nèi)的文本信息。

下面是By的其他屬性及用法

By屬性用 法
By.ID表示根據(jù)ID值獲取對(duì)應(yīng)的單個(gè)或多個(gè)節(jié)點(diǎn)
By.LINK_TEXT表示根據(jù)鏈接文本獲取對(duì)應(yīng)的單個(gè)或多個(gè)節(jié)點(diǎn)
By.PARTIAL_LINK_TEXT表示根據(jù)部分鏈接文本獲取對(duì)應(yīng)的單個(gè)或多個(gè)節(jié)點(diǎn)
By.NAME根據(jù)name值獲取對(duì)應(yīng)的單個(gè)或多個(gè)節(jié)點(diǎn)
By.TAG_NAME根據(jù)節(jié)點(diǎn)名稱獲取單個(gè)或多個(gè)節(jié)點(diǎn)
By.CLASS_NAME根據(jù)class值獲取單個(gè)或多個(gè)節(jié)點(diǎn)
By.CSS_SELECTOR根據(jù)CSS選擇器獲取單個(gè)或多個(gè)節(jié)點(diǎn),對(duì)應(yīng)的value為字符串CSS的位置
By.XPATH根據(jù)By.XPATH獲取單個(gè)或多個(gè)節(jié)點(diǎn),對(duì)應(yīng)的value字符串節(jié)點(diǎn)位置

在使用selenium模塊獲取某個(gè)節(jié)點(diǎn)中的某個(gè)屬性所對(duì)應(yīng)的值時(shí),可以使用get_attribute()方法來實(shí)現(xiàn),示例代碼如下:

# 根據(jù)XPath定位獲取指定節(jié)點(diǎn)中的href地址
href = driver.find_element(By.XPATH, '//div[@id="p-author"]/a').get_attribute('href')
print('指定節(jié)點(diǎn)中的地址信息如下:')

程序運(yùn)行結(jié)果如下:

指定節(jié)點(diǎn)中的地址信息如下:
https://book.jd.com/writer/%E6%98%8E%E6%97%A5%E7%A7%91%E6%8A%80_1.html

總 結(jié)

本案例中需要注意的是加載瀏覽器驅(qū)動(dòng),一定要指定chromedriver的路徑。語法如下:

 # 加載谷歌瀏覽器驅(qū)動(dòng)
driver = webdriver.Chrome(options = chrome_options, executable_path='chromedriver')  # 本例驅(qū)動(dòng)與爬蟲程序在同一路																																											徑

關(guān)閉瀏覽器頁面

driver.close():關(guān)閉當(dāng)前頁面
driver.quit():退出整個(gè)瀏覽器

以上是“如何使用selenium+chromedriver+xpath爬取動(dòng)態(tài)加載信息”這篇文章的所有內(nèi)容,感謝各位的閱讀!希望分享的內(nèi)容對(duì)大家有幫助,更多相關(guān)知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI