介紹一個簡單的爬蟲框架,重點就是簡單,那就直接來試一下吧。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 文件夾中有一些示例,有福利啊。