Scrapy中HtmlResponse对象在parse方法外使用CSS selector无法取值如何解决
问题原因
- 手动实例化
HtmlResponse时仅传入了url参数,没有加载对应页面的真实HTML响应体,相当于一个空的响应对象,所以css选择器找不到任何元素 parse方法里的response是Scrapy框架完成网络请求后,自动填充了完整响应头、响应体等数据的对象,所以可以正常提取内容
正确实现代码
你要实现「先请求分类页拿所有分类链接,再爬每个分类页」的需求,直接重写Scrapy的start_requests方法即可,示例如下:
import scrapy class SampleSpider(scrapy.Spider): name = 'sample' allowed_domains = ['sample.com'] def start_requests(self): # 第一步先请求分类页 yield scrapy.Request( url='https://sample.com/search', callback=self.parse_categories ) def parse_categories(self, response): # 提取所有分类链接 categories = response.css('.categories a::attr(href)').getall() # 遍历请求每个分类页,用parse方法处理 for category in categories: yield scrapy.Request( url=response.urljoin(category), # 自动处理相对路径转绝对路径 callback=self.parse ) def parse(self, response, **kwargs): pages = response.css('h3') for page in pages: print(page.css('::text').get())
注意事项
- 不要在类属性定义阶段做网络请求相关的操作,类属性在爬虫加载阶段就会执行,此时Scrapy的请求调度体系还没启动,无法完成正常的页面拉取逻辑
- 提取到的分类链接如果是相对路径,必须用
response.urljoin()转为绝对路径再发起请求,避免请求出错
内容的提问来源于stack exchange,提问作者Tio
相关产品推荐
相关产品推荐

