如何在 Python 中使用 Scrapy 配合 ProxyScrape 住宅代理
将 ProxyScrape 住宅代理集成到你的 Scrapy 爬虫中,以实现可靠的 Python 网页抓取。包括轮换中间件、身份验证和 SOCKS5 设置。
概述
Scrapy 是一个强大的 Python 网页抓取框架,但许多网站会阻止来自单个 IP 的请求。使用 ProxyScrape 的代理有助于分散请求、避免速率限制并访问受地理限制的内容。ProxyScrape 提供住宅、数据中心和移动代理,支持 HTTP 和 SOCKS5,可按需付费或按月固定计费,并拥有 9700 万+ IP 池,专为长期稳定运行而构建。
本教程向你展示如何将 ProxyScrape 代理集成到 Scrapy 项目中。你将学习配置身份验证、按请求轮换代理以及处理常见错误。该方法适用于 Windows、macOS 和 Linux。
前置条件
- 已安装 Python 3.8 或更高版本。
- 已安装 Scrapy(
pip install scrapy)。 - 拥有一个带有住宅或数据中心代理的 ProxyScrape 账户。你可以注册套餐或使用按需付费。
- 你的代理凭据:来自 ProxyScrape 仪表板的主机、端口、用户名和密码。
理解 Scrapy 中的代理身份验证
ProxyScrape 使用用户名/密码身份验证。在 Scrapy 中,你通过请求的 proxy meta 键传入代理 URL。格式为:
- HTTP/HTTPS:
http://username:password@host:port - SOCKS5:
socks5://username:password@host:port
Scrapy 原生支持 HTTP 和 HTTPS 代理。对于 SOCKS5,你需要额外的包,例如 scrapy-socks。
第 1 步:安装 Scrapy 并创建项目
打开终端并运行:
pip install scrapy
scrapy startproject proxyscrape_scrapy
cd proxyscrape_scrapy
这会创建一个新的 Scrapy 项目,带有默认的爬虫目录。
第 2 步:从 ProxyScrape 获取代理凭据
登录你的 ProxyScrape 仪表板并创建代理列表。你将获得主机、端口、用户名和密码。对于住宅代理,你可能会获得一个自动轮换的网关主机,或一组端点。对于数据中心代理,你通常会获得固定的 IP 和端口。
示例凭据:
- 主机:
proxy.proxyscrape.com - 端口:
8080 - 用户名:
user123 - 密码:
pass456
你的代理 URL 变为:http://user123:[email protected]:8080
如果你的密码包含特殊字符,请对其进行 URL 编码(例如,@ 变为 %40)。
第 3 步:在爬虫中配置基本代理
创建一个简单的爬虫,通过代理检查你的 IP 地址。在 proxyscrape_scrapy/spiders/example.py 中:
import scrapy
class ExampleSpider(scrapy.Spider):
name = 'example'
start_urls = ['https://httpbin.org/ip']
def start_requests(self):
proxy = 'http://user123:[email protected]:8080'
for url in self.start_urls:
yield scrapy.Request(
url,
meta={'proxy': proxy},
callback=self.parse
)
def parse(self, response):
yield {'ip': response.text}
运行爬虫:
scrapy crawl example -O output.json
输出显示目标站点看到的 IP 地址。如果它与你的代理 IP 匹配,则设置有效。
第 4 步:实现轮换代理中间件
按请求轮换代理可提高匿名性并降低被封禁的几率。在 proxyscrape_scrapy/middlewares.py 中创建中间件:
import random
from scrapy import signals
class ProxyRotationMiddleware:
def __init__(self, proxies):
self.proxies = proxies
@classmethod
def from_crawler(cls, crawler):
return cls(crawler.settings.getlist('PROXY_LIST'))
def process_request(self, request, spider):
proxy = random.choice(self.proxies)
request.meta['proxy'] = proxy
spider.logger.debug(f'Using proxy: {proxy}')
在 settings.py 中启用中间件并定义你的代理列表:
DOWNLOADER_MIDDLEWARES = {
'proxyscrape_scrapy.middlewares.ProxyRotationMiddleware': 543,
}
PROXY_LIST = [
'http://user1:pass1@host1:port1',
'http://user2:pass2@host2:port2',
'http://user3:pass3@host3:port3',
]
现在每个请求都会使用列表中的随机代理。你可以用多个 ProxyScrape 端点填充该列表,或使用他们的轮换网关(一个自动轮换的端点)。
第 5 步:处理 SOCKS5 代理(可选)
Scrapy 原生不支持 SOCKS5。安装 scrapy-socks:
pip install scrapy-socks
将 SOCKS5 中间件添加到 settings.py:
DOWNLOADER_MIDDLEWARES = {
'scrapy_socks.Socks5DownloaderMiddleware': 543,
}
然后在请求 meta 中将代理设置为 socks5://user:pass@host:port。请注意,如果没有自定义逻辑,你不能同时使用轮换中间件和 scrapy-socks。对于大多数用例,HTTP 代理更简单且足够。
第 6 步:测试并验证轮换
运行你的爬虫并检查输出:
scrapy crawl example -O output.json
检查 output.json。如果你在请求之间看到不同的 IP 地址,说明轮换正在工作。你还可以在请求之间添加延迟以保持礼貌:
DOWNLOAD_DELAY = 2
故障排除
- 407 Proxy Authentication Required:检查你的用户名和密码。确保它们已进行 URL 编码。验证你的 ProxyScrape 套餐是否有效。
- 连接被拒绝或超时:确认主机和端口。检查你的防火墙或 VPN。尝试不同的代理端点。
- 频繁被封禁:切换到住宅代理,增加
DOWNLOAD_DELAY,并启用轮换。数据中心代理在严格站点上更可能被封禁。 - SOCKS5 错误:确保已安装并配置
scrapy-socks。如果出现导入错误,请重新安装该包。 - SSL 错误:如果目标站点需要,添加
DOWNLOAD_HANDLERS或在代理 URL 中使用https。
为 Scrapy 选择合适的代理类型
| 代理类型 | 最适合 | 说明 |
|---|---|---|
| 住宅 | 抓取具有反机器人保护的网站 | 高匿名性、大 IP 池、速度较慢 |
| 数据中心 | 高速抓取保护较少的网站 | 更快、更便宜、更容易被封禁 |
| 移动 | 抓取移动端特定内容或应用 | 很少被封禁、成本更高 |
ProxyScrape 提供所有三种类型,并采用灵活计费。对于大多数抓取任务,从住宅代理开始。
总结
你已经学习了如何将 ProxyScrape 代理集成到 Scrapy 中:安装 Scrapy、获取凭据、配置基本代理、构建轮换中间件,以及可选地使用 SOCKS5。测试你的设置并调整轮换和延迟以避免被封禁。ProxyScrape 可靠的住宅和数据中心代理拥有 9700 万+ IP 和长期稳定运行,使其成为 Python 抓取项目的可靠选择。