返回博客
指南
拉卢卡·彭丘克2023年2月3日阅读时间:6分钟

精通网页抓取:如何在 Python 中轮换代理

精通网页抓取:如何在 Python 中轮换代理

设置环境

在开始之前,让我们先确认是否已准备好所需的工具。首先,请从官方网站下载并安装最新版本的 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使得这一过程变得简单易行。通过遵循本指南中概述的步骤,您不仅了解了如何对单个请求使用代理,还掌握了如何加快代理轮换过程。

此外,在扩展项目规模时,你还掌握了一些关于代理轮换的额外技巧。

请记住,有效的代理轮换能大大提高网页抓取项目的成功率,本指南已为您提供了像专业人士一样操作所需的工具和知识。祝您抓取顺利!

关于作者
Raluca Penciuc,WebScrapingAPI 全栈开发工程师
Raluca Penciuc全栈开发工程师

Raluca Penciuc 是 WebScrapingAPI 的全栈开发工程师,主要负责开发爬虫、优化规避机制,并探索可靠的方法以降低在目标网站上的被检测概率。

开始构建

准备好扩展您的数据收集规模了吗?

加入2,000多家企业,使用WebScrapingAPI在无需任何基础设施开销的情况下,以企业级规模提取网页数据。