2023-04-18 16:48

关于爬虫,主流技术是用python,然而随着node的出现,那些对python了解有限的前端同学,用node来实现一个爬虫也不失为一个不错的选择。

当然无论是python爬虫还是node爬虫或其他语言,其实语言特性之外,其思路基本大同小异。下面我就为大家详细介绍下node爬虫的具体思路与实现,内容大概如下。

既然要写爬虫,当然要爬一些利益相关的数据比较有意义。爬取招聘网站的招聘信息,来看看互联网圈子里各个工种的目前薪酬状况及其发展前景,那就以拉钩网为数据来源。

在爬取过程中我们需要进行并发控制,做过爬虫的都知道,爬虫的请求并发量是必须要做的,为什么要控制并发?

  1. 控制其爬取频率,以免没爬几个就网站被封IP了。

  2. 控制爬虫应用运行内存,不控制并发的话一下子处理N个请求,内存分分钟爆炸。

但是就算再怎么控制并发量也是会中招的。

1681807659374311.png

对于拉钩网这种反爬措施比较暴躁的网站来说,一个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();




评论