溫馨提示×

溫馨提示×

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

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Python爬蟲如何使用Selenium+PhantomJS抓取Ajax和動態(tài)HTML內(nèi)容

發(fā)布時間:2021-08-09 09:28:59 來源:億速云 閱讀:148 作者:小新 欄目:開發(fā)技術

這篇文章將為大家詳細講解有關Python爬蟲如何使用Selenium+PhantomJS抓取Ajax和動態(tài)HTML內(nèi)容,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。

1、引言

在Python網(wǎng)絡爬蟲內(nèi)容提取器一文我們詳細講解了核心部件:可插拔的內(nèi)容提取器類gsExtractor。本文記錄了確定gsExtractor的技術路線過程中所做的編程實驗。這是第二部分,第一部分實驗了用xslt方式一次性提取靜態(tài)網(wǎng)頁內(nèi)容并轉(zhuǎn)換成xml格式。

2、提取動態(tài)內(nèi)容的技術部件

在上一篇python使用xslt提取網(wǎng)頁數(shù)據(jù)中,要提取的內(nèi)容是直接從網(wǎng)頁的source code里拿到的。但是一些Ajax動態(tài)內(nèi)容是在source code找不到的,就要找合適的程序庫把異步或動態(tài)加載的內(nèi)容加載上來,交給本項目的提取器進行提取。

python可以使用selenium執(zhí)行javascript,selenium可以讓瀏覽器自動加載頁面,獲取需要的數(shù)據(jù)。selenium自己不帶瀏覽器,可以使用第三方瀏覽器如Firefox,Chrome等,也可以使用headless瀏覽器如PhantomJS在后臺執(zhí)行。

3、源代碼和實驗過程

假如我們要抓取京東手機頁面的手機名稱和價格(價格在網(wǎng)頁源碼是找不到的),如下圖:

Python爬蟲如何使用Selenium+PhantomJS抓取Ajax和動態(tài)HTML內(nèi)容

第一步:利用集搜客謀數(shù)臺的直觀標注功能,可以極快速度自動生成一個調(diào)試好的抓取規(guī)則,其實是一個標準的xslt程序,如下圖,把生成的xslt程序拷貝到下面的程序中即可。注意:本文只是記錄實驗過程,實際系統(tǒng)中,將采用多種方式把xslt程序注入到內(nèi)容提取器重。

Python爬蟲如何使用Selenium+PhantomJS抓取Ajax和動態(tài)HTML內(nèi)容

第二步:執(zhí)行如下代碼(在windows10, python3.2下測試通過,源代碼下載地址請見文章末尾GitHub),請注意:xslt是一個比較長的字符串,如果刪除這個字符串,代碼沒有幾行,足以見得Python之強大

#/usr/bin/python 
from urllib import request 
from lxml import etree 
from selenium import webdriver 
import time 
 
# 京東手機商品頁面 
url = "http://item.jd.com/1312640.html" 
 
# 下面的xslt是通過集搜客的謀數(shù)臺圖形界面自動生成的 
xslt_root = etree.XML("""\ 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" > 
<xsl:template match="/"> 
<商品> 
<xsl:apply-templates select="//*[@id='itemInfo' and count(.//*[@id='summary-price']/div[position()=2]/strong/text())>0 and count(.//*[@id='name']/h2/text())>0]" mode="商品"/> 
</商品> 
</xsl:template> 
 
<xsl:template match="//*[@id='itemInfo' and count(.//*[@id='summary-price']/div[position()=2]/strong/text())>0 and count(.//*[@id='name']/h2/text())>0]" mode="商品"> 
<item> 
<價格> 
<xsl:value-of select="*//*[@id='summary-price']/div[position()=2]/strong/text()"/> 
<xsl:value-of select="*[@id='summary-price']/div[position()=2]/strong/text()"/> 
<xsl:if test="@id='summary-price'"> 
<xsl:value-of select="div[position()=2]/strong/text()"/> 
</xsl:if> 
</價格> 
<名稱> 
<xsl:value-of select="*//*[@id='name']/h2/text()"/> 
<xsl:value-of select="*[@id='name']/h2/text()"/> 
<xsl:if test="@id='name'"> 
<xsl:value-of select="h2/text()"/> 
</xsl:if> 
</名稱> 
</item> 
</xsl:template> 
</xsl:stylesheet>""") 
 
# 使用webdriver.PhantomJS 
browser = webdriver.PhantomJS(executable_path='C:\\phantomjs-2.1.1-windows\\bin\\phantomjs.exe') 
browser.get(url) 
time.sleep(3) 
 
transform = etree.XSLT(xslt_root) 
 
# 執(zhí)行js得到整個dom 
html = browser.execute_script("return document.documentElement.outerHTML") 
doc = etree.HTML(html) 
# 用xslt從dom中提取需要的字段 
result_tree = transform(doc) 
print(result_tree)

第三步:下圖可以看到,網(wǎng)頁中的手機名稱和價格被正確抓取下來了

Python爬蟲如何使用Selenium+PhantomJS抓取Ajax和動態(tài)HTML內(nèi)容

關于“Python爬蟲如何使用Selenium+PhantomJS抓取Ajax和動態(tài)HTML內(nèi)容”這篇文章就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,使各位可以學到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。

向AI問一下細節(jié)

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

AI