环境搭建
开始之前,请确保已准备好必要的工具。首先,请从官方网站下载并安装最新版本的 Python。
在本教程中,我们将使用 Visual Studio Code 作为集成开发环境(IDE),但您也可以选择使用任何其他 IDE。为您的项目创建一个新文件夹,并在其中创建一个名为 index.py 的新文件,我们将在此编写代码。
现在打开终端,运行以下命令安装发送请求所需的包:
pip install requests
就这样!我们可以开始编写代码了。
发送 GET 请求
让我们先发送一个简单的 GET 请求。在新创建的 index.py 文件中,编写以下代码:
import requests
response = requests.get('https://api.ipify.org/?format=json')
print(response.text)
现在使用以下命令运行脚本:
py index.py
你会发现结果是你真实的 IP 地址,而且无论你运行脚本多少次,显示的结果都是一样的。
本指南旨在向您展示如何隐藏真实 IP 地址,以及如何在每次运行脚本时获取不同的 IP 地址。此时,代理就派上用场了。您可以在以下结构中找到它们:
http://proxy_username:proxy_password@proxy_host:proxy_port
协议可以是“http”、“https”、“socks4”或“socks5”,而“proxy_username”和“proxy_password”是可选的。
更新后的代码应如下所示:
import requests
proxy_schema = {
"http": "http://proxy_username:proxy_password@proxy_host:proxy_port",
"https": "https://proxy_username:proxy_password@proxy_host:proxy_port"
}
URL = 'https://api.ipify.org/?format=json'
response = requests.get(URL, proxies=proxy_schema)
print(response.text)
您可以将代理模板替换为免费代理服务提供的真实代理,仅用于测试。但需要说明的是,这些代理并不可靠,仅应用于测试目的。
无论如何,考虑到即便是最好的代理有时也会不稳定,在代码中处理异常是最佳实践:
try:
URL = 'https://api.ipify.org/?format=json'
response = requests.get(URL, proxies=proxy_schema, timeout=30)
print(response.text)
except:
print('Unable to connect to the proxy')
若您成功找到了可用的免费代理,运行代码后会发现结果已发生变化,因为显示的不再是您的真实 IP 地址。
轮换代理
现在让我们看看如何利用多个代理来匿名化请求。同时,我们还将优化脚本的运行速度。我们将使用“concurrent.futures”库以异步方式发送请求。
首先,假设我们拥有以下代理列表(或代理池):
proxy_pool = [
"http://191.5.0.79:53281",
"http://202.166.202.29:58794",
"http://51.210.106.217:443",
"http://5103.240.161.109:6666"
]
这可以是硬编码的,也可以从文件中读取,由你决定。利用这一点,我们可以编写以下代码:
from concurrent.futures import ThreadPoolExecutor
with ThreadPoolExecutor(max_workers=8) as pool:
for response in list(pool.map(scrape_job, proxy_pool)):
pass
我们初始化一个最多包含 8 个工作线程的线程池,用于执行函数“scrape_job”(稍后定义),该函数将接收“proxy_pool”列表中的一个元素作为参数。
现在,“scrape_job”函数将实现我们之前编写的代码,只需稍作调整:
def scrape_job(proxy):
try:
URL = 'https://api.ipify.org/?format=json'
proxy_scheme = {
"http": proxy,
"https": proxy
}
response = requests.get(URL, proxies=proxy_scheme, timeout=30)
print(response.text)
except:
print('Unable to connect to the proxy')
“proxy_scheme”变量现在将根据作为参数传入的代理地址进行动态赋值。该脚本还可以进一步扩展以支持多个 URL,并为每个 URL 设置特定的超时值。
运行该脚本应能同时发送多个 GET 请求,其结果将返回不同的 IP 地址(前提是免费代理正常工作)。
扩展
在开始轮换代理时,有几个关键的最佳实践可帮助确保代理轮换尽可能有效。以下是一些需注意的提示:
免费代理不可取
虽然免费代理服务看似经济实惠,但它们往往不可靠,甚至可能危及您的抓取工作。建议投资于能提供更高安全性和可靠性的付费代理服务。
抓取前测试
在开始抓取之前,建议先测试您的代理轮换机制,以确保其按预期运行。这有助于您在后续出现问题之前及时发现并解决潜在故障。
使用用户代理轮换
轮换 IP 地址是规避反爬虫措施的有效手段,但这并非您应依赖的唯一技术。将 IP 轮换与用户代理轮换(可改变浏览器特征)相结合,能进一步增加网站检测和封锁您的爬虫的难度。
优质代理服务
并非所有代理服务都具有同等质量,因此务必进行充分调研,选择能提供高安全性和可靠性的服务商。应寻找提供丰富IP地址和地理位置选择的服务,并具备自动IP轮换和匿名浏览等功能。
使用网页抓取 API
使用网络爬虫API是简化代理轮换流程的绝佳方式,特别是对于网络爬虫新手而言。优质的爬虫API会为您自动处理代理轮换,并提供简洁易用的界面,助您轻松获取所需数据。
其代理轮换机制能彻底规避封禁风险,而丰富的知识库则支持随机化浏览器数据,使其行为与真实用户无异。
不过,如果您希望继续使用自己的爬虫,或者您的使用场景过于复杂,也可以选择将 API 作为代理来调用。请求将直接重定向至 API,而您的脚本则能享受代理轮换带来的便利。
结论
总而言之,掌握代理轮换是网络爬虫的核心技术,而 Python 使其实现变得简单。通过遵循本指南中概述的步骤,您不仅了解了如何对单个请求进行代理,还掌握了如何加速代理轮换过程。
此外,您还掌握了在项目扩展时关于代理轮换的一些额外技巧。
请记住,有效的代理轮换能显著提高网页抓取项目的成功率,而本指南已为您提供了像专业人士一样操作所需的工具和知识。祝您抓取顺利!




