5

更新:只需从命令行运行此错误即可重现此错误:

scrapy shell http://www.indiegogo.com/Straight-Talk-About-Your-Future

我正在使用 Scrapy 抓取网站。我抓取的每一页都声称是 UTF-8 编码的:

<meta content="text/html; charset=utf-8" http-equiv="Content-Type">

但偶尔,页面包含不属于 UTF-8 的字节,我会收到 Scrapy 错误,例如:

exceptions.UnicodeDecodeError: 'utf8' codec can't decode byte 0xe8 in position 131: invalid continuation byte

我仍然需要抓取这些页面,即使它们包含不可映射的字符。有没有办法告诉 Scrapy 覆盖页面声明的编码,并改用另一种(比如 UTF-16)?

这是捕获异常的地方:

2012-05-30 14:43:20+0200 [igg] ERROR: Spider error processing <GET http://www.site.com/page>
    Traceback (most recent call last):
      File "/Library/Python/2.7/site-packages/twisted/internet/base.py", line 1178, in mainLoop
        self.runUntilCurrent()
      File "/Library/Python/2.7/site-packages/twisted/internet/base.py", line 800, in runUntilCurrent
        call.func(*call.args, **call.kw)
      File "/Library/Python/2.7/site-packages/twisted/internet/defer.py", line 368, in callback
        self._startRunCallbacks(result)
      File "/Library/Python/2.7/site-packages/twisted/internet/defer.py", line 464, in _startRunCallbacks
        self._runCallbacks()
    --- <exception caught here> ---
      File "/Library/Python/2.7/site-packages/twisted/internet/defer.py", line 551, in _runCallbacks
        current.result = callback(current.result, *args, **kw)
      File "/Library/Python/2.7/site-packages/scrapy/core/spidermw.py", line 61, in process_spider_output
        result = method(response=response, result=result, spider=spider)
4

3 回答 3

4

在最新的 dev scrapy (0.15) 中进行了一些编码工作。可能值得尝试最新版本。

Scrapy 允许您通过response.body_as_unicode访问 unicode 。这以与浏览器类似的方式处理编码检测,您几乎应该始终使用它而不是原始正文。从 scrapy 0.15 开始,它依赖于w3lib.encoding.html_to_unicode,并进行了一些定制。

当有人请求 unicode 时,解码会延迟发生。您可以创建一个新响应,从您在蜘蛛中收到的编码自己指定编码,但是,这不是必需的。

从回溯中不清楚是哪位代码实际上导致了错误发生。有更详细的吗?另一种可能性可能是身体以某种方式被截断。

如果这些页面由浏览器而不是由scrapy正确处理,那么如果您可以制作一个简单的测试用例并报告错误,将不胜感激。

于 2012-05-31T02:26:03.593 回答
1

由于您可能会在网页上获得各种字符编码,因此通常最好尽快将所有抓取的数据解码为 un​​icode,在蜘蛛中将其作为 unicode 处理,然后在最后一分钟将其编码为您需要的任何编码(在打印之前或放入数据库等)两天前我实际上写了一篇关于这个的文章(基于我自己的scrapy经验),这可能会有所帮助http://www.harman-clarke.co.uk/answers/python-web-抓取-unicode.php

于 2012-05-24T20:31:59.690 回答
0

我假设这发生在管道中而不是下载器中。

在填充到项目之前清理(替换无法解码的字节)数据。

于 2012-05-24T17:19:20.650 回答