在进行网络爬取时,IP代理被用于多种场景,例如市场研究、价格监控和品牌保护。不论你在哪种情况下使用代理,在爬取时轮换代理都是必不可少的。但为什么呢?
这篇初学者指南将详细解释为什么在爬取时需要轮换代理。接着,指南会详细介绍如何使用Python轮换代理。在文章的最后部分,你还会学到一些关于代理轮换的专业技巧和窍门。让我们开始吧!
什么是IP代理轮换以及为什么它很重要?
代理轮换是一个自动为新的网络爬取会话分配不同IP地址的过程。这个过程基于特定的时间框架、状态码或请求数量。
网络爬取领域的一个常见挑战是避免被目标网站屏蔽——这就是代理轮换发挥作用的地方。网站不喜欢机器人,可能会对来自同一IP地址的数千个请求产生怀疑。然而,通过轮换代理IP地址,你可以增强匿名性,模仿多个真实用户的行为,并绕过大多数反爬虫措施。
现在,主要有两种轮换IP地址的方法:你可以使用第三方轮换工具(例如,各大商家的代理轮换器),或者用Python自己构建一个。这里我们主要介绍后者。
在Python中轮换代理:安装前提条件
你应该从创建一个虚拟环境开始。可以通过运行以下命令来创建虚拟环境:
$ virtualenv venv
这将在venv文件夹中安装Python、pip和常用库。
接下来,你需要调用源命令来激活环境:
$ source venv/bin/activate
最后一步是在当前虚拟环境中安装requests模块:
$ pip install requests
这样你就成功安装了requests模块。
接下来,你需要创建一个扩展名为.py的文件,并在其中编写以下脚本(我们以Oxylabs为例):
import requests response = requests.get('https://ip.oxylabs.io/location') print(response.text)
现在,你可以从终端运行它:
$ python no_proxy.py 128.90.50.100
输出将显示你当前的IP地址。我们的目标是向你展示如何隐藏你的IP地址并轮换不同的IP地址,以保持匿名并避免被屏蔽。那让我们继续
通过代理发送GET请求
现在,让我们从基础开始:如何使用单个代理?为了使用代理服务器,你需要以下信息:
- 协议(例如,http);
- IP地址;
- 端口(例如,3128);
- 连接代理的用户名和密码(可选)。
一旦你有了所有这些信息,你需要按以下顺序进行设置:
SCHEME://USERNAME:PASSWORD@YOUR_PROXY_IP:YOUR_PROXY_PORT
以下是你可能遇到的一些代理格式示例:
http://2.56.215.247:3128 https://2.56.215.247:8091 https://my-user:[email protected]:8044
请注意,你可以指定多个协议,甚至可以为特定域名定义不同的代理:
scheme_proxy_map = { 'http': PROXY1, 'https': PROXY2, 'https://example.org': PROXY3, }
在你的Python代码文件中添加以下导入:
import requests from requests.exceptions import ProxyError, ReadTimeout, ConnectTimeout
最后,你应该尝试通过调用`requests.get`并传递我们之前定义的所有变量来发出请求。通过我们的脚本,还可以处理异常,并在网络问题发生时显示错误。
try: response = requests.get('https://ip.oxylabs.io/location', proxies=scheme_proxy_map, timeout=TIMEOUT_IN_SECONDS) except (ProxyError, ReadTimeout, ConnectTimeout) as error: print('Unable to connect to the proxy: ', error) else: print(response.text)
这个脚本的输出应显示你的代理IP地址:
$ python single_proxy.py 2.56.215.247
现在,当你通过Python脚本发出请求时,你已经隐藏在代理后面。接下来,我们可以学习如何轮换一组代理,而不是只使用一个代理。
使用代理池轮换代理
在本教程的这一部分,我们将使用一个名为proxies.csv的CSV文件中的代理列表:
http://2.56.215.247:3128 https://88.198.24.108:8080 http://50.206.25.108:80 http://68.188.59.198:80
…
每个代理服务器占一行
首先,创建一个Python文件,定义文件名以及你愿意等待单个代理响应的时间:
import aiohttp import asyncio import csv TIMEOUT_IN_SECONDS = 10 CSV_FILENAME = 'proxies.csv'
接下来,编写代码打开CSV文件,逐行读取每个代理服务器到`csv_row`变量中,并构建`requests`模块所需的`scheme_proxy_map`配置:
with open(CSV_FILENAME) as open_file: reader = csv.reader(open_file) for csv_row in reader: scheme_proxy_map = { 'https': csv_row[0], }
为了检查一切是否正常,我们将使用之前相同的爬取代码,通过代理访问网站:
with open(CSV_FILENAME) as open_file: reader = csv.reader(open_file) for csv_row in reader: scheme_proxy_map = { 'https': csv_row[0], } # Access the website via proxy try: response = requests.get('https://ip.oxylabs.io/location', proxies=scheme_proxy_map, timeout=TIMEOUT_IN_SECONDS) except (ProxyError, ReadTimeout, ConnectTimeout) as error: pass else: print(response.text)
如果你想使用列表中的任意一个可用代理来爬取公开内容,可以在`print`之后添加一个`break`,以停止继续遍历CSV文件中的代理:
response = requests.get('https://ip.oxylabs.io/location', proxies=scheme_proxy_map, timeout=TIMEOUT_IN_SECONDS) except (ProxyError, ReadTimeout, ConnectTimeout) as error: pass else: print(response.text) break # notice the break here
现在,唯一阻碍我们充分发挥潜力的就是速度。
如何使用async轮换代理
要使用async轮换代理,你应该使用`aiohttp`模块。你可以使用以下CLI命令来安装它:
$ pip install aiohttp
然后,你需要创建一个Python文件,并在其中定义:
- 包含代理列表的CSV文件名;
- 你希望用来检查代理的URL;
- 你愿意等待每个代理响应的时间——即超时设置。
CSV_FILENAME = 'proxies.csv' URL_TO_CHECK = 'https://ip.oxylabs.io/location' TIMEOUT_IN_SECONDS = 10
接下来,你需要定义一个async函数,并使用`asyncio`模块运行它。这个函数接受两个参数:
- 需要请求的URL;
- 用于访问该URL的代理。
然后,你需要打印响应。如果脚本在尝试通过代理访问URL时收到错误,它也会打印出来:
async def check_proxy(url, proxy): try: session_timeout = aiohttp.ClientTimeout(total=None, sock_connect=TIMEOUT_IN_SECONDS, sock_read=TIMEOUT_IN_SECONDS) async with aiohttp.ClientSession(timeout=session_timeout) as session: async with session.get(url, proxy=proxy, timeout=TIMEOUT_IN_SECONDS) as resp: print(await resp.text()) except Exception as error: # you can comment out this line to only see valid proxies printed out in the command line print('Proxy responded with an error: ', error) return
下一步是定义主函数,读取CSV文件并创建一个async任务,以检查CSV文件中每条记录的代理:
async def main(): tasks = [] with open(CSV_FILENAME) as open_file: reader = csv.reader(open_file) for csv_row in reader: task = asyncio.create_task(check_proxy(URL_TO_CHECK, csv_row[0])) tasks.append(task) await asyncio.gather(*tasks)
你应该运行主函数,并等待所有async任务完成。
asyncio.run(main())
现在你的代理将以最快速度运行。
更多关于代理轮换的建议
最后,让我们看看一些关于代理轮换的一般建议,以确保顺利进行网络爬取过程。
避免使用免费代理服务
尽管免费代理IP地址看起来很有吸引力,但使用它们的负面影响远大于正面影响。由于多人同时使用免费代理并且缺乏资金支持,它们往往会非常慢。免费代理提供商没有义务保证他们的代理始终可用:你可能今天开始进行爬取项目,第二天发现你使用的代理已经不可用了。
此外,免费代理还存在多种安全和隐私问题。例如,大多数免费代理提供商不支持加密的HTTPS连接。
想了解更多关于使用免费代理的风险,请查看我们的博客文章《为什么你不应该使用免费代理——风险与理由》。
将IP轮换与user-agent (用户代理) 轮换结合
user-agent是HTTP请求中的字符串,帮助网站识别浏览器、操作系统、软件和设备类型等细节。如果在短时间内从相同的操作系统和浏览器发出多次请求,目标网站可能会检测到可疑活动并禁止你。因此,除了轮换代理,你还应该轮换user-agent,以进一步避免被封锁。
选择可靠的高级代理服务
与其使用免费代理,冒着数据隐私和安全的风险,并处理速度慢的问题,强烈建议选择一个信誉良好的高级代理提供商(如Bright Data, Smartproxy, Soax 和 IPRoyal)。寻找一个透明的代理来源并能提供其代理是通过合法手段获得的证明的提供商。
结 论
代理轮换是成功进行网络爬取的关键;幸运的是,在Python中构建一个轮换器相对简单。通过上面的内容,你将能够轻松掌握这一方法。