Node.js Request+Cheerio实现一个小爬虫-基础功能实现1:内容抓取
Node.js Request+Cheerio实现一个小爬虫-基础功能实现2:文件写入
Node.js Request+Cheerio实现一个小爬虫-基础功能实现3:流程控制及并发控制
Node.js Request+Cheerio实现一个小爬虫-番外篇:代理设置
之前几篇介绍了简单爬虫的实现方法。在防止被目标网站403方法中,除了控制并发之外,最重要的就是使用代理。
之前使用的Request模块中,也是有Proxy模块的。
不过由于我英文太烂,官方文档中关于Proxy的使用没怎么看懂。在网上找了一下,也只有这一篇 如何用nodejs设置proxy进行https请求?.
在做了相同的修改之后,程序并没有顺利抓取到网站。不知道是为什么,如果有知道的同学,还请指点一下。
var proxy = 'http://114.215.241.176:8080';
var option = {
url: url,
proxy: proxy,
headers: {
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
'Accept-Language': 'zh-CN,zh;q=0.8,zh-TW;q=0.6',
'Host': 'www.dianping.com',
'User-Agent': 'Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Mobile Safari/537.36',
'Cache-Control': 'max-age=0',
'Connection': 'keep-alive'
}
};
request(url, option, function(error, response, body) {
console.info(response.statusCode); // 在这里就会报错,因为request请求就没有建立
if (!error && response.statusCode == 200) {
......省略后续代码
不过,虽然Request模块没能搞定,我们还是可以使用原生或者借助其他模块来实现通过代理来进行抓取。
- 原生方法
首先就说一下Node.js自带的使用代理的方法。这个方法在http/https模块中。
利用下面代码就可以实现。
var http = require('http'); // 使用http模块,也可以换成https模块
var opt = {
host: '58.246.194.70', // 这里是代理服务器的地址
port: '808', // 这里是代理服务器的端口号
method: 'GET', // 这里是发送的方法
path: 'url', // 这里是访问的路径
headers: {
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
'Accept-Language': 'zh-CN,zh;q=0.8,zh-TW;q=0.6',
'Host': 'www.dianping.com',
'User-Agent': 'Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Mobile Safari/537.36',
'Cache-Control': 'max-age=0',
'Connection': 'keep-alive'
}
};
var body = '';
var req = http.request(opt, function(res) {
console.log("Got response: " + res.statusCode);
res.on('data', function(d) {
body += d;
}).on('end', function() {
//console.log(res);
console.info('============');
console.log(body)
});
}).on('error', function(e) {
console.log("Got error: " + e.message);
})
req.end();
-
使用SuperAgent以及superagent-proxy模块
上面是使用了原生方法的例子。当然,为了使用方便以及加快开发的速度,我们就会引入模块。SuperAgent也是一个可以封装好的http模块,功能和Request模块也差不多。如果要使用代理模块的还,还需要额外的拓展模块SuperAgent-Proxy。SuperAgent官网地址
SuperAgent-proxy官网地址
安装方法就不介绍了,基本玩node的同学应该都清楚。那么就来看看使用SuperAgent的代码。
const superagent = require('superagent'); // 引入SuperAgent
require('superagent-proxy')(superagent); // 引入SuperAgent-proxy
var proxy = 'http://114.215.241.176:8080'; // 设置代理
var header = {
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
'Accept-Language': 'zh-CN,zh;q=0.8,zh-TW;q=0.6',
'Host': 'www.dianping.com',
'User-Agent': 'Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Mobile Safari/537.36',
'Cache-Control': 'max-age=0',
'Connection': 'keep-alive'
};
superagent // 发起请求
.get('目标URL')
.set('header', header)
.proxy(proxy)
.end(onresponse);
// 对返回的response进行处理
function onresponse(err, res) {
if (err) {
console.log(err);
} else {
console.log(res.status, res.headers);
//console.log(res.body);
}
}
上面就是通过代理来抓取页面的方法。如果和并发控制结合在一起的话能更有效的防止403吧。
感觉代理还是一个挺难搞的东西(当然也可能是因为我英文不够,看不懂文档的关系T T)
不过,只是简单的抓取页面的话应该也不一定会用上代理。所以这一篇就作为这一个Node爬虫的番外了。