Python 使用scrapy捕获HTTP错误
我正试图从一个网站上搜寻断开的链接,到目前为止,我有一段代码,成功登录并爬网该网站,但它只记录了HTTP状态200代码:Python 使用scrapy捕获HTTP错误,python,web-scraping,scrapy,scrapy-spider,Python,Web Scraping,Scrapy,Scrapy Spider,我正试图从一个网站上搜寻断开的链接,到目前为止,我有一段代码,成功登录并爬网该网站,但它只记录了HTTP状态200代码: class HttpStatusSpider(scrapy.Spider): name = 'httpstatus' handle_httpstatus_all = True link_extractor = LinkExtractor() def start_requests(self): """This method e
class HttpStatusSpider(scrapy.Spider):
name = 'httpstatus'
handle_httpstatus_all = True
link_extractor = LinkExtractor()
def start_requests(self):
"""This method ensures we login before we begin spidering"""
# Little bit of magic to handle the CSRF protection on the login form
resp = requests.get('http://localhost:8000/login/')
tree = html.fromstring(resp.content)
csrf_token = tree.cssselect('input[name=csrfmiddlewaretoken]')[0].value
return [FormRequest('http://localhost:8000/login/', callback=self.parse,
formdata={'username': 'mischa_cs',
'password': 'letmein',
'csrfmiddlewaretoken': csrf_token},
cookies={'csrftoken': resp.cookies['csrftoken']})]
def parse(self, response):
item = HttpResponseItem()
item['url'] = response.url
item['status'] = response.status
item['referer'] = response.request.headers.get('Referer', '')
yield item
for link in self.link_extractor.extract_links(response):
r = Request(link.url, self.parse)
r.meta.update(link_text=link.text)
yield r
和让我相信handle\u httpstatus\u all=True
应该会导致scrapy将错误的请求传递给我的parse
方法,但到目前为止,我还无法捕获任何请求
我还在不同的代码迭代中试验了handle\u httpstatus\u list
和自定义errback
处理程序
捕获scrapy遇到的HTTP错误代码需要做哪些更改?
handle\u httpstatus\u list
可以在spider级别上定义,但是handle\u httpstatus\u all
只能在请求
级别上定义,包括在meta
参数上
我仍然建议在这些情况下使用
errback
,但如果一切都得到控制,就不会产生新的问题。handle\u httpstatus\u列表可以在spider级别定义,但是handle\u httpstatus\u all
只能在请求级别定义,将其包含在meta
参数中
我仍然建议在这些情况下使用errback
,但如果一切都得到控制,就不会产生新的问题。因此,我不知道这是否是正确的方法,但它确实允许我处理所有HTTP状态码(包括5xx)
通过将此片段添加到我的scrapy项目的设置.py
,我禁用了HttpErrorMiddleware
:
SPIDER_MIDDLEWARES = {
'scrapy.spidermiddlewares.httperror.HttpErrorMiddleware': None
}
因此,我不知道这是否是正确的scrapy方式,但它确实允许我处理所有HTTP状态代码(包括5xx)
通过将此片段添加到我的scrapy项目的设置.py
,我禁用了HttpErrorMiddleware
:
SPIDER_MIDDLEWARES = {
'scrapy.spidermiddlewares.httperror.HttpErrorMiddleware': None
}
请删除allowed_domains
参数,它不是必需的,它还可以过滤您的请求,也许这就是问题所在。我删除了allowed_domains=['localhost']
但行为没有改变,我将allowed_domains=['localhost']
放回,蜘蛛在tripadvisor上找到路径后:2018-12-17 19:29:09[scrapy.core.scraper]调试:从
ok中刮取,那么现在我们面临另一个问题了?请检查我的回答请删除allowed_domains
参数,它不是必需的,而且它还可以过滤您的请求,也许这就是问题所在我删除了allowed_domains=['localhost']
但行为没有改变我将allowed_domains=['localhost']
放回,蜘蛛在tripadvisor上找到路径后:2018-12-17 19:29:09[scrapy.core.scraper]调试:从
ok中刮取,那么现在我们面临另一个问题了?请检查我的答案啊,很有趣。这是一个容易被忽略的差异,我现在可以看到4xx代码被捕获。但不确定5xx是否被捕获。下一步是尝试errback
很高兴我帮助您获得了所需的http请求。啊,非常有趣。这是一个容易被忽略的差异,我现在可以看到4xx代码被捕获。但不确定5xx是否被捕获。下一步是尝试一个errback
很高兴我帮助您获得了所需的http请求。当然,我会说这是一个很好的解决方案,但当然只是针对您的项目,我不认为在一个有很多爬行器的项目中,我们只需要对一些爬行器甚至请求禁用它就可以了。当然,我会说这是一个很好的解决方案,但当然,这只适用于您的项目,我不认为在一个有很多爬行器的项目中建议这样做,因为我们只需要对一些爬行器甚至请求禁用它。