返回博客
指南
Raluca PenciucLast updated on Mar 31, 20261 min read

精通网络爬虫:如何在 Python 中轮换代理

精通网络爬虫:如何在 Python 中轮换代理

在当今的数字时代,网络爬虫技术的应用日益普及。然而,随着其普及程度的提高,那些不希望数据被爬取的网站和服务也对此加强了审查。

如果您希望自动化数据提取任务,可能已经遇到过需要使用代理来隐藏 IP 地址的情况。然而,长期使用同一个代理很容易导致被封禁。这就是代理轮换派上用场的地方。

本文将探讨如何在 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('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 使其实现变得简单。通过遵循本指南中概述的步骤,您不仅了解了如何对单个请求进行代理,还掌握了如何加速代理轮换过程。

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

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

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

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

开始构建

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

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