关于爬虫,主流技术是用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();