js-crawl用法

安装

npm install js-crawler

用法
爬网程序提供了直观的界面来爬网网站上的链接。实例

var Crawler = require("js-crawler");
 
new Crawler().configure({depth: 3})
  .crawl("http://www.google.com", function onSuccess(page) {
    console.log(page.url);
  });

对configure的调用是可选的,如果省略,将使用默认选项值。

onSuccess回调将为爬网程序已爬网的每个页面调用。传递给回调的页面值将包含以下字段:

url-页面的url
内容-页面正文(通常为HTML)
status-HTTP状态代码
可以从页面的其余字段中检索额外的信息:error、response、body,这些信息与传递给request模块的请求调用回调的信息相同。

referer字段将引用将爬网程序引导到当前页面的页面的url。

基于期权的API

用于将回调传递到爬网函数的替代API。

var Crawler = require("js-crawler");
 
var crawler = new Crawler().configure({ignoreRelative: false, depth: 2});
 
crawler.crawl({
  url: "https://github.com",
  success: function(page) {
    console.log(page.url);
  },
  failure: function(page) {
    console.log(page.status);
  },
  finished: function(crawledUrls) {
    console.log(crawledUrls);
  }
});

处理错误

可以传递一个额外的回调来处理错误,请考虑上面修改的示例:

var Crawler = require("js-crawler");
 
new Crawler().configure({depth: 3})
  .crawl("http://www.google.com", function(page) {
    console.log(page.url);
  }, function(response) {
    console.log("ERROR occurred:");
    console.log(response.status);
    console.log(response.url);
    console.log(response.referer);
  });

在这里,将为每个无法访问的页面调用第二个回调(可能是因为相应的网站关闭了)。可以不定义状态。

知道所有爬行何时完成
可以传递额外的回调,当所有url都已爬网并且爬网完成时将调用该回调。

所有已爬网的url都将作为参数传递给该回调。

var Crawler = require("js-crawler");
 
new Crawler().configure({depth: 2})
  .crawl("http://www.google.com", function onSuccess(page) {
    console.log(page.url);
  }, null, function onAllFinished(crawledUrls) {
    console.log('All crawling finished');
    console.log(crawledUrls);
  });

限制发出请求的速率
maxRequestsPerSecond选项

默认情况下,每秒发出的HTTP请求的最大数量为100,但如果不希望使用过多的网络,或者相反,希望更快地爬网,则可以使用maxRequestsPerSecond选项进行调整。

var Crawler = require("js-crawler");
 
var crawler = new Crawler().configure({maxRequestsPerSecond: 2});
 
crawler.crawl({
  url: "https://github.com",
  success: function(page) {
    console.log(page.url);
  },
  failure: function(page) {
    console.log(page.status);
  }
});

使用此配置,每秒最多只能发出2个请求。

实际请求速率也取决于网络速度,maxRequestsPerSecond仅配置上限。

maxRequestsPerSecond也可以是小数,例如,值0.1意味着每10秒最多有一个请求。

maxConcurrentRequests选项
当使用maxConcurrentRequests选项时,可能会有更大的灵活性,它限制了可以同时活动的HTTP请求的数量。

如果每秒的请求数对于给定的一组站点来说太高/网络请求可能会开始堆积,那么指定maxConcurrentRequest可以帮助确保网络不会因堆积的请求而过载。

指定两个选项
如果我们不确定网络和网站的性能如何,可以自定义这两个选项。

然后,maxRequestsPerSecond限制爬网程序允许发出的请求数量,maxConcurrentRequests允许指定爬网程序应如何根据网络/站点的实时性能调整其请求率。

var Crawler = require("js-crawler");
 
var crawler = new Crawler().configure({
  maxRequestsPerSecond: 10,
  maxConcurrentRequests: 5
});
 
crawler.crawl({
  url: "https://github.com",
  success: function(page) {
    console.log(page.url);
  },
  failure: function(page) {
    console.log(page.status);
  }
});

默认选项值
默认情况下,值如下所示:

maxRequestsPerSecond 100

maxConcurrentRequests 10

也就是说,我们预计平均每秒将发出100个请求,只有10个请求同时运行,每个请求大约需要100毫秒才能完成。

重复使用相同的爬网程序实例进行爬网:忘记已爬网的URL
默认情况下,爬网程序实例将记住它曾经爬网过的所有URL,并且不会再对它们进行爬网。为了让它忘记所有已爬网的URL,可以使用forgetCrawled方法。

还有另一种方法可以解决相同的问题:

create a new instance of a crawler. Example https://github.com/antivanov/js-crawler/blob/master/examples/github_forgetting_crawled_urls.js

支持的选项

depth-原始页面中的链接将被爬网到的深度。示例:如果site1.com包含指向site2.com的链接,其中包含指向site3.com的链接。

深度为2,并且我们从site1.com爬网,则我们将爬网site2.com,但不会爬网site3.com,因为它太深了。

默认值为2。

ignoreRelative-忽略相对URL,爬网时将忽略同一页面上的相对URL,因此将不会爬网/wiki/Quick Start,并且https://github.com/explore将被爬网。

当我们主要对当前网站所指的网站而不仅仅是原始网站的不同部分感兴趣时,此选项可能很有用。

默认值为false。

userAgent-与爬网程序请求一起发送的用户代理。
默认值为crawler/js crawler

maxRequestsPerSecond-爬网程序每秒可以发出的最大HTTP请求数,默认值为100

maxConcurrentRequests-爬网程序不应超过的最大并发请求数,默认值为10

shouldCrawl-指定是否应该对url进行爬网/请求的函数,返回true或false,参数是爬网程序考虑进行爬网的当前url

shouldCrawlLinksFrom-指定爬网程序是否应该爬网在给定url中找到的链接的函数,返回true或false,参数是当前正在爬网的url

注意:shouldCrawl决定是否应该请求/访问给定的URL,其中as shouldCrawfLinksFrom决定是否应该获取给定URL上的链接/将其添加到爬网队列中。

许多用户可能会发现,使用shouldCrawl就足够了,因为如果一开始就没有访问/请求过页面,则无法对页面中的链接进行爬网。

将这些函数分离的一个常见用例是:如果用户希望在不爬网外部链接的情况下检查网站上的外部链接是否存在错误,则用户可以创建shouldCrawlLinksFrom函数,该函数将爬网限制为原始url,而不访问外部链接。

示例:

以下将对指定的URL进行爬网,但不允许访问/请求外部URL,因此不搜索要在外部URL上爬网的其他链接:

var Crawler = require("js-crawler");
 
var crawler = new Crawler().configure({
  shouldCrawl: function(url) {
    return url.indexOf("reddit.com") < 0;
  }
});
 
crawler.crawl("http://www.reddit.com/r/javascript", function(page) {
  console.log(page.url);
});

以下将对指定的URL进行爬网,允许访问/请求外部URL,但不会在外部URL上搜索要爬网的其他链接:

var Crawler = require("js-crawler");
 
var crawler = new Crawler().configure({
  shouldCrawlLinksFrom: function(url) {
    return url.indexOf("reddit.com") < 0;
  }
});
 
crawler.crawl("http://www.reddit.com/r/javascript", function(page) {
  console.log(page.url);
});

每个的默认值都是一个始终返回true的函数。

发展
安装依赖项

npm install

运行生成

grunt

单元测试

grunt karma:unit

在控制台模式下启动单元测试

grunt karma:unit_browser

启动一个可以在其中调试单元测试的浏览器

端到端测试

jasmine-node and express are used to setup and run end-to-end tests

Install jasmine-node and express globablly

npm install -g jasmine-node
npm install -g express

启动端到端目标服务器

cd e2e
node server.js
posted @ 2024-06-15 08:28  linux星  阅读(7)  评论(0编辑  收藏  举报