如何在 Python 中旋转代理

如何在 Python 中旋转代理

在本指南中,我将向您介绍代理、为什么需要代理轮换以及如何在 Python 中设置代理。没有复杂的专业术语,只有简单实用的步骤,让你的搜刮工作顺利进行。让我们深入了解!

什么是代理?

代理是计算机与互联网之间的中间服务器。当您使用代理发出请求时,它会将请求转发到目标网站,然后返回响应。这个过程有助于隐藏你的实际 IP 地址。

代理类型

  1. 数据中心代理 - 速度快,成本低,但很容易被检测到。
  2. 住宅代理 - 使用分配给住户的真实 IP,使其更难被发现。
  3. 移动代理 - 使用移动设备的 IP 地址,提供最高的匿名性。
  4. ISP 代理服务器 - 与住宅代理类似,但由 ISP 提供,用于稳定连接。

代理服务器可帮助您避免检测、绕过限制和访问特定地区的内容。

为什么在 Python 中使用代理旋转?

在网络搜刮或自动请求时,使用单一 IP 地址可能会导致速率限制、验证码或 IP 禁止。代理轮换有助于

  • 防止 IP 屏蔽 - 将请求分布在多个 IP 上,以避免被发现。
  • 旁路速率限制 - 网站会限制来自单一 IP 的请求,但旋转代理可以绕过这一限制。
  • 访问受地理限制的内容 - 有些网站会根据位置显示不同的内容。使用不同国家的代理可以访问这些内容。

在 Python 中设置代理轮换

现在,让我们看看如何使用不同的 Python 库实现代理旋转。

使用请求库轮流代理

请求库是用 Python 进行 HTTP 请求的最简单方法之一。我们可以使用可用代理列表手动轮换代理。

步骤 1:安装请求

首先,安装请求库:

pip install requests

步骤 2:定义代理旋转逻辑

创建一个 Python 文件(rotate_requests.py)并添加以下代码:

import random
import requests
# List of proxies
代理列表 = [
"http://username:password@proxy_1:port",
"http://username:password@proxy_2:port",
"http://username:password@proxy_3:port"
]
# 获取随机代理的功能
def 获取随机代理():
return random.choice(proxies_list)
# 使用代理轮换进行请求
for i in range(5): # 请求数
proxy = get_random_proxy()
代理 = {
"http": proxy,
"https":代理
}
try:
response = requests.get("https://httpbin.io/ip"代理=代理, 超时=5)
print(f"Request {i 1} from {proxy}: {response.json()}")
except requests.exceptions.RequestException as e:
print(f"Request {i 1} 代理失败 {proxy}: {e}")

步骤 3:运行脚本

使用

python rotate_requests.py

每个请求将从不同的代理发送。这种方法适用于小规模的刮擦,但在高效处理大型请求方面有局限性。

使用 AIOHTTP(异步请求)轮流代理

请求库一次处理一个请求。为了加快请求处理速度,我们可以使用 AIOHTTP,允许异步代理轮换。

步骤 1:安装 AIOHTTP

安装 aiohttp 库:

pip install aiohttp

步骤 2:定义代理旋转逻辑

创建一个 Python 文件(rotate_aiohttp.py)并添加以下代码:

import aiohttp
import asyncio
import random
# List of proxies
代理列表 = [
"http://username:password@proxy_1:port",
"http://username:password@proxy_2:port",
"http://username:password@proxy_3:port"
]
# 使用代理获取 IP 的功能
async def fetch_ip(会话、代理、尝试):
try:
async with session.get("https://httpbin.io/ip", proxy=proxy) as 响应:
json_response = await response.json()
print(f"Attempt {试图} using {proxy}: {json_response}")
except Exception as e:
print(f"Attempt {试图}{proxy}: {e}")
# 同时发送请求的主要功能
async def main():
async with aiohttp.ClientSession() as 会话:
任务 = []
for i in range(5): # 请求数
proxy = random.choice(proxies_list)
tasks.append(fetch_ip(session, proxy, i 1))
await asyncio.gather(*tasks)
# 运行异步事件循环
asyncio.run(main())

步骤 3:运行脚本

使用

python rotate_aiohttp.py

这种方法可同时发送多个请求,因此比请求方法更快、更有效。

使用 Scrapy 旋转代理

Scrapy 是一个功能强大的网络搜刮框架,支持内置代理旋转。

步骤 1:安装 Scrapy

安装 Scrapy 和旋转代理中间件:

pip install scrapy scrapy-rotating-proxies

步骤 2:创建 Scrapy 项目

在工作目录下创建一个新的 Scrapy 项目:

scrapy startproject proxy_scraper
cd proxy_scraper

步骤 3:配置代理轮换

修改 Scrapy 项目中的 settings.py:

# 启用代理中间件
DOWNLOADER_MIDDLEWARES = {
"rotating_proxies.middlewares.RotatingProxyMiddleware"(旋转代理中间件: 610,
"rotating_proxies.middlewares.BanDetectionMiddleware"(旋转代理中间件)。: 620,
}
# 轮流代理列表
旋转代理列表 = [
"http://PROXY_1:PORT",
"http://PROXY_2:PORT",
"http://PROXY_3:PORT"
]
# 重试设置
RETRY_TIMES = 5
retry_http_codes = [500, 502, 503, 504, 403, 408]
步骤 4:创建蜘蛛
在 spiders/ 目录下创建一个名为 ip_spider.py 的文件:
import scrapy
class IpSpider(scrapy.Spider):
name = "ip_spider
start_urls = ["https://httpbin.io/ip"]
def parse(self, response):
ip = response.json().get("origin")
self.log(f "IP 地址: {ip}")

步骤 4:运行蜘蛛

使用

scrapy crawl ip_spider

Scrapy 会在扫描时自动旋转代理。

结论

使用这些代理轮换技术,你可以顺利地搜刮数据,而不必担心屏蔽或限制。在不同的 IP 之间切换,可以帮助你避开雷达,绕过速率限制,从不同的地点访问内容。

如果您正在处理小型项目,像请求这样的简单方法就可以胜任。但对于大型任务,使用 AIOHTTP 或 Scrapy 会更快更有效。

请记住 免费代理 可能是不可靠的,因此选择一个 优秀的旋转代理提供商 可以为你省时省事。既然你已经知道了如何轮换代理,那么你就可以更聪明地进行搜刮,避免被屏蔽了。感谢您的阅读!

类似文章