【问题标题】:Scrapy 404 error: HTTP status code is not handled or not allowedScrapy 404 错误:HTTP 状态码未处理或不允许
【发布时间】:2017-12-30 03:39:58
【问题描述】:

我正在尝试使用 scrapy 抓取网站 coursetalk,我首先尝试使用蜘蛛模板并收到 404 错误:

2017-12-29 23:34:30 [scrapy] DEBUG: Ignoring response <404 https://www.coursetalk.com/subjects/data-science/courses/>: HTTP status code is not handled or not allowed

这是我正在使用的代码:

import scrapy

class ListaDeCursosSpider(scrapy.Spider):
    name = "lista_de_cursos"
    start_urls = ['https://www.coursetalk.com/subjects/data-science/courses/'] 


    def parse(self, response):
        print response.body

还有来自scrapy的竞争日志:

2017-12-29 23:34:26 [scrapy] INFO: Scrapy 1.0.3 started (bot: coursetalk)
2017-12-29 23:34:26 [scrapy] INFO: Optional features available: ssl, http11, boto
2017-12-29 23:34:26 [scrapy] INFO: Overridden settings: {'NEWSPIDER_MODULE': 'coursetalk.spiders', 'SPIDER_MODULES': ['coursetalk.spiders'], 'BOT_NAME': 'coursetalk'}
2017-12-29 23:34:27 [scrapy] INFO: Enabled extensions: CloseSpider, TelnetConsole, LogStats, CoreStats, SpiderState
2017-12-29 23:34:27 [boto] DEBUG: Retrieving credentials from metadata server.
2017-12-29 23:34:28 [boto] ERROR: Caught exception reading instance data
Traceback (most recent call last):
  File "/usr/local/lib/python2.7/dist-packages/boto/utils.py", line 210, in retry_url
    r = opener.open(req, timeout=timeout)
  File "/usr/lib/python2.7/urllib2.py", line 404, in open
    response = self._open(req, data)
  File "/usr/lib/python2.7/urllib2.py", line 422, in _open
    '_open', req)
  File "/usr/lib/python2.7/urllib2.py", line 382, in _call_chain
    result = func(*args)
  File "/usr/lib/python2.7/urllib2.py", line 1214, in http_open
    return self.do_open(httplib.HTTPConnection, req)
  File "/usr/lib/python2.7/urllib2.py", line 1184, in do_open
    raise URLError(err)
URLError: <urlopen error timed out>
2017-12-29 23:34:28 [boto] ERROR: Unable to read instance data, giving up
2017-12-29 23:34:28 [scrapy] INFO: Enabled downloader middlewares: HttpAuthMiddleware, DownloadTimeoutMiddleware, UserAgentMiddleware, RetryMiddleware, DefaultHeadersMiddleware, MetaRefreshMiddleware, HttpCompressionMiddleware, RedirectMiddleware, CookiesMiddleware, ChunkedTransferMiddleware, DownloaderStats
2017-12-29 23:34:28 [scrapy] INFO: Enabled spider middlewares: HttpErrorMiddleware, OffsiteMiddleware, RefererMiddleware, UrlLengthMiddleware, DepthMiddleware
2017-12-29 23:34:28 [scrapy] INFO: Enabled item pipelines: 
2017-12-29 23:34:28 [scrapy] INFO: Spider opened
2017-12-29 23:34:28 [scrapy] INFO: Crawled 0 pages (at 0 pages/min), scraped 0 items (at 0 items/min)
2017-12-29 23:34:28 [scrapy] DEBUG: Telnet console listening on 127.0.0.1:6023
2017-12-29 23:34:30 [scrapy] DEBUG: Crawled (404) <GET https://www.coursetalk.com/subjects/data-science/courses/> (referer: None)
2017-12-29 23:34:30 [scrapy] DEBUG: Ignoring response <404 https://www.coursetalk.com/subjects/data-science/courses/>: HTTP status code is not handled or not allowed
2017-12-29 23:34:30 [scrapy] INFO: Closing spider (finished)

【问题讨论】:

  • 当您收到此错误时,您是否在浏览器中检查了此 url?也许服务器在某个时候出现了问题。
  • 我使用上一个问题中的代码测试了这个 url,它仍然有效。也许服务器只有短暂的问题。或者您的计算机和此门户之间的任何路由器可能存在问题。

标签: python scrapy


【解决方案1】:

看起来这个网站太奇怪了,响应状态码是 404 但仍然可以正常获取正文。

并且在 Scrapy 中HttpErrorMiddleware 是默认启用的,它会过滤掉不成功的 Http 响应,以便蜘蛛不必处理它们。在这种情况下,scrapy 提供了HTTPERROR_ALLOWED_CODES 设置以允许处理响应甚至如果返回错误代码。

在项目setting.py 中添加HTTPERROR_ALLOWED_CODES =[404] 将绕过此问题

import scrapy
import logging

class ListaDeCursosSpider(scrapy.Spider):
    name = "lista_de_cursos"
    allowed_domains = ['www.coursetalk.com']
    start_urls = ['https://www.coursetalk.com/subjects/data-science/courses/'] 

 def parse(self, response):
        logging.info("response.status:%s"%response.status)
        logourl = response.selector.css('div.main-nav__logo img').xpath('@src').extract()
        logging.info('response.logourl:%s'%logourl)

【讨论】:

  • handle_httpstatus_list = [404] 在实际的网络爬虫脚本中似乎对我来说工作得很好
【解决方案2】:

我用scrapy遇到过这个问题并解决了。

USER_AGENT 更改为setting.py

USER_AGENT = "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/34.0.1847.131 Safari/537.36"

【讨论】:

  • 这对我有帮助。该网站拒绝提供任何服务并以 404 响应。
  • 虽然很多scrapy用户对USER_AGENT有问题,但OP的实际答案是@Andy的答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-13
  • 1970-01-01
  • 1970-01-01
  • 2021-08-06
相关资源
最近更新 更多