参考:
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),
)