设置环境
在开始之前,让我们先确认是否已准备好所需的工具。首先,请从官方网站下载并安装最新版本的 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('无法连接到代理')
如果你成功找到了一个可用的免费代理,运行代码后你会发现结果已经发生了变化,因为显示的不再是你的真实 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使得这一过程变得简单易行。通过遵循本指南中概述的步骤,您不仅了解了如何对单个请求使用代理,还掌握了如何加快代理轮换过程。
此外,在扩展项目规模时,你还掌握了一些关于代理轮换的额外技巧。
请记住,有效的代理轮换能大大提高网页抓取项目的成功率,本指南已为您提供了像专业人士一样操作所需的工具和知识。祝您抓取顺利!




