scrapy CrawlSpider设置headers

参考:
CrawlSpider带headers和cookies请求,解决302重定向和禁止访问问题

通常在使用CrawlSpider时,可以指定rules,但却没有指定headers、cookies的地方,我们可以在start_requests通过scrapy.Request指定headers和cookies,但是之后CrawlSpider在根据rules爬取的link请求新页面时,是没有携带headers的(默认会记住并携带cookie),我这边遇到的情况就是初始请求通过start_requests设置headers后可以正常访问,但是根据初始请求页面中提取的link则无法访问,返回403 forbidden,解决此问题亦可通过重写_build_request来为每个request请求设置headers
综上可结合如下两种方式:
(1)在start_requests方法中通过scrapy.Request指定初始请求的headers和cookies
(2)重写_build_request来为之后的每个request请求设置headers
示例代码如下:

    # 在start_requests通过scrapy.Request指定headers和cookies
    def start_requests(self):
        start_urls = self.rules_json.get("start_urls")
        for url in start_urls:
            # yield scrapy.Request(url=url, headers={"hello": "world"}, cookies={"user": "小明"})
            # 设置爬取URL及headers, cookies
            yield scrapy.Request(url=url, headers=self.default_request_headers, cookies=self.default_request_cookies)

	# 重写_build_request来为每个request请求设置headers
    def _build_request(self, rule_index, link):
        return scrapy.Request(
            url=link.url,
            # 重置headers
            headers=self.default_request_headers,
            callback=self._callback,
            errback=self._errback,
            meta=dict(rule=rule_index, link_text=link.text),
        )

猜你喜欢

转载自blog.csdn.net/luo15242208310/article/details/112240255
今日推荐