python - Scrapy如何使用代理池

标签 python web-scraping scrapy web-crawler

我正在使用 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] INFO:已抓取 0 页(以 0 页/分钟),抓取 0 项(以 0 项/分钟)

2016-02-17 11:27:50 [scrapy] DEBUG:Telnet 控制台监听 127.0.0.1:6051

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

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

最佳答案

试试这个。删除 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"

关于python - Scrapy如何使用代理池,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35464705/

相关文章:

python - 如何使用 Python 3 和 Beautiful Soup 获取 Wikipedia 文章的文本?

javascript - 当 Meteor.method 内事件触发时返回值

python - 尝试在Python中读取csv文件并创建单独的表

python - 如何在 bs4 中使用以下分页抓取网站?

python - 使用 Scrapy 从网站查找和下载 pdf 文件

mysql - Scrapy MySQL 管道——所有数据库条目都相同

python - 无法使用 python scrapy 从 td 标签/元素中提取文本

python - 玛雅Python : Lock transforms of a keyframe

python - 使用 Celery 和 Amazon SES 在 Django 中安排电子邮件

python - 如何在列表中搜索一对坐标?