【问题标题】:Scrapy how to use a proxy poolScrapy如何使用代理池
【发布时间】:2016-02-17 18:24:10
【问题描述】:

我正在使用 Scrapy,并尝试通过创建自定义的 DownloaderMiddleware 来使用代理池。我遇到了一些麻烦,想在这里得到一些帮助(我查看了 Scrapy 网站上的文档,但没有代码示例)

我的python代码是:

import random

class ProxyRotator(object):
    proxy_pool = ['ip1...', 'ip2...', 'ip3...']

    def process_request(self, request, spider):
        request.meta['proxy'] = "http://" + self.proxy_pool[random.randint(0, len(self.proxy_pool) - 1)] + ":80"
        return request

在settings.py中,我添加了

 DOWNLOADER_MIDDLEWARES = {
    'scrapy.downloadermiddlewares.httpproxy.HttpProxyMiddleware': 110,
    'pricecheck_crawler.ProxyMiddleware.ProxyRotator': 100,
 }

目前,抓取工具无法从该网站获取任何信息。 日志显示:

2016-02-17 11:27:50 [scrapy] 信息:已爬取 0 页(以 0 页/分钟),抓取 0 项(以 0 项/分钟)

2016-02-17 11:27:50 [scrapy] 调试:Telnet 控制台正在监听 127.0.0.1:6051

2016-02-17 11:28:50 [scrapy] 信息:爬取 0 页(以 0 页/分钟),抓取 0 项(以 0 项/分钟)

2016-02-17 11:29:50 [scrapy] 信息:爬取 0 页(以 0 页/分钟),抓取 0 项(以 0 项/分钟)

【问题讨论】:

  • 你得到的错误是什么?
  • 没有错误,但是爬虫只是没有从网站上得到任何东西。例如,在日志中:2016-02-17 11:27:50 [scrapy] INFO: Crawled 0 pages (at 0 pages/min), scraped 0 items (at 0 items/min) 2016-02-17 11: 27:50 [scrapy] 调试:Telnet 控制台在 127.0.0.1:6051 上监听 2016-02-17 11:28:50 [scrapy] 信息:抓取 0 页(以 0 页/分钟),抓取 0 个项目(以 0 个项目/min) 2016-02-17 11:29:50 [scrapy] 信息:爬取 0 页(以 0 页/分钟),抓取 0 项(以 0 项/分钟)
  • 您使用的代理是 http 还是 socks ? Scrapy 不支持袜子。
  • 另外,请不要更改原来的问题。

标签: python web-scraping scrapy web-crawler


【解决方案1】:

试试这个。删除 return request 语句,因为它将请求返回到 process_request 并且永远不会调用 process_response。在此之前,请确保您仅使用 http 或 https 代理:

def process_request(self, request, spider):
    request.meta['proxy'] = self.proxy_pool[random.randint(0, len(self.proxy_pool) - 1)]

您也可以将设置更改为以下内容:

'pricecheck_crawler.ProxyMiddleware.ProxyRotator': 100,
'scrapy.downloadermiddlewares.httpproxy.HttpProxyMiddleware': 110

同时验证request.meta['proxy'] = "http://ip:port"

【讨论】:

  • 我仍然得到相同的结果。代理是 http。
  • 您是否更改了设置?还要检查self.proxy_pool[random.randint(0, len(self.proxy_pool) - 1)] 的输出是否类似于http://ip:port
  • 所以proxy_pool只是我传入的ip地址列表,我确保最终输出看起来像http://ip:port。
  • 我改变了设置,同样的事情。我需要设置 http_proxy 之类的吗?
  • 代理应该有一个与之关联的端口。按照我在答案中提到的进行更改。
【解决方案2】:

另一个方向可能是使用外部程序,例如proxifier,以便通过代理传输您的带宽。

【讨论】:

    【解决方案3】:

    你可以使用 Scrapy_proxy_pool

    只需在 settings.py 中添加您当前的代码

    PROXY_POOL_ENABLED = True
    

    【讨论】:

      猜你喜欢
      • 2015-08-01
      • 1970-01-01
      • 2020-03-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-14
      • 2022-12-04
      • 1970-01-01
      相关资源
      最近更新 更多