Scrapy爬虫运行无返回结果 parse_item未执行问题排查
问题诱因
- 核心错误是类方法缩进不合法:你定义的
parse、parse_items、parse_item三个方法全部顶格编写,没有缩进归入AstroSpider类的内部。Scrapy处理完初始请求后,会默认调用Spider类内部的parse方法作为入口回调,由于这个方法根本不在类中,初始响应没有任何逻辑处理,后续的页面跳转、数据解析链路完全不会触发,自然没有任何打印和输出结果。 - 存在潜在的解析报错风险:代码里直接用
getall()[0]、getall()[1]取下标取值,如果目标页面的CSS选择器没有匹配到足够的元素,会直接抛出索引越界异常,导致单个请求解析中断。 - 调试打印不友好:直接用
print输出内容很容易被Scrapy默认的运行日志覆盖,就算逻辑跑到了也可能看不到打印内容。
修复方案
修复后的完整可运行代码如下:
import scrapy class AstroSpider(scrapy.Spider): name = "Astro" allowed_domains = ['www.astrolighting.com'] start_urls = ['https://www.astrolighting.com/products'] def parse(self, response, **kwargs): for link in response.css('article.product-listing-item a::attr(href)'): yield response.follow(link.get(), callback=self.parse_items) def parse_items(self, response): variant_links = response.css('div.variants.variants--large a::attr(href)') # 兼容无变体的单品页面,避免漏抓 if not variant_links: yield from self.parse_item(response) return for link in variant_links: yield response.follow(link.get(), callback=self.parse_item) def parse_item(self, response): span_content = response.css('div.detail__right p span::text').getall() yield { 'name': response.css('div.detail__right h1::text').get(default='').strip(), 'material': span_content[0].strip() if len(span_content) >= 1 else '', 'id': span_content[1].strip() if len(span_content) >= 2 else '' }
对应的修复点说明:
- 所有回调方法统一缩进4个空格,归入
AstroSpider类内部,保证Scrapy能正常找到初始回调parse,启动整个解析流程。 - 增加选择器匹配容错:取值前先判断匹配到的内容长度,避免因为页面结构局部变动导致索引越界报错。
- 增加页面结构兼容:如果进入的页面没有变体选项(本身就是最终详情页),直接调用详情解析逻辑,避免漏抓数据。
- 调试时如果需要看打印内容,建议用Scrapy自带的
self.logger.info("调试信息")代替原生print,不会被日志覆盖;也可以启动爬虫时加--nolog参数关闭默认日志,只看自定义输出。
内容的提问来源于stack exchange,提问作者Zero
相关产品推荐
相关产品推荐

