【问题标题】:How to handle http error codes using CrawlSpider in scrapy如何在scrapy中使用CrawlSpider处理http错误代码
【发布时间】:2019-02-14 09:21:13
【问题描述】:

我正在尝试使用 scrapy 测试一些网站及其子网站的 http 返回码,分别检测 400 和 500 范围内的错误。但是另外,我还想查看和处理 300 范围内的代码。我已经尝试了几天并检查了文档,但是我被卡住了,找不到解决方案。感谢您的帮助!

接下来您将看到我正在使用 CrawlSpider 创建的蜘蛛。目标是在我的 parse_item() 函数的错误范围内查看/捕获 http 响应。我在 settings.py 中添加了 handle_httpstatus_all = True,但除了 HTTP_STATUS = 200 之外,parse_item 没有其他内容。

import scrapy
from scrapy.linkextractors import LinkExtractor
from scrapy.spiders import CrawlSpider, Rule
from scrapy import log


class IcrawlerSpider(CrawlSpider):

name = 'icrawler'
def __init__(self, *args, **kwargs):
    # We are going to pass these args from our django view.
    # To make everything dynamic, we need to override them inside__init__method
    handle_httpstatus_all = True
    self.url = kwargs.get('url')
    self.domain = kwargs.get('domain')
    self.start_urls = [self.url]
    self.allowed_domains = [self.domain]

    IcrawlerSpider.rules = [
       Rule(LinkExtractor(unique=True), callback='parse_item'),
    ]
    super(IcrawlerSpider, self).__init__(*args, **kwargs)

def parse_item(self, response):
    # You can tweak each crawled page here
    # Don't forget to return an object.
    if response.status==403:
        self.logger.errror("ERROR_CODE_RETURNED: " + response.status)
    i = {}
    i['url'] = response.url
    i['status_code'] = response.status
    return i

当谈到没有通过错误代码的原因时,我很可能错过了一些基本的东西。

【问题讨论】:

    标签: python scrapy http-error


    【解决方案1】:

    标记handle_httpstatus_all 应在您的每个请求的meta 中设置,请查看文档here

    关于设置,你可以玩HTTPERROR_ALLOW_ALL或者HTTPERROR_ALLOWED_CODES的设置列表。

    像这样:

    class IcrawlerSpider(CrawlSpider):
        name = 'icrawler'
        custom_settings = {'HTTPERROR_ALLOW_ALL': True}
    

    或者重构你的蜘蛛来调用像yield Request(link, self.parse_item, meta={'handle_httpstatus_all': True})这样的请求 我不知道如何将元参数应用于规则。

    【讨论】:

    • 谢谢vezunchik,你有什么例子可以在我在这里使用的代码中与请求交互吗?
    • 我已将您的示例代码添加到我的爬虫中,但是错误代码仍然没有从 CrawlSpider 进入我的爬虫。正如您在第二个建议中提到的那样,我很可能必须处理 CrawlSpider 本身的代码。
    • 此外,我还没有发现将元参数添加到规则中,据我所知,至少在文档中没有
    • 是的,我也试图找到一些关于规则的东西,但什么都没有。尝试重构以使用常见的请求,它应该会有所帮助。
    • 您可以通过提供process_request 可调用来修改规则的请求。在那里您可以修改 Request 对象。检查docs referenceexample of modifying a Rule's Request meta
    【解决方案2】:

    如果您需要使用规则执行此操作,则可以通过提供process_request 回调来修改生成的请求。总结如下:

    class IcrawlerSpider(CrawlSpider):
        def __init__(self, *args, **kwargs):
            # ...
            IcrawlerSpider.rules = [
               Rule(LinkExtractor(unique=True), callback='parse_item', process_request='add_meta'),
            ]
    
        def add_meta(self, request):
            request.meta['handle_httpstatus_all'] = True
            return request
    

    请参阅documentationexample

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-23
      • 2015-10-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多