第二章 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,源代碼和實驗過程

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

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

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

#/usr/bin/pythonnfrom urllib import requestnfrom lxml import etreenfrom selenium import webdrivernimport timenn# 京東手機商品頁面nurl = "http://item.jd.com/1312640.html"nn# 下面的xslt是通過集搜客的謀數台圖形界面自動生成的nxslt_root = etree.XML("""n<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" >n<xsl:template match="/">n<商品>n<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="商品"/>n</商品>n</xsl:template>nn<xsl:template match="//*[@id=itemInfo and count(.//*[@id=summary-price]/div[position()=2]/strong/text())>0 and count(.//*[@id=name]/h1/text())>0]" mode="商品">n<item>n<價格>n<xsl:value-of select="*//*[@id=summary-price]/div[position()=2]/strong/text()"/>n<xsl:value-of select="*[@id=summary-price]/div[position()=2]/strong/text()"/>n<xsl:if test="@id=summary-price">n<xsl:value-of select="div[position()=2]/strong/text()"/>n</xsl:if>n</價格>n<名稱>n<xsl:value-of select="*//*[@id=name]/h1/text()"/>n<xsl:value-of select="*[@id=name]/h1/text()"/>n<xsl:if test="@id=name">n<xsl:value-of select="h1/text()"/>n</xsl:if>n</名稱>n</item>n</xsl:template>n</xsl:stylesheet>""")nn# 使用webdriver.PhantomJSnbrowser = webdriver.PhantomJS(executable_path=C:phantomjs-2.1.1-windowsbinphantomjs.exe)nbrowser.get(url)ntime.sleep(3)nntransform = etree.XSLT(xslt_root)nn# 執行js得到整個domnhtml = browser.execute_script("return document.documentElement.outerHTML")ndoc = etree.HTML(html)n# 用xslt從dom中提取需要的欄位nresult_tree = transform(doc)nprint(result_tree)n

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

4,接下來閱讀

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

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

1. GooSeeker開源Python網路爬蟲GitHub下載源

6,文檔修改歷史

  • 2016-05-26:V2.0,增補文字說明

  • 2016-05-29:V2.1,增加第五章:源代碼下載源,並更換github源的網址

上一章 Python使用xslt提取網頁數據 <<<<<首頁>>>>> 下一章 Python讀取PDF內容


推薦閱讀:

什麼樣的C++代碼不開O2沒事,一開O2就會出錯?
為什麼很多人喜歡 Python?
怎麼反駁大學老師說做軟體很簡單的觀點?
關於技術寫作的優秀 Blog
自己寫的程序被殺毒軟體殺了怎麼辦?

TAG:Python | 爬虫计算机网络 | 编程 |