我正在使用CrawlSpider类来抓取网站,我想修改每个请求中发送的标头。具体来说,我想将引用添加到请求中。
根据this question,我检查了
response.request.headers.get('Referer', None)
在我的响应解析函数中,Referer
标头不存在。我认为这意味着请求中没有提交Referer(除非网站没有返回它,我不确定)。
我还没有弄清楚如何修改请求的标头。我的蜘蛛再次来自CrawlSpider。覆盖CrawlSpider的_requests_to_follow
或指定规则的process_request
回调将无效,因为在这些时候引用不在范围内。
有谁知道如何动态修改请求标头?
答案 0 :(得分:18)
您可以使用REFERER
参数手动将headers
传递给每个request:
yield Request(parse=..., headers={'referer':...})
RefererMiddleware does the same,自动从之前的回复中获取引荐来源网址。
答案 1 :(得分:11)
我不想回答我自己的问题,但我发现了如何做到这一点。您必须启用SpiderMiddleware,它将填充referer以获取响应。请参阅scrapy.contrib.spidermiddleware.referer.RefererMiddleware
的{{3}}
简而言之,您需要将此中间件添加到项目的设置文件中。
SPIDER_MIDDLEWARES = {
'scrapy.contrib.spidermiddleware.referer.RefererMiddleware': True,
}
然后在您的响应解析方法中,您可以使用response.request.headers.get('Referrer', None)
来获取引用。
如果您立即了解这些中间件,请再次阅读它们,休息一下,然后再次阅读它们。我发现它们非常令人困惑。