in

如何为Node-Fetch使用代理服务器?

如何为Node-Fetch使用代理服务器

为什么是Node-Fetch?

Node-fetch是一个流行的HTTP客户端库,每周大约有2000万次下载;根据NPM,它也是有史以来下载量最大的NPM包之一。

Node-fetch的主要动机是实现一个类似于window.fetch的服务器端API,一个客户端的API;因为它是在浏览器中实现。该API主要用于在浏览器端进行异步请求以加载内容。然而,在服务器端,有许多更多的使用情况。

其中一个用例是网页爬取。网页爬取是在不打开真实浏览器的情况下以编程方式抓取网页。大多数网站并不喜欢被爬取,而使用代理是你可以用来爬取网页而不被阻止许多工具之一。

正如你将看到的那样,这并不像它看起来那样简单明了。


解决方案

不幸的是,Node-fetch并不支持代理。但有一个变通办法。通过使用node-https-proxy-agent,你将能够轻松地通过HTTPS代理转发你的所有请求。

以下是如何做到这一点:

// proxy_test.py


// npm install node-fetch
// npm install https-proxy-agent

const fetch = require('node-fetch');
const HttpsProxyAgent = require('https-proxy-agent');


(async () => {
    const proxyAgent = new HttpsProxyAgent('http://46.250.171.31:8080');
    const response = await fetch('https://httpbin.org/ip?json', { agent: proxyAgent});
    const body = await response.text();
    console.log(body);
})();

为了测试这个脚本,我们将使用一个公开提供HTTPS代理的免费代理服务。使用这种工具时要小心。这些工具会拦截你将通过它们发送的所有HTTP流量。他们可以对这些流量做任何事情。

既然如此,现在让我们检查一下它是否工作。如果我运行node proxy_test.py,响应将是{ip:"46.250.171.31"}


你应该知道的关于代理的事情

现在你知道了如何用node-fetch使用网络代理,在使用它们之前有几件事需要了解。

首先,不是所有的代理供应商都是平等的。一些代理服务器,如本例中使用的代理服务器,是免费的。如果你谨慎地使用这些代理,那将是最好的。根据定义,他们可以访问您发送给他们的所有HTTP流量。大多数免费代理服务都会公开显示他们使用的IP地址,这使得任何网站都可以轻易地阻止他们。我建议你只将这些代理服务用于小规模使用、单次脚本或大学作业,而且只有在你不介意别人看到你所有的HTTP流量时才使用。

但使用付费代理供应商也不能保证你的HTTP请求会成功。一些供应商会使用所谓的 “数据中心 “IP,很容易被网站屏蔽。其他人可能会卖给你 “住宅 “IP,更可靠,但非常昂贵。你会注意到,有些供应商比其他供应商快得多。如果你做一些研究,你会发现你也可以购买4g代理,这些代理将使用来自真实电话的IP。


代理服务器可能是不够的

使用代理只是一种技术,可以让你在不被封锁的情况下进行网络刮奖。但还有许多事情你应该注意。

例如,你肯定应该学习User-Agent和头文件。如果你不设置这些,网站检测到不是来自真实浏览器的流量是很容易的。如果你想爬取含有大量JavaScript的网站,你也应该考虑使用一个真正的浏览器,称为无头浏览器


总    结

综上所述,选择一个代理服务商并不容易,需要考虑几个标准:成功率、IP质量、速度、服务商的声誉等。下面是你如何用node-fetch做的:

// proxy_test.py


// npm install node-fetch
// npm install https-proxy-agent

const fetch = require('node-fetch');
const HttpsProxyAgent = require('https-proxy-agent');


(async () => {
    const proxyAgent = new HttpsProxyAgent('http://46.250.171.31:8080');
    const response = await fetch('https://httpbin.org/ip?json', { agent: proxyAgent});
    const body = await response.text();
    console.log(body);
})();

[文中代码源自Scrapingbee]

我希望你在阅读这篇文章时能学到一些新东西。如果你想了解更多关于JavaScript中的网页抓取,我真的建议你看一下这个用NodeJS爬取网络的指南

blank

Written by 爬取 大师

阿里P12级别选手,能够突破各种反爬, 全能的爬取大师,擅长百万级的数据抓取!没有不能爬,只有你不敢想,有爬取项目可以联系我邮箱 [email protected] (带需求和预算哈, 不然多半不回复)