node爬虫
node爬虫项目的总结
用到的包
-
request: 发送http请求;
-
cheerio: 后端jquery;
-
iconv: 转变字符集格式;
-
cron: 定时任务;
爬取utf8页面
const request = require('request');
const cheerio = require('cheerio');
request('https://www.baidu.com/', function (error, response, body) {
if (!error && response.statusCode == 200) {
var $ = cheerio.load(body);
console.log( $('#su').val() ) // 百度一下
}
});
爬取gbk页面
var options = {
url: 'http://www.163.com/',
encoding: null
}
request(options, function (error, response, body) {
if (!error && response.statusCode == 200) {
str = iconv.decode(body, 'gbk');
var $ = cheerio.load(str);
console.log( $('#_link_auto').text() ) // 汽车
}
})
爬取时伪造浏览器useragent以及请求头信息;
上面爬取网页页面其实会提示访问受限制,然后跑到上面这个受限制页面;是因为没有伪造浏览器头部信息
const iconv = require('iconv-lite');
var options = {
url: 'http://www.163.com/',
encoding: null,
headers: {
'user-agent': 'xx',
}
}
request(options, function (error, response, body) {
if (!error && response.statusCode == 200) {
str = iconv.decode(body, 'gbk');
console.log(str) // Show the HTML for the Google homepage.
}
})
定时爬取
// app.js; 起服务的页面
const fork = require('child_process').fork;
const CronJob = require('cron').CronJob;
var job = new CronJob('5,10,15,20,25,30,35,40,45,50 * * * * *', function() {
fork('crawl.js')
});
job.start();
// crawl.js 子进程js;
const request = require('request');
const cheerio = require('cheerio');
request('https://www.baidu.com/', function (error, response, body) {
if (!error && response.statusCode == 200) {
var $ = cheerio.load(body);
console.log( $('#su').val() ) // 百度一下
}
});
爬取页面需要带cookie信息怎么办?
方法一: 先模拟登录发送一个请求,从response的headers头信息里获取到cookie信息,再向目标页发送请求时带上cookie信息即可;获取表单提交data的key值方法:打开控制台,勾选preserve log
,填写表单信息后,点击提交,当页面跳转的时候原先页面的网络信息依然存在,找到对应的请求,查看请求体即可。
方法二: 利用phantomjs模拟浏览器登录行为。
var options = {
url: '登录发送的目标请求,可以在ajax的url里找到,也可以在form表单的action里获取到',
form: {
account:'xxx',
pwd:'xxx'
}
};
request.post(options,function(err,response) {
console.log(response.headers['set-cookie']);
var opt = {
url: '目标请求',
headers: {
'cookie': response.headers['set-cookie']
}
}
request(opt,function(error,res,body) {
console.log(body.toString());
})
})