Nodejs 爬虫框架,支持队列

介绍一个简单的爬虫框架,重点就是简单,那就直接来试一下吧。javascript

开始


[此处有图片,加载有点慢]

咱们来慢动做看一下都发生了什么。java

~ $ npm install crawl-pet -g复制代码

安装 crawl-petgit

~ $ cd /Volumes/M/download复制代码

进入到你想要新建项目的目录github

download $ crawl-pet new复制代码

新建项目,根据提示填写参数npm

ctrl + c复制代码

若是爬取的规则须要自定义,先退出,篇辑项目下的 crawler.js 文件json

module.exports = {
      /**************** * Info part ****************/
      projectDir: __dirname,
      url : "https://imgur.com/r/funny",
      outdir : "/Volumes/M/download/imgur.com",
      saveMode : "group",
      keepName : true,
      limits : 5,
      timeout : 60000,
      limitWidth : 400,
      limitHeight : 400,
      proxy : "http://127.0.0.1:1087",
      userAgent : "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.62 Safari/537.36",
      cookies : null,
      fileTypes : "png|gif|jpg|jpeg|svg|xml|mp3|mp4|pdf|torrent|zip|rar",
      sleep : 1000,
      crawl_data : {},
  ​
      // crawl_js : "./parser.js",/**************** * Crawler part *****************/
      // init(queen) {},
      prep(queen) {
          let url = queen.head.url;
          let m = url.match(/^(https?:\/\/)?(([\w\-]\.)?imgur.com)\/*/i);
          if (m) {
              url = (!m[1] ? 'https://' : '') + url.replace(/\/page(\/\d+(\/hit\.json)?)?$|\/+$/i, '');
              if (!/\/(new|top|hot)$/i.test(url)) {
                  url += '/new';
              }
              queen.head.url = url + '/page/0/hit.json';
              queen.save('api_url', url);
              queen.save('page_offset', 0);
          }
      },
      // start(queen) {},
      // filter(url) {},
      // filterDownload(url) {},
      // willLoad(request) {},
      loaded(body, links, files, crawler) {
          if (!/hit\.json/i.test(crawler.url)) {
              return;
          }
          try {
              let json = JSON.parse(body);
              let data = json.data;
              if (!data || data.length === 0) {
                  return;
              }
              let add_down = 0;
              for (let pic of data) {
                  if (crawler.appendDownload('https://i.imgur.com/' + pic.hash + pic.ext)) {
                      add_down += 1;
                  }
              }
              if (add_down) {
                  let api_url = crawler.read('api_url');
                  let offset = crawler.read('page_offset');
                  let add = 5;
                  while (add-- > 0) {
                      offset++;
                      crawler.appendPage(api_url + '/page/' + offset + '/hit.json');
                  }
                  crawler.save('page_offset', offset);
              }
          } catch (err) {
              // PASS
          }
      },
      // browser(crawler) {}
  }复制代码

说明一下,这里重写了两个函数,prep(queen) / loaded(body, links, files, crawler) , 查看更多点这里api

prep(queen) 是预处理,项目的第一次运行,与重置后第一次运行,会调用这个函数。这里,根据 Imgur 的api,对启始连接作了一些修改。bash

Imgur 的地址结构是:cookie

https://imgur.com/ 分类 / 排序方法 / page/ 页数 /hit.json 
复制代码

loaded(body, links, files, crawler) 是每当页面载入后会调用这个函数。app

body 是页面的文本, crawler 就是爬虫了,可能经过 crawler.appendPage(url)crawler.appendDownload(url) 添加要爬取的址

这个例子中,由于请求的页面都是json 的,因此须要先把文本解成 json, 而后用appendDownload 将图片的 url 添加到下载队列, 若是返回 false,说明图片重复已下载过了,若是有新的图片能够下载,就再生成 5 个新的页面,appendPage 添加到队列。

介绍一个实用命令

能够经过本地的文件名,查找到下载的连接地址

$ crawl-pet -f local "CstcePq.png"复制代码

更多命令请查看帮助

~ $ crawl-pet -h复制代码

-------------------------------------------------------------------

GIthub 地址:github.com/wl879/crawl…

项目里的 crawlers 文件夹中有一些示例,有福利啊。

相关文章
相关标签/搜索