关于爬虫,主流技术是用python,然而随着node的出现,那些对python了解有限的前端同学,用node来实现一个爬虫也不失为一个不错的选择。
当然无论是python爬虫还是node爬虫或其他语言,其实语言特性之外,其思路基本大同小异。下面我就为大家详细介绍下node爬虫的具体思路与实现,内容大概如下。
既然要写爬虫,当然要爬一些利益相关的数据比较有意义。爬取招聘网站的招聘信息,来看看互联网圈子里各个工种的目前薪酬状况及其发展前景,那就以拉钩网为数据来源。
在爬取过程中我们需要进行并发控制,做过爬虫的都知道,爬虫的请求并发量是必须要做的,为什么要控制并发?
- 控制其爬取频率,以免没爬几个就网站被封IP了。
- 控制爬虫应用运行内存,不控制并发的话一下子处理N个请求,内存分分钟爆炸。
但是就算再怎么控制并发量也是会中招的。
对于拉钩网这种反爬措施比较暴躁的网站来说,一个IP爬取太过频繁,被识别成机器爬虫几乎是不可避免的,这种情况最直接的办法就是更换ip,特别需要的是优质爬虫代理ip,以下就是更换了优质爬虫代理ip后的实现效果。
const http = require("http"); const url = require("url");
// 要访问的目标页面
const targetUrl = "https://www.lagou.com/";const urlParsed = url.parse(targetUrl);
// 代理服务器(产品官网 www.16yun.cn)
const proxyHost = "t.16yun.cn";
const proxyPort = "36600";// 生成一个随机 proxy tunnel
var seed = 1;
function random() {
var x = Math.sin(seed++) * 10000;
return x - Math.floor(x);
}
const tunnel = random()*100;// 代理验证信息
const proxyUser = "16JDLSAS";
const proxyPass = "457890";const base64 = new Buffer.from(proxyUser + ":" + proxyPass).toString("base64");
const options = {
host: proxyHost,
port: proxyPort,
path: targetUrl,
method: "GET",
headers: {
"Host": urlParsed.hostname,
"Proxy-Tunnel": tunnel,
"Proxy-Authorization" : "Basic " + base64
}
};
http.request(options, function (res) {
console.log("got response: " + res.statusCode);
res.pipe(process.stdout);
}).on("error", function (err) {
console.log(err);
}).end();