2013-01-08 35 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