Python爬蟲使用Selenium+PhantomJS抓取Ajax和動態(tài)HTML內(nèi)容
1、引言
在Python網(wǎng)絡(luò)爬蟲內(nèi)容提取器一文我們詳細講解了核心部件:可插拔的內(nèi)容提取器類gsExtractor。本文記錄了確定gsExtractor的技術(shù)路線過程中所做的編程實驗。這是第二部分,第一部分實驗了用xslt方式一次性提取靜態(tài)網(wǎng)頁內(nèi)容并轉(zhuǎn)換成xml格式。留下了一個問題:javascript管理的動態(tài)內(nèi)容怎樣提???那么本文就回答這個問題。
2、提取動態(tài)內(nèi)容的技術(shù)部件
在上一篇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)頁源碼是找不到的),如下圖:

第一步:利用集搜客謀數(shù)臺的直觀標注功能,可以極快速度自動生成一個調(diào)試好的抓取規(guī)則,其實是一個標準的xslt程序,如下圖,把生成的xslt程序拷貝到下面的程序中即可。注意:本文只是記錄實驗過程,實際系統(tǒng)中,將采用多種方式把xslt程序注入到內(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="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>
<價格>
<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']/h1/text()"/>
<xsl:value-of select="*[@id='name']/h1/text()"/>
<xsl:if test="@id='name'">
<xsl:value-of select="h1/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)頁中的手機名稱和價格被正確抓取下來了

4、接下來閱讀
至此,我們通過兩篇文章演示怎樣抓取靜態(tài)和動態(tài)網(wǎng)頁內(nèi)容,都采用了xslt一次性將需要的內(nèi)容從網(wǎng)頁上提取出來,其實xslt是一個比較復雜的程序語言,如果手工編寫xslt,那么還不如寫成離散的xpath。如果這個xslt不是手工寫出來的,而是程序自動生成的,這就有意義了,程序員再也不要花時間編寫和調(diào)測抓取規(guī)則了,這是很費時費力的工作。下一篇《1分鐘快速生成用于網(wǎng)頁內(nèi)容提取的xslt》將講述怎樣生成xslt。
5、集搜客GooSeeker開源代碼下載源
1. GooSeeker開源Python網(wǎng)絡(luò)爬蟲GitHub源
6、文檔修改歷史
2016-05-26:V2.0,增補文字說明
2016-05-29:V2.1,增加第五章:源代碼下載源,并更換github源的網(wǎng)址
相關(guān)文章
使用python的pandas讀取excel文件中的數(shù)據(jù)詳情
這篇文章主要介紹了使用python的pandas讀取excel文件中的數(shù)據(jù)詳情,文章圍繞主題展開詳細的內(nèi)容介紹,具有一定的參考價值,需要的小伙伴可以參考一下2022-09-09
Pandas Dataframe數(shù)據(jù)幀的迭代之iterrows(),itertuples(),items()詳
這篇文章主要介紹了Pandas Dataframe數(shù)據(jù)幀的迭代之iterrows(),itertuples(),items()使用,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2025-04-04
Python使用xlrd模塊操作Excel數(shù)據(jù)導入的方法
這篇文章主要介紹了Python使用xlrd模塊操作Excel數(shù)據(jù)導入的方法,涉及Python操作xlrd模塊的技巧,需要的朋友可以參考下2015-05-05

