10

CrawlSpider クラスを使用して Web サイトをクロールしていますが、各リクエストで送信されるヘッダーを変更したいと考えています。具体的には、リファラーをリクエストに追加したいと思います。

この質問に従って、私はチェックしました

response.request.headers.get('Referer', None)

私の応答解析関数では、Refererヘッダーが存在しません。これは、リファラーがリクエストで送信されていないことを意味すると思います(ウェブサイトがそれを返さない限り、それについてはわかりません)。

リクエストのヘッダーを変更する方法を理解できませんでした。繰り返しますが、私のスパイダーは CrawlSpider から派生しています。CrawlSpider のオーバーライド_requests_to_followまたはルールのコールバックの指定process_requestは機能しません。これは、その時点でリファラーがスコープ内にないためです。

リクエストヘッダーを動的に変更する方法を知っている人はいますか?

4

2 に答える 2

21

引数を使用して各リクエストREFERERに手動で渡すことができます。headers

yield Request(parse=..., headers={'referer':...})

RefererMiddlewareは同じことを行い、以前の応答からリファラー URL を自動的に取得します。

于 2013-01-09T10:18:31.110 に答える
15

私は自分の質問に答えるのが嫌いですが、その方法を見つけました。応答のリファラーを設定する SpiderMiddleware を有効にする必要があります。のドキュメントを参照してください。scrapy.contrib.spidermiddleware.referer.RefererMiddleware

つまり、このミドルウェアをプロジェクトの設定ファイルに追加する必要があります。

SPIDER_MIDDLEWARES = {
'scrapy.contrib.spidermiddleware.referer.RefererMiddleware': True,
}

次に、応答解析メソッドでresponse.request.headers.get('Referrer', None)、を使用してリファラーを取得できます。

これらのミドルウェアをすぐに理解できたら、もう一度読んで、休憩してから、もう一度読んでください。私はそれらが非常に混乱していることに気づきました。

于 2013-01-08T18:56:56.770 に答える