2017-11-20 11 views
1

プロキシがまだブラックリストにないことを確認するために、レスポンスからデータを抽出する必要があります(HTTPステータスが不十分です)。予想されるように行うにはXPathまたはCSSセレクタを使用したデータを解析するDownloaderミドルウェア(スクラップを使用)

は、私がDownloaderのミドルウェアに

class TestXPathMiddleware(object): 
    def process_response(self, request, response, spider): 
     print(request.url) 
     print(type(response)) 
     if (isinstance(response, HtmlResponse)): 
      print('HtmlResponse, XPath should be available') 
      print(response.encoding) 
      print(response.xpath('//div')) 
     return response 

を書いたが、私のクローラーが応答していません。私は応答オブジェクトがとしてread in the docとなると期待しています。そして、私はXPathを使うためにResponseオブジェクトからHtmlResponseを作成できることを期待しています。

実際には何が起こっていますか?

ミドルウェアでキャッチされた応答の中には、Responseがありますが、その他のものは直接です。 (スパイダーの最初の解析メソッドからの応答は、Responseで、他の(より深い解析メソッドからのもの)はHtmlResponseです。なぜですか?私は言うことができませんが、私は大好きです:)

第二に、私はありませんXPathでデータを抽出することができます。私はresponse.bodyからバイトをデコードできないようです。 response.encodingasciiを出力しています。私はchardetを使用して、使用するエンコーディングを決定しようとしましたが、ミドルウェアでNoneを出力し、スパイダーの解析メソッドではISO-8859-1を出力します。どうして?もう一度、私は言うことができませんが、私は大好きです!

私を助けることができますか?ありがとう

答えて

1

これが完成しました! HTTP経由で転送されるデータは、gzipなどで圧縮されることがよくあります。私の現在のダウンローダミドルウェアは、実際に応答を解凍するscrapy.downloadermiddlewares.httpcompression.HttpCompressionMiddlewareの前にトリガされました。

したがって、私のカスタムprocess_responseメソッドが応答が解凍された後に呼び出されるようにするには、HttpCompressionMiddlewareの前に私のTestXPathMiddlewareを置く必要があります。これが完了したら、私は適切に回答を解読することができます。

HttpCompressionMiddlewareCOMPRESSION_ENABLE=Falseで無効にすることができます。これにより、HTTP要求が送信され、非圧縮応答が要求されます。

希望すると便利です;

関連する問題