无法在Scrapy spider中使用多个代理

时间:2018-04-22 20:26:29

标签: python python-3.x web-scraping scrapy scrapy-spider

我使用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 个答案:

答案 0 :(得分: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. 重新安排请求
  3. 替代方案,您可以查看已经解决此问题的scrapy扩展包:https://github.com/TeamHG-Memex/scrapy-rotating-proxies

相关问题