亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 語言 > JavaScript > 正文

Node.js實現的簡易網頁抓取功能示例

2024-05-06 16:11:28
字體:
來源:轉載
供稿:網友
這篇文章主要介紹了Node.js實現的簡易網頁抓取功能示例,本文使用了PhantomJS、node-phantomjs等庫實現,需要的朋友可以參考下
 
 

現今,網頁抓取已經是一種人所共知的技術了,然而依然存在著諸多復雜性, 簡單的網頁爬蟲依然難以勝任Ajax輪訓、XMLHttpRequest,WebSockets,Flash Sockets等各種復雜技術所開發出來的現代化網站。

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

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

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

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

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

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

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

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

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

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

復制代碼代碼如下:

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

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

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

 

8.一些網站總是充斥著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的最大并發量,從而保障我們不會爆掉服務器。雖然這么說,可是這個限制要比昂貴的商業解決方案所能提供的高很多。(譯者注:即商業解決方案的并發量比這個解決方案大)

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

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


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产日本欧美视频| 亚洲第一网站免费视频| 国产精品99久久99久久久二8| 中文欧美日本在线资源| 国产欧美日韩最新| 国产高清视频一区三区| 成人性生交大片免费观看嘿嘿视频| 欧美精品videos另类日本| 国产精品99久久久久久人| 国内精品免费午夜毛片| 国产在线观看一区二区三区| 亚洲一区二区三区乱码aⅴ| 欧美黄网免费在线观看| 精品久久久久久久大神国产| 亚洲男人天堂2019| 狠狠色香婷婷久久亚洲精品| 亚洲成人激情视频| 久久久国产视频| 欧美一区三区三区高中清蜜桃| 性欧美在线看片a免费观看| 日韩精品福利网站| 影音先锋欧美在线资源| 中文字幕视频在线免费欧美日韩综合在线看| 久久97精品久久久久久久不卡| 日韩一区二区久久久| 日韩精品免费在线观看| 成人福利在线视频| 国产精品久久婷婷六月丁香| 久久久精品久久久久| 亚洲高清不卡av| 深夜精品寂寞黄网站在线观看| 精品精品国产国产自在线| 亚洲欧美另类在线观看| 欧美丝袜第一区| 国内精品久久久| 亚洲第一中文字幕在线观看| 国产精品日韩精品| 日韩成人激情视频| 亚洲影院污污.| 亚洲老头老太hd| 亚洲成人黄色网| 26uuu另类亚洲欧美日本老年| 欧美日韩中文字幕在线| 色狠狠av一区二区三区香蕉蜜桃| 久久久久久久久综合| 日韩av电影中文字幕| 中文字幕综合一区| 欧美网站在线观看| 在线丨暗呦小u女国产精品| 欧美一级在线亚洲天堂| 亚洲乱码av中文一区二区| 国产啪精品视频网站| 欧美视频中文字幕在线| 亚洲国模精品私拍| 日韩精品www| 一本大道久久加勒比香蕉| 精品露脸国产偷人在视频| 久久九九国产精品怡红院| 日韩精品视频在线播放| 亚洲bt天天射| 国产91九色视频| 日本午夜精品理论片a级appf发布| 欧美性猛交xxxx黑人| 亚洲午夜av久久乱码| 亚洲男人第一av网站| 一区二区三区无码高清视频| 亚洲热线99精品视频| 热久久免费视频精品| 亚洲精品一区中文字幕乱码| 久久99亚洲热视| 国产美女直播视频一区| 欧美巨猛xxxx猛交黑人97人| 国产精品成人久久久久| 精品视频一区在线视频| 2019日本中文字幕| 国产91精品不卡视频| 亚洲国产古装精品网站| 亚洲图片制服诱惑| 中文国产亚洲喷潮| 亚洲丁香久久久| 国产一区二区三区欧美| 欧美国产精品va在线观看| 另类专区欧美制服同性| 国产一区二区三区在线观看网站| 91在线观看欧美日韩| 日本精品免费观看| 久久中文精品视频| 中文字幕亚洲图片| 色综合老司机第九色激情| 亚洲电影天堂av| 国产欧美日韩最新| 亚洲视频专区在线| 欧美电影在线观看网站| 国产三级精品网站| 国产成人精品av在线| 国产精品男人爽免费视频1| 亚洲精品在线91| 欧美亚洲成人xxx| 国产成人高清激情视频在线观看| 国产精品福利网| 欧美日韩ab片| 欧美激情免费在线| 欧美激情久久久久久| 亚洲性69xxxbbb| 欧美中文字幕第一页| 国产精品天天狠天天看| 成人精品视频在线| 日韩中文娱乐网| 一区二区三区四区在线观看视频| 97在线视频免费播放| 国产精品久久久久久久久久ktv| 国产精品美女久久久久av超清| 久久久999精品免费| 欧美在线观看www| 亚洲电影免费观看高清完整版在线| 欧美日韩国产成人在线观看| 欧美一级淫片videoshd| 欧美成人免费网| 亚洲精品一区av在线播放| 亚洲91av视频| 91系列在线播放| 中文字幕av一区中文字幕天堂| 欧美日韩国产综合视频在线观看中文| www.久久撸.com| 国产一区二区三区网站| 国产91成人video| 精品久久久在线观看| 欧美日韩激情美女| 亚洲激情 国产| 精品久久中文字幕| 国产精品一香蕉国产线看观看| 亚洲精品久久7777777| 国内精品一区二区三区| 亚洲成人性视频| 九九久久久久久久久激情| 久久久亚洲影院| 欧美激情小视频| 91精品91久久久久久| 亚洲欧美日韩成人| 国产乱人伦真实精品视频| 欧美激情精品久久久久久大尺度| 日韩亚洲精品电影| 亚洲iv一区二区三区| 欧美激情伊人电影| 亚洲性生活视频在线观看| 精品欧美激情精品一区| 国产精品va在线播放| 欧美日韩免费网站| 国产一区二区三区视频| 欧美电影在线观看网站| 日韩有码在线电影| 亚洲天堂一区二区三区| 国产成人精品视频| 亚洲精品www久久久| 亚洲欧美制服第一页| 日产日韩在线亚洲欧美| 日韩精品福利网站| 久久久成人精品视频| 欧美亚洲在线视频| 亚洲一区二区在线| 欧美激情在线播放| 九九久久综合网站| 欧美专区第一页| 欧美激情性做爰免费视频|