Scrapy爬虫如何配置代理以访问仅支持代理访问的站点?
Scrapy 代理配置完整解决方案
下面提供三种常用的代理配置方案,可根据你的使用场景选择:
方案1:全局固定代理(最简单,适合单代理场景)
直接在settings.py中添加全局代理配置即可,无需修改其他代码:
# settings.py 中添加以下内容 HTTP_PROXY = 'http://username:password@myproxy:port' HTTPS_PROXY = 'http://username:password@myproxy:port' # 你之前配置的HttpProxyMiddleware保持启用即可 DOWNLOADER_MIDDLEWARES = { 'scrapy.downloadermiddlewares.httpproxy.HttpProxyMiddleware': 100 }
配置完成后所有爬虫请求都会自动走该代理。
方案2:自定义代理中间件(适合动态切换代理、多代理池场景)
你之前写的process_start_requests方法仅会处理初始启动请求,后续爬取生成的新请求不会生效,需要修改为下载中间件的process_request方法:
- 打开
middlewares.py,添加完整的自定义代理中间件类:
# middlewares.py class CustomProxyMiddleware: def process_request(self, request, spider): # 给每个请求都添加代理信息 request.meta['proxy'] = 'http://username:password@myproxy:port'
- 回到
settings.py,注册你写的自定义中间件,优先级要高于自带的HttpProxyMiddleware:
# settings.py DOWNLOADER_MIDDLEWARES = { # 替换为你自己的项目名,这里项目名是scrapy_crawler 'scrapy_crawler.middlewares.CustomProxyMiddleware': 90, 'scrapy.downloadermiddlewares.httpproxy.HttpProxyMiddleware': 100 }
方案3:单爬虫单独配置代理
如果仅需要给当前digtionary爬虫使用代理,不需要全局生效,可以直接重写爬虫的相关方法:
# digtionary.py import scrapy from scrapy.spiders import CrawlSpider, Rule from scrapy.linkextractors import LinkExtractor class ImdbCrawler(CrawlSpider): name = 'digtionary' allowed_domains = ['www.mywebsite.com'] start_urls = ['https://mywebsite.com/digital/pages/start.aspx#'] rules = ( Rule(LinkExtractor(), process_request='add_proxy'), ) # 给初始请求加代理 def start_requests(self): for url in self.start_urls: yield scrapy.Request(url, meta={'proxy': 'http://username:password@myproxy:port'}) # 给Rule生成的所有新请求加代理 def add_proxy(self, request, spider): request.meta['proxy'] = 'http://username:password@myproxy:port' return request
注意事项
- 请将配置中的
username、password、myproxy、port替换为你实际的代理认证信息与地址端口 - 如果你使用的是SOCKS代理,需要先安装依赖:
pip install pysocks,代理地址格式改为socks5://username:password@myproxy:port - 调试时可以在运行爬虫时加参数
scrapy crawl digtionary -s LOG_LEVEL=DEBUG,查看请求日志确认代理是否生效
内容的提问来源于stack exchange,提问作者NShini
相关产品推荐
相关产品推荐

