1. 程式人生 > >Python使用Selenium和PhantomJS解析動態JS的網頁

Python使用Selenium和PhantomJS解析動態JS的網頁

有的網頁,不能直接通過wget,curl等命令、或者直接使用Python中的urllib,urllib2等這樣的函式庫來直接獲取其真正展現給使用者的資訊,因為裡面包含有JavaScript指令碼(而該JS和頁面資料的生成相關),需要通過Firefox、Chrome等瀏覽器渲染後才能得到想要看的結果。

例如,想查詢的一個根據IP查詢到地理位置的網頁:http://www.ip.cn/125.95.26.81

為了寫程式來自動獲取我想要的資料,比如 http://www.ip.cn/125.95.26.81 中網頁中的“廣東省佛山市 電信”這幾個字。一般來說,有如下兩種方案:

1. 寫Web UI自動化指令碼,用Selenium啟動真正的瀏覽器

(如:IE、Firefox)來開啟該網頁,然後呼叫webdriver獲取想要的頁面元素。

2. 找一種瀏覽器渲染引擎,能夠讓其解析網頁並執行網頁中需要初始化JS,然後將JS、CSS等執行後的HTML程式碼輸出出來。

啟動真正的瀏覽器,可能帶來兩個問題:一個是需要的時間較長,另一個是UI自動化易受干擾、不夠穩定。

而第2個方法,一時沒有找到特別好的庫(暫用Python語言)。

 Selenium

Selenium是一個用於Web應用程式測試的工具。Selenium測試直接執行在瀏覽器中,就像真正的使用者在操作一樣。支援的瀏覽器包括IE(7、8、9)、Mozilla Firefox、Mozilla Suite等。這個工具的主要功能包括:測試與瀏覽器的相容性,測試你的應用程式看是否能夠很好得工作在不同瀏覽器和作業系統之上。

Selenium 測試直接在瀏覽器中執行,就像真實使用者所做的一樣。Selenium 測試可以在 Windows、Linux 、Macintosh上的 Internet Explorer、Mozilla 、Firefox 中執行。其他測試工具都不能覆蓋如此多的平臺。使用 Selenium 和在瀏覽器中執行測試還有很多其他好處。下面是主要的兩大好處:

1)通過編寫模仿使用者操作的 Selenium 測試指令碼,可以從終端使用者的角度來測試應用程式。

2)通過在不同瀏覽器中執行測試,更容易發現瀏覽器的不相容性。

Selenium 的核心,也稱browser bot,是用 JavaScript 編寫的,這使得測試指令碼可以在受支援的瀏覽器中執行。browser bot 負責執行從測試指令碼接收到的命令,測試指令碼要麼是用 HTML 的表佈局編寫的,要麼是使用一種受支援的程式語言編寫的。

 Selenium 下載安裝

Selenium 例項(自己寫的,測試成功)

通過FireFox開啟網頁  並渲染完畢後,獲取正文內容(Ubuntu 12.04 + Firefox)

#!/usr/bin/env python
# -*- coding:utf-8 -*-
#
# author: sunboy_2050
# blog: http://blog.mimvp.com
 
fromseleniumimportwebdriver
 
importsys
reload(sys)
sys.setdefaultencoding('utf8')
 
defspider_url_content(url):
    try:
        browser=webdriver.Firefox()      # 開啟 FireFox 瀏覽器
     
#         chromeDriverDir = '/usr/bin/google-chrome'
#         browser = webdriver.Chrome(executable_path=chromeDriverDir)        # 開啟 Chrome 瀏覽器
     
        browser.get(url)               
        content=browser.find_element_by_id('container')      # 通過標記id 獲取網頁的內容
        content=content.text
         
        browser.quit()                     # 關閉瀏覽器
         
        print("content: " + content)
         
    exceptException as ex:
        print("error msg: " + str(ex))
 
if__name__=='__main__':
    url='http://blog.mimvp.com'
    spider_url_content(url)

或者可以 :browser.page_source得到html原始碼,通過正則表示式提取感興趣的內容

抓取示例

根據網上的一些方案和請教同事,最後在Selenium webdriver中找到了不啟動瀏覽器,但是帶基於Webkit引擎的名為“PhantomJS”的driver。後來找資料發現,LinkedIn、Twitter等知名網際網路公司也在使用PhantomJS用於測試

對於PhantomJS的好處,可閱讀:http://phantomjs.org/ (Headless Website Testing, Screen Capture,Page Automation, Network Monitoring)

對於哪些情況下不適合用PhantomJS而應該用真正的Browser,可閱讀:http://www.chrisle.me/2013/08/5-reasons-i-chose-selenium-over-phantomjs/

這裡就不專門說PhantomJS的優劣勢了,不過,它能解決我當前的問題。

先通過官方網站下載PhantomJS的可執行檔案即可;然後像正常寫Selenium自動化指令碼一樣來做即可。

一個示例程式如下:

#!/usr/bin/python
# -*- coding: utf-8 -*-
  
'''
Created on Dec 6, 2013
  
@author: Jay <[email protected]>
@description: use PhantomJS to parse a web page to get the geo info of an IP
'''
  
fromseleniumimportwebdriver
  
importsys
reload(sys)
sys.setdefaultencoding('utf-8')
  
driver=webdriver.PhantomJS(executable_path='./phantomjs') #這要可能需要制定phatomjs可執行檔案的位置
driver.get("http://www.ip.cn/125.95.26.81")
#print driver.current_url
#print driver.page_source
printdriver.find_element_by_id('result').text.split('\n')[0].split('來自:')[1]
driver.quit

執行結果:

jay@jay-linux:~/workspace/python_test$ python try_phantomjs.py
廣東省佛山市 電信

參考資料:

很好的入門指引:http://www.realpython.com/blog/python/headless-selenium-testing-with-python-and-phantomjs/

官方說明:

https://github.com/detro/ghostdriver

http://phantomjs.org/

http://phantomjs.org/users.html

一個和PhantomJS類似的東東,不過它基於Gecko而不是Webkit:http://slimerjs.org/

這裡有位兄臺也使用PhantomJS抓取資料,可以看一下:http://blog.chinaunix.net/uid-22414998-id-3692113.html


另外參考:

#參考文獻:http://blog.mimvp.com/2014/08/python-with-selenium-and-phantomjs-analysis-of-dynamic-js-pages/
#參考文獻:http://m.2cto.com/Article/201603/492868.html
#參考文獻:http://www.jianshu.com/p/3d84afc43d42

相關推薦

Python使用SeleniumPhantomJS解析動態JS網頁

有的網頁,不能直接通過wget,curl等命令、或者直接使用Python中的urllib,urllib2等這樣的函式庫來直接獲取其真正展現給使用者的資訊,因為裡面包含有JavaScript指令碼(而該JS和頁面資料的生成相關),需要通過Firefox、Chrome等瀏覽器

scrapy_splash模塊解析動態js

scrapy use ddl lin tom 動態 driver request mode 一般遇到動態加載的網頁就比較棘手,一般采用scrapy_splash和selenium這兩種方式來解決。貌似scrapy_splash更強大,因為就從爬取美團這個網站而言,scrap

[Python爬蟲]Scrapy配合SeleniumPhantomJS爬取動態網頁

Python世界中Scrapy一直是爬蟲的一個較為成熟的解決方案,目前javascript在網頁中應用越來越廣泛,越來越多的網站選擇使用javascript動態的生成網頁的內容,使得很多純html的爬蟲解決方案失效。針對這種動態網站的爬取,目前也有很多解決方案。

seleniumPhantomJS爬取動態網頁

一、selenium和PhantomJS用法簡介 selenium是web的自動化測試工具,類似按鍵精靈,可以直接執行在瀏覽器上。 pip install selenium PhantomJS是基於

js事件捕獲冒泡解析

clas listen ref log logs 流程 style 來看 list <div id="box"> <div id="box2"> <p id="test">test</p>

Selenium 獲取動態js網頁

microsoft scrip 基於 highlight print script into mic ram Selenium基於webkit實現爬蟲功能 http://www.cnblogs.com/luxiaojun/p/6144748.html https://www

利用js自動檢測pc端移動端,js程式碼,需要寫兩個網頁,一個pc,一個移動端

假設pc/index.html是pc端的網頁,mobile/index.html是移動端的網頁 在外部設定一個html進行判斷,分別跳轉; //判斷如果是pc端,自動跳到pc/index.html //安卓手機自動跳到mobile/

深入解析Vue.js中v-bind v-model的使用區別

v-model 指令在表單控制元件元素上建立雙向資料繫結,所謂雙向繫結,指的就是我們在js中的vue例項中的data與其渲染的dom元素上的內容保持一致,兩者無論誰被改變,另一方也會相應的更新為相同的資料 最基礎的就是實現一個聯動的效果 <body> <

JS函式宣告解析的理解

JS函式宣告方法 今天看到了一個自己關注了的大神給我回了私信,覺得自己彷彿摸到了大神的褲腿,哈哈,而且人還特別好,居然會給小菜鳥回私信,特別開心呀,一個菜鳥的小激動,言歸正傳啦 1.最為常見的函式宣告的方式,function+函式名稱識別符號 func

網頁新增蒙板效果彈出層js

   有的時候我們需要實現彈出一個層然後下面的層被一層蒙板蒙起來使使用者不能點選裡面的按鈕效果,這一效果具體實現的程式碼如下:這是一個測試效果用的html,可以直接拷貝到html檔案中執行。 <html> <head> <!DOCTYPE ht

(python解析js)selenium結合phantomjs抓取js生成的頁面

,有些網頁是在載入時動態建立HTML內容,只要在js程式碼完全執行完後才會顯示最終結果。如果用傳統的方法抓取頁面,就只能獲得js程式碼執行之前頁面上的內容。 要解決這個問題有兩種方法: 1.直接從js程式碼中抓取資料(執行js程式碼,解析js變數)。

使用seleniumphantomJS瀏覽器獲取網頁內容的小演示

# 使用selenium和phantomJS瀏覽器獲取網頁內容的小演示 # 匯入包 from selenium import webdriver # 使用selenium庫裡的webdriver方法呼叫PhantomJS瀏覽器例項一個瀏覽器的操作物件 # 括號裡的引數為PhantomJS瀏覽器在電

java基礎71 XML解析中的【DOMSAX解析工具】相關知識點(網頁知識)

本文知識點(目錄):本文下面的“例項及附錄”全是DOM解析的相關內容 1、xml解析的含義     xml檔案除了給開發者看,更多情況下是使用程式讀取xml檔案中的內容 2、XML的解析方式     DOM解析    SAX解析 3、xml的解析工具 3.1、DOM解析工具     1.JAXP(orac

使用phantomjs抓取JS動態生成的頁面

關於phantomjs phantomjs實現了一個無介面的webkit瀏覽器。雖然沒有介面,但dom渲染、js執行、網路訪問等API都很完整。可以利用phantomjs來下載js生成的頁面。 下載phantomjs(http://phantomjs.org

phantomjs html2Image.js 網頁轉換圖片

phantomjs 伺服器,模擬瀏覽器請求,然後將整個頁面轉出成圖片 Usage: 1. 啟動服務端: cmd: phantomjs html2Image.js port e.g :

使用者對動態PHP網頁訪問過程,以及nginx解析php步驟

一、使用者對動態PHP網頁訪問過程 使用者瀏覽器發起對網頁的訪問:http://192.168.1.103/index.php 使用者和nginx伺服器進行三次握手進行TCP連線(忽略包括nginx訪問控制策略、nginx防火牆等訪問控制策略) 第一步:使用者將http請求

Java爬蟲——phantomjs抓取ajax動態載入網頁

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

python爬取網頁包含動態js資訊(3.7 +,2.7+)

post_param = {'action': '', 'start': '0', 'limit': '1'} return_data =

XML 解析---dom解析sax解析

靜態 open 轉換器 tno 抽象 imp 高速 default 內容 眼下XML解析的方法主要用兩種: 1、dom解析:(Document Object Model。即文檔對象模型)是W3C組織推薦的解析XML的一種方式。 使用dom解析XML文檔,該解析器會先

DNS配置詳解 bind實現正向解析反向解析

cell 8.4 -s intern 資源記錄 ted borde linux系統 ans DNS是域名服務(Domain Name Service),負責把域名解析成IP地址(正向解析)或者把IP地址解析為域名(反向解析)。 DNS查詢過程: 假設我們要訪問www.a