1. 程式人生 > >使用phantomjs抓取JS動態生成的頁面

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

關於phantomjs

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

下載phantomjs(http://phantomjs.org/download.html)。解壓到任意目錄,在Windows下將包含phantomjs.exe的目錄新增到系統路徑。Linux下 phantomjs2.0還沒有提供下載的包,需要手動編譯。centos 安裝phantomjs步驟如下:
在CentOS 6上測試可行。
安裝依賴環境:

sudo yum -y install gcc gcc-c++ make flex bison gperf ruby \
  openssl-devel freetype-devel fontconfig-devel libicu-devel sqlite-devel \
  libpng-devel libjpeg-devel

下載進行編譯:

git clone git://github.com/ariya/phantomjs.git
cd phantomjs
git checkout 2.0
./build.sh

使用示例

示例一
由於PhantomJS 是一個基於 WebKit 的伺服器端 JavaScript API,若要直接使用則需要js指令碼進行呼叫。
使用phantomjs去獲取頁面,然後用Java呼叫phantomjs來獲取內容。
codes.js 程式碼:

system = require('system')   
address = system.args[1];//獲得命令列第二個引數 接下來會用到   
//console.log('Loading a web page'); var page = require('webpage').create(); var url = address; //console.log(url); page.open(url, function (status) { //Page is loaded! if (status !== 'success') { console.log('Unable to post!'); } else { //console.log(page.content);
//var title = page.evaluate(function() { // return document.title;//示範下如何使用頁面的jsapi去操作頁面的 www.oicqzone.com // }); //console.log(title); console.log(page.content); } phantom.exit(); });

Java呼叫程式碼:

public static void getContent(String url) throws IOException {  
    Runtime rt = Runtime.getRuntime();  
    //這裡的codes.js是儲存在D盤下面的phantomjs目錄中  
    Process p = rt.exec("D:/phantomjs-2.0.0-windows/bin/phantomjs.exe D:/phantomjs/codes.js "+url);
    InputStream is = p.getInputStream();  
    BufferedReader br = new BufferedReader(new InputStreamReader(is));  
    StringBuffer sbf = new StringBuffer();  
    String tmp = "";  
    while((tmp = br.readLine())!=null){  
        sbf.append(tmp);  
    }  
    System.out.println(sbf.toString());  
} 

示例二
上一博文中介紹了selenium。現在有了phantomjs,就可以使用selenium來執行ghostdriver了。思路和執行chromedriver一樣,只是ghostdriver可以驅動phantomjs。現在ghostdriver Java包已經和phantomjs繫結一起了,只要安裝ghostdriver就可以使用了。如下新增maven依賴

<dependency>
   <groupId>com.github.detro</groupId>
   <artifactId>phantomjsdriver</artifactId>
   <version>1.2.0</version>
</dependency>

使用的方法和selenium的其它驅動類似。因為是驅動第三方程序進行解析,而建立程序的開銷還是比較大的,所以應儘量對webDriver進行復用會比較好。

一些問題

再啟動應用的時候,有些機器中出現如下的異常資訊,

org.openqa.selenium.remote.UnreachableBrowserException: Could not start a new session. Possible causes are invalid address of the remote server or browser start-up failure.
org.openqa.selenium.net.UrlChecker$TimeoutException: Timed out waiting for [http://localhost:65377/status] to be available after 20000 ms

可能是tcp埠遭到佔用,或者是driver版本和phantomjs版本不相容所致。經過測試,有些機器中ghostdriver目前的版本驅動不了phantomjs2.0,把phantomjs降低一個版本就好使了。如phantomjs1.9.8。

相關推薦

使用phantomjsJS動態生成頁面

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

(python解析js)selenium結合phantomjsjs生成頁面

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

C#利用phantomJSAjAX動態頁面

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

scrapy利用scrapy-splash爬JS動態生成的標籤

1 引言 scrapy處理爬取靜態頁面,可以說是很好的工具,但是隨著技術的發展,現在很多頁面都不再是靜態頁面了,都是通過AJAX非同步載入資料動態生成的,我們如何去解決問題呢?今天給大家介紹一種方法:scrapy-splash 2 準備工作 首先需要安裝一下幾個工具 (1)

JS動態生成的URL

愛卡汽車論壇搜尋結果頁面: 想要python爬取搜尋結果連結:a標籤中的href,但是這個url是動態生成的。 網頁原始碼: 用普通方式解析: import urllib.request url = "http://search.xcar.com.cn/metasea

使用pythonjs動態載入的網頁

原文地址:http://blog.csdn.net/lambert310/article/details/49248109 我們在做網頁抓取的時候,一般來說使用urllib和urllib2就能滿足大部分需求。 但是有時候我們遇見那種使用js動態載入的網頁。就會發現urllib只能抓出一個部分內容空白的

pythonjavascript動態生成HTML內容的實踐

本實驗在Ubuntu14.04上完成。使用的瀏覽器是火狐(Firefox 33.0),python版本是2.7.6。 大家都知道用urllib配合正則表示式抓取靜態HTML的內容很方便,但是如果網頁中有javascript動態生成的內容,urllib就無能為力了。 此時我們

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

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

(python解析js)scrapy結合ghostjs生成頁面,以及js變數的解析

現在頁面用ajax的越來越多, 好多程式碼是通過js執行結果顯示在頁面的(比如:http://news.sohu.com/scroll/,搜狐滾動新聞的列表是在頁面請求時由後臺一次性將資料渲染到前臺js變數newsJason和arrNews裡面的,然後再由js生

Java使用HtmlUnitjs渲染頁面

roo art 插件 println word tcs set webclient ble 需求: 需要采集js渲染的頁面,有些網站的頁面是js渲染的 實現: 基於HtmlUnit實現: public static void getAjaxPage() thro

phantomjs 頁面失敗

蛛蛛爬蟲無法抓取 angularjs 渲染的頁面,解決這個問題通常要用到第三方技術,phantomjs 是個不錯的選擇,今天測試抓取 www.baidu.com 沒有問題(phantomjs getpage.js "http://www.baidu.com"),但抓取自己的網站卻有問題 (phant

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

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

ScrapyAjax動態頁面

https://www.jianshu.com/p/1e35bcb1cf21這次我們要抓取的網站是淘女郎的頁面,全站都是通過Ajax獲取資料然後重新渲染生產的。這篇文章的程式碼已上傳至我的Github,由於後面有部分內容並沒有提供完整程式碼,所以貼上地址供各位參考。分析工作用Chrome開啟淘女郎的首頁中的美

通過淘寶評論為例講解Python爬ajax動態生成的資料

'https://rate.taobao.com/feedRateList.htm?auctionNumId=538039793643&userNumId=2779992133&currentPageNum=6&pageSize=20&rateType=&orderTy

2017-05-17 js動態生成輪播圖小圓點

輪播圖 鼠標 borde images author eight 復習 innerhtml pad 從今天開始,把自己做的筆記轉移到博客園: 今晚復習了一下動態創建輪播圖小圓點做了一下小的筆記: 1 <!DOCTYPE html> 2 <html l

動態生成頁面(一)——ASP.NET中Literal使用

case colspan label 奇偶數 容器 業務邏輯 con stringbu font 在頁面中加入內容時,假設是靜態內容。無需使用容器,能夠直接將標記作為HTML直接加入到頁面中;可是,假設是動態內容,則必須借助容器將內容加入到頁面中。典型的容器

python+selenium+PhantomJS網頁動態加載內容

use for ive comm 自動化測試 mac os x page 影響 blank 一般我們使用python的第三方庫requests及框架scrapy來爬取網上的資源,但是設計javascript渲染的頁面卻不能抓取,此時,我們使用web自動化測試化工具Selen

網站爬-案例三:今日頭條(ajaxJS數據)

今日頭條 頭條 img gin 方便 pos 網頁 圖片 http 今日頭條這類的網站制作,從數據形式,CSS樣式都是通過數據接口的樣式來決定的,所以它的抓取方法和其他網頁的抓取方法不太一樣,對它的抓取需要抓取後臺傳來的JSON數據,先來看一下今日頭條的源碼結構:我們抓取文

實例:使用puppeteer headless方式JS網頁

puppeteer chromium 爬蟲 puppeteer google chrome團隊出品的puppeteer 是依賴nodejs和chromium的自動化測試庫,它的最大優點就是可以處理網頁中的動態內容,如JavaScript,能夠更好的模擬用戶。 有些網站的反爬蟲手段是將部分內容隱藏

C#使用Selenium+PhantomJS數據

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