最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Node.js實現(xiàn)的簡易網(wǎng)頁抓取功能示例

 更新時間:2014年12月05日 11:52:48   投稿:junjie  
這篇文章主要介紹了Node.js實現(xiàn)的簡易網(wǎng)頁抓取功能示例,本文使用了PhantomJS、node-phantomjs等庫實現(xiàn),需要的朋友可以參考下

現(xiàn)今,網(wǎng)頁抓取已經(jīng)是一種人所共知的技術了,然而依然存在著諸多復雜性, 簡單的網(wǎng)頁爬蟲依然難以勝任Ajax輪訓、XMLHttpRequest,WebSockets,F(xiàn)lash Sockets等各種復雜技術所開發(fā)出來的現(xiàn)代化網(wǎng)站。

我們以我們在Hubdoc這個項目上的基礎需求為例,在這個項目中,我們從銀行,公共事業(yè)和信用卡公司的網(wǎng)站上抓取帳單金額,到期日期,賬戶號碼,以及最重要的:近期賬單的pdf。對于這個項目,我一開始采用了很簡單的方案(暫時并沒有使用我們正在評估的昂貴的商業(yè)化產(chǎn)品)——我以前在MessageLab/Symantec使用Perl做過的一個簡單的爬蟲項目。但是結果很不順利,垃圾郵件發(fā)送者所制作的網(wǎng)站要比銀行和公共事業(yè)公司的網(wǎng)站簡單的多得多。

那么如何解決這個問題呢?我們主要從使用Mikea開發(fā)的優(yōu)秀 request庫開始。在瀏覽器中發(fā)出請求,并在Network窗口中查看到底發(fā)送出去了什么請求頭,然后把這些請求頭拷貝到代碼里。這個過程很簡單。僅僅是跟蹤從登陸開始,到下載Pdf文件結束的這個過程,然后模擬這個過程的所有的請求而已。為了使類似的事情處理起來變得容易,并且能讓網(wǎng)絡開發(fā)者們更加合理地寫爬蟲程序,我把從HTML上取到結果的方把導出到jQuery中(使用輕量級 cheerio庫),這使得相似的工作變得簡單,也使利用CSS選擇子選取一個頁面中的元素變得較為簡單。整個過程被包裝進一個框架,而這個框架也可以做額外的工作,例如從數(shù)據(jù)庫中拾取證書,加載個體機器人,和UI通過socket.io溝通。

對于一些web站點來說這個是有效的,但這僅僅是JS腳本,而不是我那個被這些公司放在他們站點上的node.js的code。他們對遺留下來的問題,針對復雜性就行分層,使得你非常難去弄明白該做什么來得到登錄的信息點。對于一些站點我嘗試了幾天通過與request()庫結合來獲取,但仍是徒然。

在幾近崩潰后,我發(fā)現(xiàn)了node-phantomjs,這個庫可以讓我從node中控制phantomjs headless webkit瀏覽器(譯者注:這個我沒想到一個對應的名詞,headless這里的意思是渲染頁面在后臺完成,無需顯示設備)。這看起來是一種簡單的解決方案,但是還有一些phantomjs無法回避的問題需要解決:

1.PhantomJS只能告訴你頁面是否完成了加載,但是你無法確定這個過程中是否存在通過JavaScript或者meta標簽實現(xiàn)的重定向(redirect)。特別是JavaScript使用setTimeout()來延遲調(diào)用的時候。

2.PhantomJS為你提供了一個頁面加載開始(pageLoadStarted)的鉤子,允許你處理上面提到的問題,但是這個機能只能在你確定要加載的頁面數(shù),在每個頁面加載完成時減少這個數(shù)字,并且為可能的超時提供處理(因為這種事情并不總是會發(fā)生),這樣當你的數(shù)字減少為0,就可以調(diào)用你的回調(diào)函數(shù)了。這種方式可以工作,但是總讓人覺得有點像是黑客手段。

3.PhantomJS每抓取一個頁面需要一個完整獨立的進程,因為如果不這樣,無法分離每個頁面之間的cookies。如果你是用同一個phantomjs進程,已經(jīng)登錄的頁面中的session會被發(fā)送到另一個頁面中。

4.無法使用PhantomJS下載資源 - 你只能將頁面保存為png或者pdf。這很有用,但是這意味著我們需要求助于request()來下載pdf。

5.由于上述的原因,我必須找到一個方法來將cookie從PhantomJS的session中分發(fā)到request()的session庫中去。只需要將document.cookie的字符串分發(fā)過去,解析它,然后將其注入到request()的cookie jar中去。

6.將變量注入到瀏覽器session中并不是件容易的事情。要這么做我需要創(chuàng)建一個字符串來建立一個Javascript函數(shù)。

復制代碼 代碼如下:

Robot.prototype.add_page_data = function (page, name, data) {
 page.evaluate(
 "function () { var " + name + " = window." + name + " = " + JSON.stringify(data) + "}"
 );
}

7.一些網(wǎng)站總是充斥著console.log()之類的代碼,也需要將他們重新定義,輸出到我們希望的位置。為了完成這個,我這么做:
復制代碼 代碼如下:

if (!console.log) {
    var iframe = document.createElement("iframe");
    document.body.appendChild(iframe);
    console = window.frames[0].console;
}

8.一些網(wǎng)站總是充斥著console.log()之類的代碼,也需要將他們重新定義,輸出到我們希望的位置。為了完成這個,我這么做:

復制代碼 代碼如下:

if (!console.log) {
    var iframe = document.createElement("iframe");
    document.body.appendChild(iframe);
    console = window.frames[0].console;
}

9.告訴瀏覽器我點擊了a標簽也是件很不容易的事情,為了完成這些事情,我加入了以下的代碼:
復制代碼 代碼如下:

var clickElement = window.clickElement = function (id){
    var a = document.getElementById(id);
    var e = document.createEvent("MouseEvents");
    e.initMouseEvent("click", true, true, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null);
    a.dispatchEvent(e);
 };

10.我還需要限制瀏覽器session的最大并發(fā)量,從而保障我們不會爆掉服務器。雖然這么說,可是這個限制要比昂貴的商業(yè)解決方案所能提供的高很多。(譯者注:即商業(yè)解決方案的并發(fā)量比這個解決方案大)

所有的工作結束后,我就有一個比較體面的 PhantomJS + request 的爬蟲解決方案。必須使用 PhantomJS 登錄后才可以返回去 request() 請求,它將使用在 PhantomJS 中設置的 Cookie 來驗證登錄的會話。這是一個巨大的勝利,因為我們可以使用 request() 的流來下載 pdf文件。

整個的計劃就是為了讓 Web 開發(fā)者相對容易的理解如何使用 jQuery 和 CSS 選擇器來創(chuàng)建不同 Web 網(wǎng)站的爬蟲,我還沒有成功證明這個思路可行,但相信很快會了。

相關文章

  • Node.js API詳解之 dgram模塊用法實例分析

    Node.js API詳解之 dgram模塊用法實例分析

    這篇文章主要介紹了Node.js API詳解之 dgram模塊用法,結合實例形式分析了Node.js API中dgram模塊基本功能、函數(shù)、使用方法及操作注意事項,需要的朋友可以參考下
    2020-06-06
  • 詳解Node.js中單線程限制的有效解決方法

    詳解Node.js中單線程限制的有效解決方法

    Node.js?是一個基于事件驅(qū)動、非阻塞?I/O?模型的?JavaScript?運行時環(huán)境,特別適合構建高并發(fā)的網(wǎng)絡應用,本文介紹了幾種解決?Node.js單線程限制的方法,希望對大家有所幫助
    2024-12-12
  • NodeJS服務器實現(xiàn)gzip壓縮的示例代碼

    NodeJS服務器實現(xiàn)gzip壓縮的示例代碼

    這篇文章主要介紹了NodeJS服務器實現(xiàn)gzip壓縮的示例代碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-10-10
  • 分析node事件循環(huán)和消息隊列

    分析node事件循環(huán)和消息隊列

    node的好處毋庸置疑,事件驅(qū)動,異步非阻塞I/O,以及處理高并發(fā)的能力深入人心,因此大家喜歡用node做一些小型后臺服務或者作為中間層和其他服務配合完成一些大型應用場景。
    2021-06-06
  • Node.js  REPL (交互式解釋器)實例詳解

    Node.js REPL (交互式解釋器)實例詳解

    這篇文章主要介紹了Node.js REPL (交互式解釋器)實例詳解的相關資料,Node.js REPL(Read Eval Print Loop:交互式解釋器) 表示一個電腦的環(huán)境,類似 Window 系統(tǒng)的終端,我們可以在終端中輸入命令,并接收系統(tǒng)的響應,需要的朋友可以參考下
    2017-08-08
  • nodejs Assert中equal(),strictEqual(),deepEqual(),strictDeepEqual()比較

    nodejs Assert中equal(),strictEqual(),deepEqual(),strictDeepEq

    這篇文章主要介紹了node項目中遇到使用斷言測試程序,看了下nodejs的api之后,對nodejs中assert斷言的幾個方法做個簡單的記錄,需要的朋友可以參考下
    2017-09-09
  • 一文帶你了解Node.js進程管理工具PM2

    一文帶你了解Node.js進程管理工具PM2

    Node.js進程管理工具PM2是一個開源的工具,用于管理和監(jiān)控Node.js應用程序的運行,它可以幫助您方便地啟動、停止、重啟和監(jiān)視多個Node.js進程,并提供了許多有用的功能,所以本文就和大家一起了解一下PM2,需要的朋友可以參考下
    2023-07-07
  • 詳解使用nodeJs安裝Vue-cli

    詳解使用nodeJs安裝Vue-cli

    這篇文章主要介紹了詳解使用nodeJs安裝Vue-cli,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-05-05
  • node.js學習總結之調(diào)式代碼的方法

    node.js學習總結之調(diào)式代碼的方法

    調(diào)式代碼很多時候類似于查案一樣,只是結果的重要程度不同,警察查案為的是人民安穩(wěn),而我們調(diào)式則是為了系統(tǒng)的安穩(wěn)。既然這樣我們就不要冤枉任何一段代碼和程序,以免他們受到不合理的懲罰。
    2014-06-06
  • 如何利用nodejs實現(xiàn)命令行游戲

    如何利用nodejs實現(xiàn)命令行游戲

    這篇文章主要給大家介紹了關于如何利用nodejs實現(xiàn)命令行游戲的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-11-11

最新評論

游戏| 嵩明县| 贵州省| 博客| 六盘水市| 平顶山市| 金湖县| 武川县| 佛冈县| 育儿| 新野县| 琼结县| 绥中县| 沅江市| 秀山| 伊川县| 宁强县| 外汇| 鄂尔多斯市| 静乐县| 蒙城县| 恩施市| 泸溪县| 廉江市| 平乐县| 绥江县| 旬邑县| 英超| 海门市| 山东省| 昂仁县| 黄浦区| 绥棱县| 新蔡县| 齐河县| 郑州市| 威海市| 诸暨市| 康平县| 望都县| 班戈县|