Python中关于用Scrapy开发爬虫时如何使用代理IP的问题

用 Scrapy 开发爬虫时想使用多个代理服务器的 IP 来隐藏真实 IP,请教大家几个问题:
1、哪里可以找多个可用的代理 IP,以及如何判断 IP 是否可用,多个可用的 IP 间如何择优排序?
2、 有没有基于 SCRAPY 框架,使用代理 IP 来实现爬虫的范例可供学习呢?

感谢!
Python中关于用Scrapy开发爬虫时如何使用代理IP的问题

17 回复

在Scrapy里用代理IP,主要就两种方式:全局设置和每个请求单独设置。我一般推荐用中间件,这样最灵活。

1. 全局代理设置(最简单) 在你的 settings.py 文件里直接加一行:

DOWNLOADER_MIDDLEWARES = {
    'scrapy.downloadermiddlewares.httpproxy.HttpProxyMiddleware': 400,
}

HTTP_PROXY = 'http://your-proxy-ip:port'  # 例如 'http://12.34.56.78:8080'

这种方法所有请求都走同一个代理,适合测试或者固定IP的场景。

2. 自定义代理中间件(最常用、最推荐) 创建 middlewares.py 文件:

import random

class RandomProxyMiddleware(object):
    def __init__(self, proxy_list):
        self.proxies = proxy_list
    
    @classmethod
    def from_crawler(cls, crawler):
        # 从settings.py读取代理列表
        proxy_list = crawler.settings.get('PROXY_LIST', [])
        return cls(proxy_list)
    
    def process_request(self, request, spider):
        if self.proxies and not request.meta.get('proxy'):
            proxy = random.choice(self.proxies)
            request.meta['proxy'] = proxy
            spider.logger.debug(f'Using proxy: {proxy}')

然后在 settings.py 里配置:

DOWNLOADER_MIDDLEWARES = {
    'your_project.middlewares.RandomProxyMiddleware': 100,
}

PROXY_LIST = [
    'http://proxy1:port',
    'http://proxy2:port', 
    'http://proxy3:port'
]

这样每个请求会随机选一个代理,有效避免IP被封。

3. 单个请求设置代理 如果你只想给特定请求用代理:

yield scrapy.Request(
    url='http://example.com',
    meta={'proxy': 'http://your-proxy:port'},
    callback=self.parse
)

4. 处理需要认证的代理 如果代理需要用户名密码:

# 方法一:在代理地址里直接写
request.meta['proxy'] = 'http://user:pass@proxy-ip:port'

# 方法二:在请求头里加
import base64
proxy_user_pass = 'user:pass'
encoded_user_pass = base64.b64encode(proxy_user_pass.encode()).decode()
request.headers['Proxy-Authorization'] = f'Basic {encoded_user_pass}'

实际项目建议 我建议用第二种方法(自定义中间件),配合一个代理IP池服务。这样你可以:

  • 动态更换IP
  • 自动剔除失效代理
  • 根据响应状态码判断IP是否可用
  • 实现重试机制

如果你用Scrapy的 Crawlera 中间件就更简单了,那是专门为爬虫设计的代理服务。

核心就一句话:用自定义中间件管理代理池最靠谱。

  1. 代理 IP 直接购买就好,五块钱的代理够你爬很多很多很多数据了。判断 IP 是否可用,择优排序,应该属于另外一个系统做的事情。另外一个系统负责对代理池中的 IP 进行存活检测和速度测试打分。你去 gayhub 搜一下代理 IP 有现成的轮子。
    2. 请 Google 之。

Scrapoxy,这是官方推荐的框架



感谢指点,因为是初学,所以暂时不准备直接购买代理,准备先学习例子做一个练练手。

谢谢,不知有没有关于这个框架的中文资料推荐?另外这个框架和 Scrapy 不可以同时使用吧?

当然可以同时用啊,这个只是一个 js 写的代理,和 scrapy 没有关系的,但是和爬虫一起用就可以达到换 ip 或者是 user-agent 等等的目的了
官方防 ban 建议里提到了
https://docs.scrapy.org/en/latest/topics/practices.html#avoiding-getting-banned
http://scrapoxy.io/

crawlera, 国内也有阿布云之类的每次请求都换一个 ip, 自己爬的免费代理有效性很差, 也可以自己搭几个拨号服务器充当代理, 自己控制拨号手动换 ip

老哥,拨号服务器这个怎么搭,有推荐教材么

谢谢,我找了下,没看到有 scrapoxy 的中文教材呢?

有已经实现的例子可以供参考么

没。。网上找找应该有的吧

感谢,老哥稳!

回到顶部