如何在 scrapy 中使用 CrawlSpider 处理 http 错误代码
How to handle http error codes using CrawlSpider in scrapy
我正在尝试使用 scrapy 来测试一些网站及其子网站的 http return 代码,以检测 400 和 500 范围内的错误。但是另外我还想查看和处理 300 范围内的代码。我已经尝试了好几天并检查了文档,但是我被卡住了,没有找到解决方案。感谢您的帮助!
接下来您将看到我使用 CrawlSpider 创建的蜘蛛。目标是在我的 parse_item() 函数的错误范围内 see/catch http 响应。我已将 handle_httpstatus_all = True 添加到 settings.py,但除了 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
关于没有传递错误代码的原因,很可能我遗漏了一些基本知识。
应在每个请求的 meta
中设置标志 handle_httpstatus_all
,请查看文档 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})
这样的请求
我不知道如何将元参数应用于规则。
如果您需要使用规则执行此操作,则可以通过提供 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
参考documentation and an example.
我正在尝试使用 scrapy 来测试一些网站及其子网站的 http return 代码,以检测 400 和 500 范围内的错误。但是另外我还想查看和处理 300 范围内的代码。我已经尝试了好几天并检查了文档,但是我被卡住了,没有找到解决方案。感谢您的帮助!
接下来您将看到我使用 CrawlSpider 创建的蜘蛛。目标是在我的 parse_item() 函数的错误范围内 see/catch http 响应。我已将 handle_httpstatus_all = True 添加到 settings.py,但除了 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
关于没有传递错误代码的原因,很可能我遗漏了一些基本知识。
应在每个请求的 meta
中设置标志 handle_httpstatus_all
,请查看文档 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})
这样的请求
我不知道如何将元参数应用于规则。
如果您需要使用规则执行此操作,则可以通过提供 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
参考documentation and an example.