Scrapy自定义proxy代理及https证书

本文介绍如何在Scrapy中使用代理服务器进行抓取,包括通过环境变量和自定义下载中间件两种方式。同时,详细讲解了HTTPS自定义证书的配置方法,以应对不同网站的证书需求。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.代理

方式一:使用默认
os.environ
{
http_proxy:http://root:woshiniba@192.168.11.11:9999/
https_proxy:http://192.168.11.11:9999/
}
方式二:使用自定义下载中间件

    def to_bytes(text, encoding=None, errors='strict'):
        if isinstance(text, bytes):
            return text
        if not isinstance(text, six.string_types):
            raise TypeError('to_bytes must receive a unicode, str or bytes '
                            'object, got %s' % type(text).__name__)
        if encoding is None:
            encoding = 'utf-8'
        return text.encode(encoding, errors)
        
    class ProxyMiddleware(object):
        def process_request(self, request, spider):
            PROXIES = [
                {'ip_port': '111.11.228.75:80', 'user_pass': ''},
                {'ip_port': '120.198.243.22:80', 'user_pass': ''},
                {'ip_port': '111.8.60.9:8123', 'user_pass': ''},
                {'ip_port': '101.71.27.120:80', 'user_pass': ''},
                {'ip_port': '122.96.59.104:80', 'user_pass': ''},
                {'ip_port': '122.224.249.122:8088', 'user_pass': ''},
            ]
            proxy = random.choice(PROXIES)
            if proxy['user_pass'] is not None:
                request.meta['proxy'] = to_bytes("http://%s" % proxy['ip_port'])
                encoded_user_pass = base64.encodestring(to_bytes(proxy['user_pass']))
                request.headers['Proxy-Authorization'] = to_bytes('Basic ' + encoded_user_pass)
                print "**************ProxyMiddleware have pass************" + proxy['ip_port']
            else:
                print "**************ProxyMiddleware no pass************" + proxy['ip_port']
                request.meta['proxy'] = to_bytes("http://%s" % proxy['ip_port'])

# settings中设置    
DOWNLOADER_MIDDLEWARES = {
       'step8_king.middlewares.ProxyMiddleware': 500,
    }
2.https自定义证书

Https访问时有两种情况:

  1. 要爬取网站使用的可信任证书(默认支持)

    DOWNLOADER_HTTPCLIENTFACTORY = “scrapy.core.downloader.webclient.ScrapyHTTPClientFactory”
    DOWNLOADER_CLIENTCONTEXTFACTORY = “scrapy.core.downloader.contextfactory.ScrapyClientContextFactory”

  2. 要爬取网站使用的自定义证书

    DOWNLOADER_HTTPCLIENTFACTORY = “scrapy.core.downloader.webclient.ScrapyHTTPClientFactory”
    DOWNLOADER_CLIENTCONTEXTFACTORY = “step8_king.https.MySSLFactory”

# https.py
from scrapy.core.downloader.contextfactory import ScrapyClientContextFactory
from twisted.internet.ssl import (optionsForClientTLS, CertificateOptions, PrivateCertificate)

class MySSLFactory(ScrapyClientContextFactory):
    def getCertificateOptions(self):
        from OpenSSL import crypto
        v1 = crypto.load_privatekey(crypto.FILETYPE_PEM, open('/Users/wupeiqi/client.key.unsecure', mode='r').read())
        v2 = crypto.load_certificate(crypto.FILETYPE_PEM, open('/Users/wupeiqi/client.pem', mode='r').read())
        return CertificateOptions(
            privateKey=v1,  # pKey对象
            certificate=v2,  # X509对象
            verify=False,
            method=getattr(self, 'method', getattr(self, '_ssl_method', None))
        )
其他:
相关类
    scrapy.core.downloader.handlers.http.HttpDownloadHandler
    scrapy.core.downloader.webclient.ScrapyHTTPClientFactory
    scrapy.core.downloader.contextfactory.ScrapyClientContextFactory
相关配置
    DOWNLOADER_HTTPCLIENTFACTORY
    DOWNLOADER_CLIENTCONTEXTFACTORY
<think>嗯,用户想了解如何在Scrapy中配置和使用代理。首先,我得回忆一下Scrapy的框架结构,特别是处理请求的部分。记得Scrapy通过Downloader Middleware来管理请求和响应,所以代理的设置应该在这里进行。 用户可能知道Scrapy的基本用法,但代理配置可能不太熟悉。我需要解释两种方法:通过Request.meta设置单个请求的代理,或者通过中间件全局配置代理。这两种方式各有适用场景,比如需要不同代理时用前者,统一代理用后者。 然后,考虑到用户可能需要使用随机代理或者动态切换,这时候中间件就更合适了。比如引用中的例子,中间件可以设置process_request方法,为每个请求添加代理。这里要注意代理的格式,是"http://user:pass@ip:port"这样的。 另外,用户可能会遇到代理需要认证的情况,所以代码示例中应该包含如何处理用户名和密码。比如在Request.meta里设置proxy的同时,可能需要添加认证头信息,或者使用中间件自动处理。 还要提到配置文件中的中间件启用步骤,因为用户可能不知道需要在settings.py里添加自定义中间件,并设置优先级。引用中的例子提到了DOWNLOADER_MIDDLEWARES的设置,这点很重要,否则中间件不会生效。 关于代理的来源,用户可能需要从文件或API获取,这部分可以简要提及,比如在中间件的初始化中读取代理列表。但具体实现可能需要用户自己编写,比如随机选择一个代理使用。 另外,需要注意Scrapy的版本兼容性,比如某些旧版本可能需要不同的处理方式,但根据引用中的信息,目前的方法应该适用于较新版本。同时,要提醒用户遵守目标网站的爬取规则,合法使用代理,避免被封禁。 最后,用户可能还想知道如何处理代理失效的情况,比如在中间件中捕获异常并更换代理。这部分可以建议用户参考重试中间件或者自定义错误处理逻辑,但具体的代码可能需要进一步扩展。 总结一下,回答应该分步骤,先介绍基本配置方法,再讲中间件的使用,给出代码示例,并提到相关注意事项和扩展可能性,确保用户能够根据需求选择合适的代理配置方式。</think>### Scrapy代理配置使用方法 在Scrapy框架中配置代理主要涉及以下三种方法,按实现复杂度和适用场景分类: #### 一、单请求代理配置(适用于临时切换) 在Request对象中直接添加`meta`参数: ```python yield scrapy.Request( url=url, callback=self.parse, meta={'proxy': 'http://username:password@ip:port'} ) ``` 该方法适用于需要为特定请求设置独立代理的场景,例如需要根据目标网站动态切换代理[^5]。 #### 二、全局代理中间件(推荐方案) 1. 创建`middlewares.py`文件并添加代理中间件: ```python class ProxyMiddleware(object): def process_request(self, request, spider): proxy = "http://user:pass@proxy_ip:proxy_port" request.meta['proxy'] = proxy ``` 2. 在`settings.py`中启用中间件: ```python DOWNLOADER_MIDDLEWARES = { 'your_project.middlewares.ProxyMiddleware': 543, } ``` 此方法适用于需要统一管理代理配置的场景,特别是需要随机代理池或动态代理时[^4]。 #### 三、第三方扩展方案 对于需要轮换代理的高级场景,可使用: 1. **scrapy-rotating-proxy**扩展: ```python ROTATING_PROXY_LIST = [ 'proxy1.com:8000', 'proxy2.com:8032' ] ``` 2. **scrapy-proxies**扩展支持自动失效检测: ```python PROXY_LIST = '/path/to/proxy/list.txt' PROXY_MODE = 0 # 0-随机,1-顺序 ``` §§注意事项§§ 1. HTTPS代理需使用`https://`协议前缀 2. 建议配合`RETRY_TIMES`设置处理代理失效 3. 遵守目标网站`robots.txt`协议规则[^1]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值