Scrapy shell可正常提取元素但运行爬虫无对应输出如何解决
问题排查
你代码的核心问题出在逻辑结构和Scrapy异步请求的特性不匹配,具体有三个错误:
- 回调函数逻辑错误:你把分类详情页的请求回调也设置为
parse方法,但parse方法里写的是提取分类列表页.wow.fadeInUp节点的逻辑,分类详情页根本没有这个节点,所以请求返回后什么对应结果都不会输出。 - 商品提取逻辑位置完全错误:你写的
.web_prolist提取代码紧跟在yield scrapy.Request后面,Scrapy的请求是异步的,这行代码执行的时候请求还没发出去,你拿的还是当前分类列表页的response去提取商品节点,分类列表页根本没有这个节点,当然拿不到任何结果。 - 重复请求+没必要的csv读写:你每提取一个分类就读取一次全量分类csv发起请求,11个分类会重复发起121次请求,所以日志里会出现重复请求过滤的提示,而且你刚yield分类数据就去读csv,此时分类数据可能还没写入csv,逻辑完全不通。
修正后代码
你完全不需要用csv中间存储分类,拆分两个解析函数即可:
import scrapy base_url = 'http://www.cleanman-cn.com/' class CleanmanSpider(scrapy.Spider): name = 'clean' start_urls = ['http://www.cleanman-cn.com/productlist.php/'] def parse(self, response): # 专门处理分类列表页,提取分类信息+发起分类详情页请求 for cat in response.css('.wow.fadeInUp'): name = cat.css('a > p::text').get() if name is not None: name = name.strip() link = cat.css('a::attr(href)').get() category_url = base_url + link # 输出分类信息 yield { 'Categorie' : name, 'Url' : category_url } # 发起分类详情页请求,回调到专门的商品提取函数 yield scrapy.Request( category_url, callback=self.parse_category, # 可把分类名传下去,后续商品数据可以绑定对应分类 cb_kwargs={"category": name} ) def parse_category(self, response, category): # 专门处理分类详情页,提取商品链接 master = response.css('.web_prolist') for item in master: for x in item.css('li'): link = x.css('a::attr(href)').get() # 输出商品链接,这里已经拼接成完整url yield { "category": category, "product_link": base_url + link if link else None }
内容的提问来源于stack exchange,提问作者Herminio Henriques
相关产品推荐
相关产品推荐

