5

更新:このエラーは、コマンド ラインからこれを実行するだけで再現できます。

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

Scrapy を使用して Web サイトをクロールしています。私がスクレイピングしたすべてのページは、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

マップできない文字が含まれていても、これらのページをスクレイピングする必要があります。ページの宣言されたエンコーディングをオーバーライドし、代わりに別の (たとえば、UTF-16) を使用するように Scrapy に指示する方法はありますか?

例外がキャッチされている場所は次のとおりです。

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

最新の開発用スクレイピー (0.15) では、エンコードに関するいくつかの作業が行われています。最新バージョンを試してみる価値はあります。

Scrapy では、response.body_as_unicodeを介して unicode にアクセスできます。これは、ブラウザーと同様の方法でエンコード検出を処理するため、ほとんどの場合、生の本文の代わりにこれを使用する必要があります。Scrapy 0.15 の時点で、少しカスタマイズしてw3lib.encoding.html_to_unicodeに依存しています。

誰かがユニコードを要求すると、デコードは遅延して行われます。スパイダーで受信したエンコーディングから自分でエンコーディングを指定して、新しいレスポンスを作成できますが、これは必須ではありません。

コードのどのビットが実際にエラーを発生させているかは、トレースバックからは明らかではありません。詳しいことはありましたか?別の可能性としては、ボディが切り捨てられている可能性があります。

これらのページがスクレイピーではなくブラウザーによって正しく処理される場合は、簡単なテスト ケースを作成してバグを報告していただければ幸いです。

于 2012-05-31T02:26:03.593 に答える
1

Webページでさまざまな文字エンコーディングを取得する可能性があるため、スクレイピングしたすべてのデータをできるだけ早くユニコードにデコードし、スパイダーでユニコードとして処理し、最後に必要なエンコーディングにエンコードするのが最善です(印刷または印刷する前)。データベースなどに入れます)私は実際にこれについて(スクレイピーでの私自身の経験に基づいて)2日前に役立つかもしれない記事を書きましたhttp://www.harman-clarke.co.uk/answers/python-web-スクレイピング-unicode.php

于 2012-05-24T20:31:59.690 に答える
0

I am assuming that this is happening in the Pipeline and not in the Downloader.

Clean (replace bytes that cannot be decoded) the data before you populated into your Items.

于 2012-05-24T17:19:20.650 に答える