首页 > 解决方案 > 使用代理爬网

问题描述

我编写了一个 Scrapy 中间件,必须通过scrapy.Request(url)对每个请求使用代理。

我的自定义中间件:

MyCustomProxyMiddleware 类(对象):

def __init__(self, settings):
    self.chosen_proxy = settings.get('ROTATOR_PROXY', None)

@classmethod
def from_crawler(cls, crawler):
    return cls(crawler.settings)

def process_request(self, request, spider):
    if self.chosen_proxy is not None:
        request.meta["proxy"] = self.chosen_proxy
        log.debug('Using proxy <%s>' % self.chosen_proxy)

在我的 settings.py

ROTATOR_PROXY = 'http://ip:port' # 这是我的 rotator 网关代理

我的蜘蛛:

def start_requests(self):
    urls = []    # thousand URLs 
    for url in urls:
        # Don't redirect URL and scrape data
        if checkers.is_url(url):
            yield scrapy.Request(url)

但是,我检查了 rotator 代理网关的统计信息,我看到一些首先使用代理的 scrapy.Request( url),但许多scrapy.Request(url)不使用我的 rotator 代理网关。我需要所有请求都必须使用我的 rotator 网关。

我无法猜测问题,请让我知道我的问题并尽可能提出我的错误。

提前致谢,

标签: proxyscrapyhttp-proxy

解决方案


有多种方法可以将代理与 scrapy 爬虫一起使用。第一种方法是使用传统方式,运行命令“pip install scrapy-rotating proxies”并按照官方文档进行操作。开发人员使用的第二个也是最常用的 API 集成了具有处理代理的预构建函数以及对多种语言(包括 python)的支持,以便这些 API 自动处理代理轮换并提供完全匿名性。除此之外,您可以尝试以下代码以将代理与scrapy一起使用。但在开始编写代码之前,请注意,在第一个源代码中,我们通过请求参数设置代理,在第二个源代码中,创建了自定义代理中间件。

方法一:

def start_requests(self):
    for url in self.start_urls:
        return Request(url=url, callback=self.parse,
        headers={"User-Agent": "scrape web"},
        meta={"proxy": "http:/154.112.82.262:8

方法二:

from w3lib.http import basic_auth_header
class CustomProxyMiddleware(object):
def process_request(self, request, spider):
        request.meta[“proxy”] = "http://192.168.1.1:8050"
        request.headers[“Proxy-Authorization”] = 
basic_auth_header(“&lt;proxy_user>”, “&lt;proxy_pass>”)
DOWNLOADER_MIDDLEWARES = {
    'myproject.middlewares.CustomProxyMiddleware': 350,
    'scrapy.downloadermiddlewares.httpproxy.HttpProxyMiddleware': 400,
}

注意:通过将其作为请求参数传递来设置代理,第二种方法是创建自定义代理中间件。


推荐阅读