一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

JS渲染引擎比較HtmlUnit/Selenium/PhantomJs

 bylele 2019-01-23

現(xiàn)如今的爬蟲再也不是簡單的爬取靜態(tài)頁面,解析Html文本這么簡單,許多單頁面應用,異步請求調用,頁面初始化js渲染等技術的使用,使得傳統(tǒng)的通過發(fā)起http請求獲得的Document無法直接使用。因此,基于實際業(yè)務需求,在爬取某電商平臺數(shù)據(jù)時,發(fā)現(xiàn)其頁面特定位置為js渲染,固此,由此一文,基于實際代碼測試,分析HtmlUnit/Selenium/PhantomJs三類流行的js渲染引擎。

-HtmlUnit

1
2
3
4
5
<code>1) 內置Rhinojs瀏覽器引擎,沒有哪一款瀏覽器使用該內核
2) 解析速度一般
3) 解析JS/CSS差
4) 無瀏覽器界面
</code>

- Selenium

1
2
3
4
5
<code><code>1) Seleninum 1+ WebDriver = Selenium
2) 基于本地安裝的瀏覽器,需打開瀏覽器
3) 需要引用相應的WebDriver,正確配置webdriver的路徑參數(shù)
4) 在爬取大量js渲染頁面時明顯不合適
</code></code>

- PhantomJs

1
2
3
4
5
<code><code><code>1) 神器,短小精悍
2) 可本地化運行,也可作為服務端運行
3) 基于webkit內核,性能及表現(xiàn)良好
4) 完美解析絕大部分頁面
</code></code></code>

基于實測結果,在爬取大量任務時,推薦將PhantomJs作為服務端使用,此處,分別介紹本地及遠程服務端使用例子(也可查看官網(wǎng)example)

本地

需要構造目標執(zhí)行的js文件,利用命令行調用PhantomJS
示例:
window平臺下
PhantomJs.exe target.js param1

對應的本地target.js可參考如下示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
<code><code><code>"use strict";
var page = require('webpage').create();
var system = require('system');
if (system.args.length !== 2) {
    console.log('Usage: server.js <some port="">');
    phantom.exit(1);
} else {
    var url = system.args[1];
    page.open(url, function (status) {
            console.log(page.content);
            phantom.exit();
            }
        });</some></code></code></code>

在java程序中,通過調用控制臺執(zhí)行命令

1
2
3
4
5
6
7
8
9
10
<code><code><code>        Runtime runtime = Runtime.getRuntime();
        Process p = runtime.exec("D:/phantomjs.exe target.js url);
        InputStream is = p.getInputStream();
        BufferedReader br = new BufferedReader(new InputStreamReader(is));
        StringBuffer sb = new StringBuffer();
        String tmp = "";
        while((tmp = br.readLine())!=null){
            sb.append(tmp);
        }
        return sb.toString();</code></code></code>

搭建遠程服務器

保證遠程服務器指定端口開啟
示例:
在阿里ecs上開啟指定端口,如3003
打開控制臺,在安全組中添加自定義TCP連接,可訪問的ip組設置為0.0.0.0/0,同時配置入網(wǎng)和出網(wǎng)端口

操作步驟

1) 官網(wǎng)下載exe文件至指定位置(linux平臺同理)
2) 新建一個server.js文件
3) 命令行運行PhantomJS server.js即可開啟服務
4) 本地通過在瀏覽器或者java代碼中提交http請求,即可獲得響應,url為 https://遠程服務器ip地址:端口號/https://自定義url

此處server.js為關鍵,其設置了服務器的監(jiān)聽端口及響應請求邏輯
server.js示例代碼:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
<code><code><code>"use strict";
var page = require('webpage').create();
var server = require('webserver').create();
var system = require('system');
var host, port;
if (system.args.length !== 2) {
    console.log('Usage: server.js <some port="">');
    phantom.exit(1);
} else {
    port = system.args[1];
    var listening = server.listen(port, function (request, response) {
        console.log("GOT HTTP REQUEST");
        console.log(JSON.stringify(request, null, 4));
        // we set the headers here
        response.statusCode = 200;
        response.headers = {"Cache": "no-cache", "Content-Type": "text/html"};
        // this is also possible:
        response.setHeader("databee", "databee");
        // now we write the body
        // note: the headers above will now be sent implictly
        //response.write("<title></title>");
        // note: writeBody can be called multiple times
       // var url = "

提供本地發(fā)起請求Java代碼示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<code><code><code>        URL url = new URL(finalUrl);//finalUrl此時為get請求url
        HttpURLConnection conn = (HttpURLConnection)url.openConnection();
        InputStream is = null;
        BufferedReader br = null;
        if (conn.getResponseCode() == 200) {
            is = conn.getInputStream();
        } else {
            is = conn.getErrorStream();
        }
        br = new BufferedReader(new InputStreamReader(is));
        String line = "";
        StringBuilder sb = new StringBuilder();
        while ((line = br.readLine()) != null) {
            sb.append(line);
        }
        return sb.toString();</code></code></code>

    本站是提供個人知識管理的網(wǎng)絡存儲空間,所有內容均由用戶發(fā)布,不代表本站觀點。請注意甄別內容中的聯(lián)系方式、誘導購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權內容,請點擊一鍵舉報。
    轉藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多

    精品亚洲av一区二区三区| 日韩无套内射免费精品| 欧美一区二区三区喷汁尤物| 日本人妻的诱惑在线观看| 国产乱人伦精品一区二区三区四区| 成年午夜在线免费视频| 国产原创中文av在线播放| 超薄丝袜足一区二区三区| 福利一区二区视频在线| 在线视频三区日本精品| 国内精品伊人久久久av高清 | 国产一区在线免费国产一区| 日本不卡一本二本三区| 亚洲天堂久久精品成人| 国产精品免费福利在线| 国产精品内射视频免费| 激情五月天免费在线观看| 欧美一区日韩一区日韩一区| 中文字幕精品少妇人妻| 日韩国产中文在线视频| 夫妻性生活真人动作视频| 精品久久久一区二区三| 少妇特黄av一区二区三区| 国产乱人伦精品一区二区三区四区| 日木乱偷人妻中文字幕在线| 国产在线日韩精品欧美| 国产精品九九九一区二区| 日本91在线观看视频| 国产精品亚洲欧美一区麻豆| 日韩成人中文字幕在线一区| 欧美极品欧美精品欧美| 国产一级特黄在线观看| 在线观看免费无遮挡大尺度视频 | 欧美日韩国产精品自在自线| 91亚洲国产成人久久| 日本加勒比系列在线播放| 激情亚洲一区国产精品久久| 日本加勒比在线观看不卡| 免费精品一区二区三区| 好吊日在线视频免费观看| 国产精品激情对白一区二区|