利用 CasperJS 创设 Web 爬虫

转载:https://www.oschina.net/translate/building-your-own-web-scraper-in-nodejs

从你的行使中收载数据有时恐怕有点困难和辛勤。也许是贫乏3个必须的API,恐怕是有太多的多寡供给处理。那时候你就需求依靠web抓取。

毫无说了,这大概是个法律雷区,所以要力保您从未逾越法律的边界。

现阶段有很多工具得以辅助您抓取内容,例如Import.io,可是有时这几个工具并不可能一心知足你的急需。又恐怕,像自身壹样,充满好奇心,希望深远地询问web抓取。

挑战

让大家从三个简单地挑衅——互连网爬虫起首,让那么些爬虫爬取Techmeme,并拿走3个当天看好消息列表!

在意: 在此地小编将会选取DZone,但在得到页面时会出现难题。前边会详细表达这一个题材。

Node.js 1

社会主义好

翻译于 1年前

0人顶

顶 翻译得不错哦!

 

机器设置

您只要求做很少的干活来完毕安装。作者尽管您已经设置了Node.js(笔者的情趣是哪个人未有设置呢!)。固然我们并不直接选取PhantomJS,不过你照旧供给安装它。版本二.0.一脚下已经得以行使了——您能够从其官网下载或利用homebrew或任何同等的包管理器安装。 

要是您使用全部homebrew的Mac,您能够这么设置PhantomJS 

brew install phantomjs

下载达成之后,您将须要用同一的艺术安装CasperJS。您能够将CasperJS看做PhantomJS的配偶。它实际上是给您提供相似的网页处理API。即使它是为网页测试设计的。与PhantomJS相同,它装有丰硕的成效使其也万分适合于抓取内容。

CasperJS允许大家编辑JavaScript脚本。您可以经过在顶峰中输入casperjs以测试其是还是不是正确安装并投入到PATH中。 

Node.js 2

Node.js 3

社会主义好

翻译于 1年前

0人顶

顶 翻译得不错哦!

 

编写脚本

上面大家将编辑二个新的JavaScript脚本文件。在自小编的事例中,笔者称其为index.js。您供给做的率先件事正是在您的代码中创造3个casper实例。您还供给参与重视的模块并向其传递一些基本参数。 

var casper = require("casper").create({
waitTimeout: 10000,
stepTimeout: 10000,
verbose: true,
pageSettings: {
webSecurityEnabled: false
},
    onWaitTimeout: function() {
          this.echo('** Wait-TimeOut **');
    },
    onStepTimeout: function() {
        this.echo('** Step-TimeOut **');
    }
});

当你等待一个成分可知时,上边的onWaitTimeout回调将会被调用。例如,点击多少个按钮之后,wait提姆eout将被当先。 

前几天,您能够运行casper实例并将其针对性大家愿意爬取的页面。 

casper.start();

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

Casper使用2个可相信地框架来赞助你一步一步地运营具有职分。对于第三步,您将希望利用then函数。

casper.then(function() {
  //logic here
});
//start your script
casper.run();

为了使Casper打开网页并按您的想法运转,您须求调用run函数。 

Node.js 4

社会主义好

翻译于 1年前

0人顶

顶 翻译得不错哦!

 

反省网页以赢得想要的要素

当抓取到3个网页,您能够固然它装有一定的协会。在你编写脚本此前,恐怕早已浏览过了网页的源代码,只怕曾经应用开发者工具观察了页面对特定行为的变通。 

据此,让大家开首于2个简练地逻辑,使用CasperJS维护系统确定保证3个一定的因素在持续在此以前处于合适的职位。假诺成分不设有,脚本将会终止,不过至少你将会知道其为什么截止。那个维护行为对于观望您在此以前抓取页面包车型地铁浮动是珍贵和稀有的,不过恐怕会与您事先看来的页面具有不一致等的组织。 

Node.js 5

社会主义好

翻译于 1年前

Node.js,1人顶

顶 翻译得不错哦!

 

如果你检查了Techmeme首页的成分,您将会专注到头条音信部分在二个id为,topcol1的div中。

Node.js 6

让大家利用维护作用确定保障那个成分存在: 

casper.then(function() {

this.test.assertExists("#topcol1");

比方那么些因素不存在,测试(例如大家的台本)将会终止,不然它将延续运行。 

您还是能使用waitForSelector函数来赢得越发仔细的结果:

this.waitForSelector("#topcol1",
    function pass () {
       console.log("Continue");
    },
    function fail () {
        this.die("Did not load element... something is wrong");
    }
);

行使那么些函数的帮助和益处正是它同意页面加载成分并直接等候到实施。您在始发配置中内定的waitTimeout将会被用于分明退步前等候多长时间。

小心:有时,使用CasperJS查找成分恐怕会出题目。使用capture()函数截取贰个CasperJS看到的页面包车型客车截图。 
this.capture(‘screener.png’); 

Node.js 7

社会主义好

翻译于 1年前

0人顶

顶 翻译得不错哦!

 

从页面中提取内容 

上边,让我们看看怎么着从页面中找出标题。首先,找到包蕴您要求的内容的要素,在我们的例子中,为class=ii的div。

CasperJS自带3个evaluate函数,能够让你在页面中运营JavaScript,并且您还足以让函数重回三个值以供进一步处理。

其壹JavaScript写起来并从未什么样分裂,您恐怕注意到,在本例中,作者使用的是原本的纯DOM方法,而不是jQuery,同样,假使您愿意,您也足以在evaluate函数中动用jQuery;

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

即使您在evaluate函数中应用console.log语句,它们将会透过remote.message句柄打印到你的控制台,那将会在下壹节中详尽介绍。

Node.js 8

社会主义好

翻译于 1年前

0人顶

顶 翻译得不错哦!

 

1经运维停止,结果将会回去给你。您能够将它们写入文件系统,大概将它们打字与印刷到荧屏上:
 

console.log("There were "  + links.length + " stories");

for(var i = 0; i < links.length; i++){
console.log(links[i].headline);
}

输出的结果如: 

Node.js 9

抓取中的错误处理 

奇迹,您运行的JavaScript中或者存在错误,也许其对你抓取的页面的拍卖存在难点。那个景况中,您能够捕获错误并动用remote.message和page.error事件将其打印到控制台: 

casper.on('remote.message', function(msg) {
this.echo('remote message caught: ' + msg);
});

casper.on('page.error', function(msg, trace) {
this.echo('Error: ' + msg, 'ERROR');
});

您同样仍可以观测到即将请求的财富,那些能源的加载使用的是resource.error和resource.received事件: 

casper.on('resource.error', function(msg) {
this.echo('resource error: ' + msg);
});

casper.on('resource.received', function(resource) {
    console.log(resource.url);
});

Node.js 10

社会主义好

翻译于 1年前

1人顶

顶 翻译得不错哦!

 

打听愈来愈多

正文只写了点有关利用CasperJS你所能做到的肤浅的事物。该品种的文书档案是无微不至的,所以要有限支撑查看过 API ,看看你还是能够用它来做些什么。

在本种类的下1篇小说中,小编返重播看哪些从网页上下载图片,而且作者也会切磋下如何使用营造到CasperJS中的文件系统函数,其应用会受到比Node.js更多的限定。