2013-01-08 34 views
4

我正在使用CrawlSpider類來抓取網站,我想修改每個請求中發送的標頭。具體而言,我想在請求中添加引用者。如何將標題添加到Scrapy CrawlSpider請求?

作爲每this question,我在響應解析功能檢查

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

Referer頭不存在。我認爲這意味着Referer沒有被提交請求(除非網站沒有返回它,我不確定)。

我一直無法弄清楚如何修改請求的標題。同樣,我的蜘蛛來自CrawlSpider。覆蓋CrawlSpider的_requests_to_follow或爲規則指定process_request回調將不起作用,因爲引用者不在這些時間範圍內。

有誰知道如何動態修改請求標頭?

回答

8

我討厭回答我自己的問題,但我發現如何去做。你必須啓用SpiderMiddleware來填充引用者的回覆。請參閱documentationscrapy.contrib.spidermiddleware.referer.RefererMiddleware

總之,您需要將此中間件添加到項目的設置文件中。

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

然後在您的響應解析方法,你可以使用,response.request.headers.get('Referrer', None),得到引薦。

如果您立即瞭解這些中間件,請再次閱讀它們,休息一下,然後再讀一遍。我發現他們很混亂。

+0

默認情況下,在BASE_Settings中RefererMiddleware處於活動狀態,因此無需在蜘蛛設置中激活它們。 –

+0

@akhterwahab嗯。在將我的項目設置添加到以前未修改過的項目設置中之前,我的請求標題中沒有提供查閱者。我確實看到該設置的默認值爲true。儘管如此,他們並沒有爲我工作。 – CatShoes

+0

btw:response.request.headers.get('Referer',None)是正確的用法。 「推薦人」不會給出正確的結果。 – BgRva

13

您可以手動傳遞REFERER每個request使用headers說法:

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

RefererMiddleware does the same,自動從以前的響應服用參照網址。

+0

太好了,我會記住未來。在目前的設置中,我不是手動創建請求(我的規則正在處理這項工作)。 – CatShoes