网络爬虫
网络爬虫是一种非常有意思的程序。偌大的Internet,就像是一只蜘蛛织成的大网:一个个超级链接就是蛛丝,将无数页面连接起来,而网络爬虫,则会沿着一根根蛛丝,爬遍每一个节点……
写爬虫思路
1.按照一定的规律发送 HTTP 请求获得页面 HTML 源码(必要时需要加上一定的 HTTP 头信息,比如 cookie 或 referer 之类)
2.利用正则匹配或第三方模块解析 HTML 代码,提取有效数据
3.将数据持久化到数据库中
爬虫原理
抓取初始URL的页面内容,提取URL列表,放入URL队列中,
从URL队列中取一个URL地址,抓取这个URL地址的内容,提取URL列表,放入URL队列中...
NodeJS写网络爬虫
1.创建工程
进入桌面 cd desktop
创建文件夹 mkdir NodeJS cd NodeJS mkdir pachong
创建依赖文件npm init package.json
下载模块npm install async cheerios mkdirp pathrequest superagent -save
2.创建app.js
touch app.js
open app.js
3.编写app.js
var request = require('request');
var cheerio = require('cheerio');
var path = require('path');
var fs = require('fs');
var async = require('async');
var mkdirp = require('mkdirp');
// 需要爬的网址
function getUrls() {
var urls = []
, baseUrl = 'http://www.mmjpg.com/mm/';
for (var i = 470; i < 485; i++) {
var tmp = baseUrl + i;
urls.push(tmp);
var dir='./mei/'+i;
//创建目录
mkdirp(dir, function(err) {
if(err){
console.log(err);
}
else console.log(dir+'文件夹创建成功!');
});
}
return urls;
}
var urls = getUrls();
async.eachSeries(urls, function (url, callback) {
fetchUrl(url, callback);
}, function (err, result) {
console.log('大门已经全部打开,安静等待下载吧。');
});
// 抓取网页内容
function fetchUrl(url,callback) {
var options = {
url: url,
headers: {
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.99 Safari/537.36',
'Connection':'keep-alive'
}
};
console.log('打开新世界大门:'+options.url);
request(options, function (error, response, body) {
if(error) console.log(error);
else console.log('成功打开新世界大门'+options.url);
if (!error && response.statusCode == 200) {
acquireData(options.url,body);
callback(null, null);
}
})
}
function acquireData(url,data) {
var $ = cheerio.load(data);
var meizi = $('#content img').toArray();
var mm= $('#page a').eq(6).text();
console.log('获得:'+mm+'张妹子图');
var list=url.split('/');
for (var i=1; i<mm;i++){
var imgsrc =path.dirname(meizi[0].attribs.src)+'/'+i+'.jpg';
console.log(imgsrc);
var filename = parseUrlForFileName(imgsrc); //生成文件名
downloadImg(imgsrc,filename,'./mei/'+list[4],function() {
console.log(filename + ' done');
});
}
}
function parseUrlForFileName(address) {
var filename = path.basename(address);
return filename;
}
var downloadImg = function(uri, filename, dir, callback){
request({uri: uri, encoding: 'binary'}, function (error, response, body) {
if (!error && response.statusCode == 200) {
if(!body) console.log("(╥╯^╰╥)哎呀没有内容。。。")
fs.writeFile(dir+'/'+filename, body, 'binary', function (err) {
if (err) {console.log(err);}
console.log('o(* ̄▽ ̄*)o偷偷下载'+dir+'/'+filename + ' done');
});
}
});
};
4.运行app.js
npm app.js
爬到的图片已经存在 mei文件夹中