10

我正在使用 CrawlSpider 类来抓取网站,并且我想修改在每个请求中发送的标头。具体来说,我想将引用者添加到请求中。

根据这个问题,我检查了

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做同样的事情,自动从上一个响应中获取引荐来源网址。

于 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 回答