介绍一个简单的爬虫框架,重点就是简单,那就直接来试一下吧。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 文件夹中有一些示例,有福利啊。