2017-04-22 8 views
0

ScrapyのRequestオブジェクトからプレーンなHTTPリクエストメッセージを抽出する必要があります(たとえば、このリクエストをコピー/ペーストしてBurpから実行できるようにする必要があります)。ScreamのRequestオブジェクトからHTTPリクエストメッセージを取得

したがって、scrapy.http.Requestオブジェクトが与えられた場合、私は対応するリクエストメッセージを取得したいと思います。

POST /test/demo_form.php HTTP/1.1 
Host: w3schools.com 

name1=value1&name2=value2 

は、明らかに私は、いくつかのエッジケースを欠場する可能性があるので、手動でエラーが発生しやすいしかし、メッセージを再構築しようと、私はRequestオブジェクトに必要なすべての情報を持っています。私の理解では、ScrapyはまずRequestTwistedオブジェクトに変換します。このオブジェクトは、ヘッダと本文をTCP転送に書き込みます。だから、似たようなことをやろうとしているのですが、代わりに文字列に書きますか?

UPDATE

私はhttp.pyに基づいてHTTP 1.0要求メッセージを、取得するために次のコードを使用することができます。 HTTP 1.1リクエスト/ http11.pyと似たような処理をする方法がありますか。これは実際に送信されるものですか?私は明らかに可能な限りScrapy/Twistedフレームワークからコードを複製することを避けたいと思います。

factory = webclient.ScrapyHTTPClientFactory(request) 
transport = StringTransport() 
protocol = webclient.ScrapyHTTPPageGetter() 
protocol.factory = factory protocol.makeConnection(transport) 
request_message = transport.value() 
print(request_message.decode("utf-8")) 

答えて

1

scrapyはオープンソースであり、拡張ポイントもたくさんあるため、これは実行可能にする必要があります。

要求が最終的に組み立てられ、ScrapyAgent.download_requestにscrapy /コア/ダウンローダ/ハンドラ/ http11.pyに送信されます(https://github.com/scrapy/scrapy/blob/master/scrapy/core/downloader/handlers/http11.py#L270

あなたはそこにあなたのフックを配置する場合は、要求タイプをダンプすることができ、ヘッダを要求し、リクエストボディ。あなたがScrapyAgent.download_requestにパッチを適用猿を試すことができますいずれか、または要求ロギングを行うためにScrapyAgentをサブクラス化し、その後、あなたのScrapyエージェントを使用するようにHTTP11DownloadHandlerをサブクラス化して、プロジェクトの設定でHTTP/HTTPS要求のための新しいDOWNLOAD_HANDLERとしてHTTP11DownloadHandlerを設定するが、あなたのコードを配置する

.py(詳細はhttps://doc.scrapy.org/en/latest/topics/settings.html#download-handlersを参照してください)

私の意見では、これはパケットスニッファやロギングプロキシを使用せずに外出リクエストをログに記録するのに最も近いと思われます。

+0

さて、そうですが、問題は 'download_request'で行われたことは結果のリクエストからかなり離れていることです。 'Twisted'がヘッダーをラインのさらに下方に変更/補強するケースがたくさんあります。欠落している場合は 'host'を追加することができます。すべてのコードをコピー・ペーストするのではなく、' Twisted'を結果として文字列に書くことができるのではないかと思います。 –

+0

'Twisted'でもう少し詳しく読んでみると、私は本当の' Agent'を使うことを望んでいますが、 'twisted.test.proto_helpers.StringTransport'のようなダミーのトランスポートでメモリにリクエストをバッファするだけです。私は、 'StringTransport'で私の' Agent'を使用することを除いて 'download_request'からコードをコピーして貼り付けます。正しい軌道にいるのですか?同じことをする例は見当たりません。 –

+0

実際、これは思ったよりもはるかに簡単だと思われます。 'factory = webclient.ScrapyHTTPClientFactory(response.request) transport = StringTransport() protocol = webclient.ScrapyHTTPPageGetter() protocol.factory = factory プロトコルです。 –

関連する問題