无法在Scrapy爬虫中使用多个代理

8
我用Scrapy写了一个Python脚本,通过代理向网页发送请求,而不需要更改settings.pyDOWNLOADER_MIDDLEWARES。现在它运行得很好。然而,我唯一不能利用的是创建一个代理列表,以便如果一个失败了,另一个就会被使用。如何调整这部分os.environ["http_proxy"] = "http://176.58.125.65:80"来逐个获取代理列表,因为它只支持一个。对此的任何帮助将不胜感激。
这是我到目前为止尝试过的(有效的):
import scrapy, os
from scrapy.crawler import CrawlerProcess

class ProxyCheckerSpider(scrapy.Spider):
    name = 'lagado'
    start_urls = ['http://www.lagado.com/proxy-test']
    os.environ["http_proxy"] = "http://176.58.125.65:80" #can't modify this portion to get list of proxies

    def parse(self, response):
        stat = response.css(".main-panel p::text").extract()[1:3]
        yield {"Proxy-Status":stat}

c = CrawlerProcess({
    'USER_AGENT': 'Mozilla/5.0',

})
c.crawl(ProxyCheckerSpider)
c.start()

我不想改变settings.py中的任何内容,也不想创建任何自定义middleware来实现这个目的。我希望通过一个单独的代理(外部)实现与上述相同的效果。谢谢。

1个回答

1

您还可以针对每个请求设置元键代理,将其设置为类似于http://some_proxy_server:porthttp://username:password@some_proxy_server:port的值。

来自官方文档:https://doc.scrapy.org/en/latest/topics/downloader-middleware.html#scrapy.downloadermiddlewares.httpproxy.HttpProxyMiddleware

因此,您需要编写自己的中间件来执行以下操作:

  1. 捕获失败的响应
  2. 如果响应失败是由于代理:
    1. 用新的代理IP替换request.meta['proxy']的值
    2. 重新安排请求

另外,您还可以查看已经开发用于解决此问题的Scrapy扩展程序包:https://github.com/TeamHG-Memex/scrapy-rotating-proxies


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接