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 文件夾中有一些示例,有福利啊。

相關文章
相關標籤/搜索