成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

熱點技術:使用CasperJS構建Web爬蟲

開發 前端
本文只寫了點關于使用CasperJS你所能做到的皮毛的東西。該項目的文檔是完美的,所以要確保查看過API ,看看你還可以用它來做些什么。

從你的應用中收集數據有時候可能有點困難和艱辛。可能是缺少一個必須的API,或者是有太多的數據需要處理。這時候你就需要借助于web抓取。

不用說了,這可能是個法律雷區,所以要確保你沒有逾越法律的邊界。

目前有很多工具可以幫助你抓取內容,例如Import.io,但是有時這些工具并不能完全滿足你的需要。又或者,像我一樣,充滿好奇心,希望深入地了解web抓取。

挑戰

讓我們從一個簡單地挑戰——網絡爬蟲開始,讓這個爬蟲爬取Techmeme,并獲得一個當天熱門新聞列表!

注意: 在這里我將會使用DZone,但在獲取頁面時會出現問題。后面會詳細說明這個問題。

機器設置

您只需要做很少的工作來完成安裝。我假設您已經安裝了Node.js(我的意思是誰沒有安裝呢!)。盡管我們并不直接使用PhantomJS,但是您依然需要安裝它。版本2.0.1目前已經可以使用了——您可以從其官網下載或使用homebrew或其他等效的包管理器安裝。

如果您使用具有homebrew的Mac,您可以這樣安裝PhantomJS

brew install phantomjs

下載完成之后,您將需要用相同的方式安裝CasperJS。您可以將CasperJS看做PhantomJS的伴侶。它實際上是給您提供相似的網頁處理API。盡管它是為網頁測試設計的。與PhantomJS相同,它具有豐富的功能使其也非常適合于抓取內容。

CasperJS允許我們編寫JavaScript腳本。您可以通過在終端中輸入casperjs以測試其是否正確安裝并加入到PATH中。

 

編寫腳本

下面我們將編寫一個新的JavaScript腳本文件。在我的例子中,我稱其為index.js。您需要做的***件事就是在您的代碼中創建一個casper實例。您還需要加入依賴的模塊并向其傳遞一些基本參數。

  1. var casper = require("casper").create({ 
  2. waitTimeout: 10000
  3. stepTimeout: 10000
  4. verbose: true
  5. pageSettings: { 
  6. webSecurityEnabled: false 
  7. }, 
  8.     onWaitTimeout: function() { 
  9.           this.echo('** Wait-TimeOut **'); 
  10.     }, 
  11.     onStepTimeout: function() { 
  12.         this.echo('** Step-TimeOut **'); 
  13.     } 
  14. }); 

當您等待一個元素可見時,上面的onWaitTimeout回調將會被調用。例如,點擊一個按鈕之后,waitTimeout將被超出。

現在,您可以啟動casper實例并將其指向我們希望爬取的頁面。

 

  1. casper.start(); 
  2. casper.open("http://techmeme.com"); 

Casper使用一個可靠地框架來幫助您一步一步地運行所有任務。對于***步,您將希望使用then函數。

  1. casper.then(function() { 
  2.   //logic here 
  3. }); 
  4. //start your script 
  5. casper.run(); 

為了使Casper打開網頁并按您的想法運行,您需要調用run函數。

檢查網頁以獲取想要的元素

當抓取到一個網頁,您可以假設它具有特定的結構。在您編寫腳本之前,可能已經瀏覽過了網頁的源代碼,或者已經使用開發者工具觀察了頁面對特定行為的變化。

所以,讓我們開始于一個簡單地邏輯,使用CasperJS維護系統確保一個特定的元素在繼續之前處于合適的位置。如果元素不存在,腳本將會停止,但 是至少您將會知道其為何停止。這個維護行為對于觀察您之前抓取頁面的變化是無價的,但是可能會與您之前見到的頁面具有不一樣的結構。

如果您檢查了Techmeme首頁的元素,您將會注意到頭條新聞部分在一個id為,topcol1的div中。

 

讓我們使用維護功能確保這個元素存在:

 

  1. casper.then(function() { 
  2. this.test.assertExists("#topcol1"); 

如果這個元素不存在,測試(例如我們的腳本)將會停止,否則它將繼續運行。

您還可以使用waitForSelector函數來獲得更為細致的結果:

  1. this.waitForSelector("#topcol1"
  2.     function pass () { 
  3.        console.log("Continue"); 
  4.     }, 
  5.     function fail () { 
  6.         this.die("Did not load element... something is wrong"); 
  7.     } 
  8. ); 

使用這個函數的優點就是它允許頁面加載元素并一直等待到執行。您在初始配置中指定的waitTimeout將會被用于確定失敗前等待多久。

注意:有時,使用CasperJS查找元素可能會出問題。使用capture()函數截取一個CasperJS看到的頁面的截圖。

this.capture(‘screener.png’);

從頁面中提取內容

下面,讓我們看看怎樣從頁面中找出標題。首先,找到包含您需要的內容的元素,在我們的例子中,為class=ii的div。

CasperJS自帶一個evaluate函數,可以讓您在頁面中運行JavaScript,并且您還可以讓函數返回一個值以供進一步處理。

這個JavaScript寫起來并沒有什么不同,您可能注意到,在本例中,我使用的是原始的純DOM方法,而不是jQuery,同樣,如果您愿意,您也可以在evaluate函數中使用jQuery;

  1. var links = this.evaluate(function(){ 
  2. var results = [];  
  3. var elts = document.getElementsByClassName("ii"); 
  4. for(var i = 0; i < elts.length; i++){ 
  5. var link = elts[i].getElementsByTagName("a")[0].getAttribute("href"); 
  6. var headline = elts[i].firstChild.textContent; 
  7. results.push({link: link, headline: headline}); 
  8. return results;  
  9. }); 

如果您在evaluate函數中使用console.log語句,它們將會通過remote.message句柄打印到您的控制臺,這將會在下一節中詳細介紹。

一旦運行結束,結果將會返回給您。您可以將它們寫入文件系統,或者將它們打印到屏幕上:

 

  1. console.log("There were "  + links.length + " stories"); 
  2. for(var i = 0; i < links.length; i++){ 
  3. console.log(links[i].headline); 

輸出的結果如:

 

抓取中的錯誤處理

有時,您運行的JavaScript中可能存在錯誤,或者其對您抓取的頁面的處理存在問題。這些情況中,您可以捕獲錯誤并使用remote.message和page.error事件將其打印到控制臺:

 

  1. casper.on('remote.message', function(msg) { 
  2. this.echo('remote message caught: ' + msg); 
  3. }); 
  4.  
  5. casper.on('page.error', function(msg, trace) { 
  6. this.echo('Error: ' + msg, 'ERROR'); 
  7. }); 
  8.  
  9. 您同樣還能觀察到即將請求的資源,這些資源的加載使用的是resource.error和resource.received事件: 
  10.  
  11. casper.on('resource.error', function(msg) { 
  12. this.echo('resource error: ' + msg); 
  13. }); 
  14.  
  15. casper.on('resource.received', function(resource) { 
  16.     console.log(resource.url); 
  17. }); 

了解更多

本文只寫了點關于使用CasperJS你所能做到的皮毛的東西。該項目的文檔是***的,所以要確保查看過 API ,看看你還可以用它來做些什么。

在本系列的下一篇文章中,我回來看看如何從網頁上下載圖片,而且我也會討論下如何使用構建到CasperJS中的文件系統函數,其使用會受到比Node.js更多的限制。

責任編輯:王雪燕 來源: oschina
相關推薦

2009-09-22 12:59:07

ibmdwWeb

2013-06-13 10:29:39

CasperJS測試UI測試

2024-03-08 12:17:39

網絡爬蟲Python開發

2020-06-04 17:38:49

PythonFastAPIWeb服務

2017-03-06 14:44:49

Androidhook技術

2019-03-12 09:20:09

shell爬蟲命名

2012-05-14 17:35:28

移動Web

2022-11-24 10:24:32

2010-01-15 15:47:38

軟交換機技術

2010-06-13 09:22:37

jQuery

2021-11-07 14:29:13

ChromeAPI 藍牙

2014-11-14 17:23:29

web掃描爬蟲

2022-09-14 23:06:45

2016-12-19 10:00:00

React性能優化

2017-03-24 13:40:44

機器學習模型神經

2017-03-13 14:09:19

RESTful API實踐

2013-04-27 11:22:14

2023-04-19 07:39:55

RustHTTP服務器

2023-12-26 00:58:53

Web應用Go語言

2009-01-03 14:25:10

ibmdwWeb
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 美日韩精品 | 精品欧美一区免费观看α√ | 日韩成人免费视频 | 国产精品久久久久久久久免费相片 | 在线成人免费av | 在线免费观看成年人视频 | 国产精品18久久久久久久 | 欧美乱做爰xxxⅹ久久久 | 亚洲日本欧美日韩高观看 | 九九九久久国产免费 | 户外露出一区二区三区 | 久久久国产精品视频 | 国产99久久久国产精品 | 欧美日韩成人 | 91精品国产综合久久久亚洲 | 久久久精选 | 国产午夜精品一区二区 | 老头搡老女人毛片视频在线看 | 国产www在线 | 免费视频一区 | 亚洲黄色国产 | 成人av影院 | 午夜视频免费在线观看 | 亚洲人a | 久久精品免费观看 | 男人天堂久久久 | 国产精品成人一区二区三区 | 亚洲午夜精品一区二区三区他趣 | 98久久| 日韩在线电影 | 免费v片在线观看 | 欧美日韩第一页 | 天堂一区| 岛国av免费在线观看 | 亚洲精品一区二区网址 | av在线免费观看网站 | 国产日韩精品一区二区 | 免费久久久 | 91精品国产综合久久精品 | 精品一区二区三区在线观看国产 | 国产偷录视频叫床高潮对白 |