1. 程式人生 > >Python爬蟲使用Selenium+PhantomJS抓取Ajax和動態HTML內容

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/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)

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


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

5,集搜客GooSeeker開原始碼下載源


6,文件修改歷史
2016-05-26:V2.0,增補文字說明
2016-05-29:V2.1,增加第五章:原始碼下載源,並更換github源的網址

相關推薦

Python爬蟲使用Selenium+PhantomJSAjax動態HTML內容

1,引言在Python網路爬蟲內容提取器一文我們詳細講解了核心部件:可插拔的內容提取器類gsExtractor。本文記錄了確定gsExtractor的技術路線過程中所做的程式設計實驗。這是第二部分,第一部分實驗了用xslt方式一次性提取靜態網頁內容並轉換成xml格式。留下了

Java爬蟲——phantomjsajax動態載入網頁

(說好的第二期終於來了 >_<) 1、phantomjs介紹 phantomjs實現了一個無介面的webkit瀏覽器。雖然沒有介面,但dom渲染、js執行、網路訪問、canvas/svg繪製等功能都很完備,在頁面抓取、頁面輸出、自動化測試等方面有廣泛的應用。

python爬蟲 selenium+phantomjs動態解析網頁,加載頁面成功,返回空數據

img 使用 一個 做的 ima 導數 技術分享 信息 之前 廢話不多說,直接說重點: 剛開始做的時候,代理IP,頭部信息池,都已經做好了,使用selenium+phantomjs獲取js動態加載後的源碼 起初挺好的,能出來動態加載後的源碼,但是運行了幾次之後,電腦有點卡頓

C#使用Selenium+PhantomJS數據

16px proxy pan 使用 AD driver def ima avi 本文主要介紹了C#使用Selenium+PhantomJS抓取數據的方法步驟,具有很好的參考價值,下面跟著小編一起來看下吧 手頭項目需要抓取一個用js渲染出來的網站中的數據。使用常用的htt

C#利用phantomJSAjAX動態頁面

tin 文件 stringbu == 導致 style 間隔 edi zip壓縮 在C#中,一般常用的請求方式,就是利用HttpWebRequest創建請求,返回報文。但是有時候遇到到動態加載的頁面,卻只能抓取部分內容,無法抓取到動態加載的內容。 如果遇到這種的話,推薦

Python爬蟲實戰:並儲存百度雲資源(附程式碼)

尋找並分析百度雲的轉存api 首先你得有一個百度雲盤的賬號,然後登入,用瀏覽器(這裡用火狐瀏覽器做示範)開啟一個分享連結。F12開啟控制檯進行抓包。手動進行轉存操作:全選檔案->儲存到網盤->選擇路徑->確定。點選【確定】前建議先清空一下抓包記錄,這樣可以精確定位到轉存的api,這就是

Python爬蟲案例:豆瓣程式設計類高評分書籍

對於很多正在學習計算機的朋友來說,選擇合適的學習材料是非常重要的。 本文將通過 Python 來爬取豆瓣程式設計類評分大於 9.0 的書籍。 此案例很適合入門爬蟲的朋友學習,總共也就 3 個函式。 下圖是最終的結果: 下面進入正題: 一、採集源分析: 首先我們

[Python爬蟲] 7-Charles微信小程式

最近在嘗試抓取微信的小程式,用到了Charles,微信小程式的話需要使用HTTPS抓包,網上有些教程內容有步驟的缺失,所以重新整理一份傻瓜式的教程,環境WIN10+IOS,內容基於Roy_Liang前輩

在使用pythonselenium動態網頁時,瀏覽器內容出現空白的解決方式

轉載請標明出處,謝謝~。 我使用的版本: 1、python 3.7 (IDE 用的 pycharm) 2、selenium(通過pip install 安裝的最新版本:3.14 時間:2018.9.6 ) 3、 geckodriver.exe 21.0 4、fi

[python爬蟲] Selenium常見元素定位方法操作的學習介紹

        這篇文章主要Selenium+Python自動測試或爬蟲中的常見定位方法、滑鼠操作、鍵盤操作介紹, 一. 定位元素方法 find_element_by_idfind_element_by_namefind_element_by_xpathfind_ele

Project 3 :Python爬蟲原始碼實現1000條西刺免費代理IP-HTTPS並儲存讀取

基於python3.6—pycharm編寫的,都已經除錯過了,歡迎大家提出交流意見。關於一些基礎的資料網頁分析(比如為什麼是這個url)沒有過多贅述,看不懂的自行百度。原始碼可以直接拷貝執行。轉載請註明來源。import requests import re ''' Pyt

Python爬蟲實戰之淘寶MM照片(一)

背景   Python爬蟲系列教程的一次實戰,然而淘寶進行過頁面改版,現在已經沒有淘寶MM這個版面,取而代之的是淘女郎。改版後,頁面是使用JS渲染的,並不能直接通過url來切換頁碼。該系列教程後續講到

Python中使用PhantomJSJavascript網頁資料

有些網頁不是靜態載入的,而是通過javascirpt函式動態載入網頁,比如下面這個網頁,表格中的看漲合約和看跌合約的資料都是通過javascirpt函式從後臺載入。僅僅使用beautifulsoup並不能抓到這個表格中的資料。 查詢資料,發現可以使用P

爬蟲】Scrapy爬蟲框架教程-- AJAX非同步載入網頁

前一段時間工作太忙一直沒有時間繼續更新這個教程,最近離職了趁著這段時間充裕趕緊多寫點東西。之前我們已經簡單瞭解了對普通網頁的抓取,今天我就給大家講一講怎麼去抓取採用Ajax非同步加的網站。 工具和環境 語言:python 2.7 IDE: Pycharm 瀏覽器:Ch

Python爬蟲一步步房產資訊

嗯,這一篇文章更多是想分享一下我的網頁分析方法。玩爬蟲也快有一年了,基本程式碼熟悉之後,我感覺寫一個爬蟲最有意思的莫過於研究其網頁背後的載入過程了,也就是分析過程,對效能沒有特殊要求的情況下,程式設計一般是小事。 以深圳地區的X房網為例吧。XX房網的主頁非常簡潔,輸入相

Python爬蟲之一:貓眼電影TOP100

執行平臺: Windows Python版本: Python3.6 IDE: Sublime Text 其他工具: Chrome瀏覽器1. 抓取單頁內容瀏覽器開啟貓眼電影首頁,點選“榜單”,然後再點選”TOP100榜”,就能看到想要的了。接下來通過程式碼來獲取網頁的HTML

Python爬蟲 selenium+PhantomJS 介紹、安裝、使用

之前用Java做過爬蟲,也用到過selenium和PhantomJS。最近痴迷於python爬蟲,將selenium+PhantomJS在python中的應用詳細總結一下。 一、Selenium介紹 Selenium 是什麼?一句話,自動化測試工具。它支援各

[python爬蟲] Selenium定向爬海量精美圖片及搜尋引擎雜談

        我自認為這是自己寫過部落格中一篇比較優秀的文章,同時也是在深夜凌晨2點滿懷著激情和愉悅之心完成的。首先通過這篇文章,你能學到以下幾點:        1.可以瞭解Python簡單爬取圖片的一些思路和方法         2.學習Selenium自動、測試分析

簡單Python爬蟲例項:豆瓣熱映電影資訊

最近在學習Python爬蟲基礎,僅用部落格記錄下學習的過程。學習過程基於麥子學院的課程,感謝麥子學院,感謝Joey老師。那麼我們來看一下,怎麼抓取資料。Chrome瀏覽器有一個開發者工具,很適合檢視網頁原始碼,所以我們用Chrome。開啟之後是這樣:然後我們在網頁位址列輸入豆

Python爬蟲,用於豆瓣電影Top前100的電影的名稱

初步接觸python爬蟲(其實python也是才起步),發現一段程式碼研究了一下,覺得還比較有用處,Mark下。 上程式碼: #!/usr/bin/python #coding=utf-8 #Author: Andrew_liu #mender:cy "