在进行爬虫开发时,使用 HTTP 代理是非常常见的做法,而且使用 HTTP 代理可以达到以下几个目的:
- 隐藏爬虫的真实 IP 地址;
- 避免被网站针对 IP 地址进行封禁;
- 突破针对特定 IP 地址或地理位置的访问限制;
本文将介绍如何在 Node.js 中更好地使用 HTTP 代理,包括如何使用代理池、如何实现自动切换代理等技巧。同时,本文还会提供相应的示例代码。
什么是 HTTP 代理?
HTTP 代理,顾名思义,就是可以代理 HTTP 请求的服务。它的工作原理是把客户端的 HTTP 请求通过代理服务器转发到目标服务器并返回结果,代理服务器与目标服务器之间相互通信,而客户端则被“隐藏”在代理服务器后面。
使用 HTTP 代理时,可以在请求中设置相应的代理地址和代理端口,通常形如:
http://<proxy_host>:<proxy_port>/
如何使用 HTTP 代理?
在 Node.js 中,可以使用第三方库 request
或 axios
来发送 HTTP 请求并设置代理。
使用 request
发送 HTTP 请求并设置代理
// javascriptcn.com 代码示例 const request = require('request'); const proxyUrl = 'http://<proxy_host>:<proxy_port>/'; request({ url: 'http://www.example.com/', proxy: proxyUrl }, function(error, response, body) { // 请求处理逻辑 });
使用 axios
发送 HTTP 请求并设置代理
// javascriptcn.com 代码示例 const axios = require('axios'); const proxyUrl = 'http://<proxy_host>:<proxy_port>/'; axios.get('http://www.example.com/', { proxy: { host: '<proxy_host>', port: '<proxy_port>' } }) .then(function (response) { // 请求处理逻辑 }) .catch(function (error) { console.log(error); });
注意,如果代理服务器需要身份验证,可以在请求中设置相应的用户名和密码:
// javascriptcn.com 代码示例 const axios = require('axios'); const proxyUrl = 'http://<proxy_user>:<proxy_password>@<proxy_host>:<proxy_port>/'; axios.get('http://www.example.com/', { proxy: { host: '<proxy_host>', port: '<proxy_port>' } }) .then(function (response) { // 请求处理逻辑 }) .catch(function (error) { console.log(error); });
如何使用代理池?
在进行爬虫开发时,通常会需要使用多个代理服务器来避免被封禁,或者针对特定 IP 地址或地理位置进行访问限制时使用代理池。
代理池分为两种:静态代理池和动态代理池。
静态代理池
静态代理池指在程序运行前就预先设置好代理服务器地址和端口,然后在程序运行时依次使用不同的代理去访问目标服务器。
// javascriptcn.com 代码示例 const request = require('request'); const proxyList = [ { host: '<proxy_host1>', port: '<proxy_port1>' }, { host: '<proxy_host2>', port: '<proxy_port2>' }, { host: '<proxy_host3>', port: '<proxy_port3>' } ]; function requestWithProxy(url, callback, i) { if (i >= proxyList.length) return console.log('Cannot connect to the server'); const proxyUrl = 'http://' + proxyList[i].host + ':' + proxyList[i].port; request({ url: url, proxy: proxyUrl, timeout: 10000, headers: { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36' } }, function (error, response, body) { if (error) { console.log('ERROR: ' + error); requestWithProxy(url, callback, i + 1); } else { callback(response, body); } }); }
这里使用了递归的方式,当访问失败时,会尝试使用下一个代理服务器。这样可以确保不同的请求使用不同的代理服务器。
动态代理池
动态代理池指在程序运行时随机从一个代理服务器池中获取一个代理,并使用它去访问目标服务器。
这种方法比静态代理池更具弹性,因为它可以自动检测代理服务器的可用性,并且可以动态地增加或删除代理服务器。
// javascriptcn.com 代码示例 const axios = require('axios'); const proxyList = [ { host: '<proxy_host1>', port: '<proxy_port1>' }, { host: '<proxy_host2>', port: '<proxy_port2>' }, { host: '<proxy_host3>', port: '<proxy_port3>' } ]; function getRandomProxy() { const index = Math.floor(Math.random() * proxyList.length); const { host, port } = proxyList[index]; return { http: `http://${host}:${port}`, https: `http://${host}:${port}` }; } axios.get('http://www.example.com/', { proxy: getRandomProxy() }) .then(function (response) { // 请求处理逻辑 }) .catch(function (error) { console.log(error); });
这里使用了 axios
库来发送 HTTP 请求,并通过 getRandomProxy
函数从代理池中随机获取一个代理服务器。
总结
HTTP 代理是爬虫开发中非常有用的工具,它可以帮助我们避免被封禁、突破访问限制等。在本文中,我们介绍了如何使用 Node.js 中的 request
和 axios
库来使用 HTTP 代理,同时也分享了如何使用代理池来提高爬虫的可用性。希望本文对读者能够有所帮助。
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/65434c1b7d4982a6ebcf8a0a