Python爬蟲(chóng)使用Selenium+PhantomJS抓取Ajax和動(dòng)態(tài)HTML內(nèi)容
1、引言
在Python網(wǎng)絡(luò)爬蟲(chóng)內(nèi)容提取器一文我們?cè)敿?xì)講解了核心部件:可插拔的內(nèi)容提取器類(lèi)gsExtractor。本文記錄了確定gsExtractor的技術(shù)路線過(guò)程中所做的編程實(shí)驗(yàn)。這是第二部分,第一部分實(shí)驗(yàn)了用xslt方式一次性提取靜態(tài)網(wǎng)頁(yè)內(nèi)容并轉(zhuǎn)換成xml格式。留下了一個(gè)問(wèn)題:javascript管理的動(dòng)態(tài)內(nèi)容怎樣提取?那么本文就回答這個(gè)問(wèn)題。
2、提取動(dòng)態(tài)內(nèi)容的技術(shù)部件
在上一篇python使用xslt提取網(wǎng)頁(yè)數(shù)據(jù)中,要提取的內(nèi)容是直接從網(wǎng)頁(yè)的source code里拿到的。但是一些Ajax動(dòng)態(tài)內(nèi)容是在source code找不到的,就要找合適的程序庫(kù)把異步或動(dòng)態(tài)加載的內(nèi)容加載上來(lái),交給本項(xiàng)目的提取器進(jìn)行提取。
python可以使用selenium執(zhí)行javascript,selenium可以讓瀏覽器自動(dòng)加載頁(yè)面,獲取需要的數(shù)據(jù)。selenium自己不帶瀏覽器,可以使用第三方瀏覽器如Firefox,Chrome等,也可以使用headless瀏覽器如PhantomJS在后臺(tái)執(zhí)行。
3、源代碼和實(shí)驗(yàn)過(guò)程
假如我們要抓取京東手機(jī)頁(yè)面的手機(jī)名稱(chēng)和價(jià)格(價(jià)格在網(wǎng)頁(yè)源碼是找不到的),如下圖:

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

第二步:執(zhí)行如下代碼(在windows10, python3.2下測(cè)試通過(guò),源代碼下載地址請(qǐng)見(jiàn)文章末尾GitHub),請(qǐng)注意:xslt是一個(gè)比較長(zhǎng)的字符串,如果刪除這個(gè)字符串,代碼沒(méi)有幾行,足以見(jiàn)得Python之強(qiáng)大
#/usr/bin/python
from urllib import request
from lxml import etree
from selenium import webdriver
import time
# 京東手機(jī)商品頁(yè)面
url = "http://item.jd.com/1312640.html"
# 下面的xslt是通過(guò)集搜客的謀數(shù)臺(tái)圖形界面自動(dòng)生成的
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="http://*[@id='itemInfo' and count(.//*[@id='summary-price']/div[position()=2]/strong/text())>0 and count(.//*[@id='name']/h1/text())>0]" mode="商品"/>
</商品>
</xsl:template>
<xsl:template match="http://*[@id='itemInfo' and count(.//*[@id='summary-price']/div[position()=2]/strong/text())>0 and count(.//*[@id='name']/h1/text())>0]" mode="商品">
<item>
<價(jià)格>
<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>
</價(jià)格>
<名稱(chēng)>
<xsl:value-of select="*//*[@id='name']/h1/text()"/>
<xsl:value-of select="*[@id='name']/h1/text()"/>
<xsl:if test="@id='name'">
<xsl:value-of select="h1/text()"/>
</xsl:if>
</名稱(chēng)>
</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得到整個(gè)dom
html = browser.execute_script("return document.documentElement.outerHTML")
doc = etree.HTML(html)
# 用xslt從dom中提取需要的字段
result_tree = transform(doc)
print(result_tree)
第三步:下圖可以看到,網(wǎng)頁(yè)中的手機(jī)名稱(chēng)和價(jià)格被正確抓取下來(lái)了

4、接下來(lái)閱讀
至此,我們通過(guò)兩篇文章演示怎樣抓取靜態(tài)和動(dòng)態(tài)網(wǎng)頁(yè)內(nèi)容,都采用了xslt一次性將需要的內(nèi)容從網(wǎng)頁(yè)上提取出來(lái),其實(shí)xslt是一個(gè)比較復(fù)雜的程序語(yǔ)言,如果手工編寫(xiě)xslt,那么還不如寫(xiě)成離散的xpath。如果這個(gè)xslt不是手工寫(xiě)出來(lái)的,而是程序自動(dòng)生成的,這就有意義了,程序員再也不要花時(shí)間編寫(xiě)和調(diào)測(cè)抓取規(guī)則了,這是很費(fèi)時(shí)費(fèi)力的工作。下一篇《1分鐘快速生成用于網(wǎng)頁(yè)內(nèi)容提取的xslt》將講述怎樣生成xslt。
5、集搜客GooSeeker開(kāi)源代碼下載源
1. GooSeeker開(kāi)源Python網(wǎng)絡(luò)爬蟲(chóng)GitHub源
6、文檔修改歷史
2016-05-26:V2.0,增補(bǔ)文字說(shuō)明
2016-05-29:V2.1,增加第五章:源代碼下載源,并更換github源的網(wǎng)址
相關(guān)文章
pandas參數(shù)設(shè)置的實(shí)用小技巧
這篇文章主要給大家介紹了關(guān)于pandas參數(shù)設(shè)置的實(shí)用小技巧,文中通過(guò)實(shí)例代碼結(jié)束的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用pandas具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-08-08
tensorflow 實(shí)現(xiàn)打印pb模型的所有節(jié)點(diǎn)
今天小編就為大家分享一篇tensorflow 實(shí)現(xiàn)打印pb模型的所有節(jié)點(diǎn),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-01-01
python讀取多類(lèi)型文件夾中的文檔內(nèi)容
無(wú)論我們使用哪種編程語(yǔ)言,處理文件對(duì)于每個(gè)程序員都是必不可少的,本文主要介紹了python讀取多類(lèi)型文件夾中的文檔內(nèi)容,具有一定的參考價(jià)值,感興趣的可以了解一下2024-03-03
Python中對(duì)元組和列表按條件進(jìn)行排序的方法示例
這篇文章主要介紹了Python中對(duì)元組和列表按條件進(jìn)行排序的方法示例,需要的朋友可以參考下2015-11-11
jupyter notebook指定啟動(dòng)目錄的方法
這篇文章主要介紹了jupyter notebook指定啟動(dòng)目錄的方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-03-03
Python OpenCV視頻截取并保存實(shí)現(xiàn)代碼
這篇文章主要介紹了Python OpenCV視頻截取并保存實(shí)現(xiàn)代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-11-11
Python面向?qū)ο蟮某绦蛟O(shè)計(jì)詳情
這篇文章主要介紹了Python面向?qū)ο蟮某绦蛟O(shè)計(jì)詳情,面向?qū)ο蟮某绦蛟O(shè)計(jì)在Python中具有非常重要的地位,熟練的使用面向?qū)ο缶幊棠軌驗(yàn)槲覀兊腜ython編程提供很多的便利之處,希望您閱讀完本文后能夠有所收獲2022-01-01
Python使用asyncio包處理并發(fā)的實(shí)現(xiàn)代碼
這篇文章主要介紹了Python使用asyncio包處理并發(fā),asyncio包使用事件循環(huán)驅(qū)動(dòng)的協(xié)程實(shí)現(xiàn)并發(fā),本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì)對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-12-12

