如何为SitemapSpider设置默认Cookies及自定义Headers?
你的代码问题在于重写了错误的方法,_request_sitemaps不是生成sitemap请求的正确入口,且未处理目标页面请求的参数传递。以下是两种场景的正确实现:
1. 仅给请求sitemap文件的请求添加Headers和Cookies
重写sitemap_requests方法(父类生成sitemap请求的入口):
class MySpider(SitemapSpider): name = 'myspider' sitemap_urls = ['https://www.sitemap-1.xml'] custom_headers = {'pragma': 'no-cache',} custom_cookies = {"sdsd": "23234",} def sitemap_requests(self): for url in self.sitemap_urls: yield scrapy.Request( url=url, headers=self.custom_headers, cookies=self.custom_cookies, callback=self._parse_sitemap ) def parse(self, response, **cb_kwargs): print(response.css('title::text').get())
2. 给sitemap文件请求和目标页面请求都添加Headers和Cookies
如果需要sitemap解析出的所有目标页面请求也带上自定义参数,需额外重写_parse_sitemap方法:
class MySpider(SitemapSpider): name = 'myspider' sitemap_urls = ['https://www.sitemap-1.xml'] custom_headers = {'pragma': 'no-cache',} custom_cookies = {"sdsd": "23234",} def sitemap_requests(self): for url in self.sitemap_urls: yield scrapy.Request( url=url, headers=self.custom_headers, cookies=self.custom_cookies, callback=self._parse_sitemap ) def _parse_sitemap(self, response): # 复用父类逻辑生成目标请求,再添加自定义参数 for request in super()._parse_sitemap(response): request.headers.update(self.custom_headers) request.cookies.update(self.custom_cookies) yield request def parse(self, response, **cb_kwargs): print(response.css('title::text').get())
关键说明
- 父类
SitemapSpider的start_requests会调用sitemap_requests生成sitemap文件的请求,因此重写该方法才能正确传递参数。 - 用
custom_headers、custom_cookies命名类属性,避免和Scrapy内置属性冲突。 - 若需目标页面请求带参数,必须在
_parse_sitemap中处理父类生成的请求,添加参数后再返回。
内容的提问来源于stack exchange,提问作者m_sasha
相关产品推荐
相关产品推荐

