Python爬蟲使用Selenium+PhantomJS抓取Ajax和動態HTML內容

1,引言

Python網絡爬蟲內容提取器一文咱們詳細講解了核心部件:可插拔的內容提取器類gsExtractor。本文記錄了肯定gsExtractor的技術路線過程當中所作的編程實驗。這是第二部分,第一部分實驗了用xslt方式一次性提取靜態網頁內容並轉換成xml格式。留下了一個問題:javascript管理的動態內容怎樣提取?那麼本文就回答這個問題。


2,提取動態內容的技術部件

在上一篇python使用xslt提取網頁數據中,要提取的內容是直接從網頁的source code裏拿到的。可是一些Ajax動態內容是在source code找不到的,就要找合適的程序庫把異步或動態加載的內容加載上來,交給本項目的提取器進行提取。

python可使用selenium執行javascript,selenium可讓瀏覽器自動加載頁面,獲取須要的數據。selenium本身不帶瀏覽器,可使用第三方瀏覽器如Firefox,Chrome等,也可使用headless瀏覽器如PhantomJS在後臺執行。

3,源代碼和實驗過程

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



第一步:利用集搜客謀數臺的直觀標註功能,能夠極快速度自動生成一個調試好的抓取規則,實際上是一個標準的xslt程序,以下圖,把生成的xslt程序拷貝到下面的程序中便可。注意:本文只是記錄實驗過程,實際系統中,將採用多種方式把xslt程序注入到內容提取器重。html



第二步:執行以下代碼(在windows10, python3.2下測試經過),請注意:xslt是一個比較長的字符串,若是刪除這個字符串,代碼沒有幾行,足以見得Python之強大java

#/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是經過集搜客的謀數臺圖形界面自動生成的
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']/h1/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']/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)

# 執行js獲得整個dom
html = browser.execute_script("return document.documentElement.outerHTML")
doc = etree.HTML(html)
# 用xslt從dom中提取須要的字段
result_tree = transform(doc)
print(result_tree)


第三步:下圖能夠看到,網頁中的手機名稱和價格被正確抓取下來了python


4,接下來閱讀

至此,咱們經過兩篇文章演示怎樣抓取靜態和動態網頁內容,都採用了xslt一次性將須要的內容從網頁上提取出來,其實xslt是一個比較複雜的程序語言,若是手工編寫xslt,那麼還不如寫成離散的xpath。若是這個xslt不是手工寫出來的,而是程序自動生成的,這就有意義了,程序員不再要花時間編寫和調測抓取規則了,這是很費時費力的工做。下一篇《1分鐘快速生成用於網頁內容提取的xslt》將講述怎樣生成xslt。

5,集搜客GooSeeker開源代碼下載源git

1. GooSeeker開源Python網絡爬蟲GitHub源程序員

6,文檔修改歷史github

2016-05-26:V2.0,增補文字說明
2016-05-29:V2.1,增長第五章:源代碼下載源,並更換github源的網址web

相關文章
相關標籤/搜索