Scrapy爬虫CSS选择器Shell有效但运行失效,CSV输出异常求助
Scrapy爬虫问题修复方案
核心问题与修复点:
元素遍历错误
原代码中products = response.css('li.product-item').get()仅返回单个字符串元素,无法进行后续CSS选择器解析。需改为获取所有匹配的Selector列表:products = response.css('li.product-item') # 直接遍历SelectorList即可,无需额外调用getall()内部CSS选择器冗余
遍历的product本身就是li.product-item节点,内部选择器无需重复前缀,否则会匹配失败:- 原
name选择器:li.product-item > div.product-item-details > h2::text - 修正后:
div.product-item-details > h2::text
- 原
字段提取逻辑错误
- 价格字段:原
get()返回整个HTML标签,需提取文本内容,例如定位到价格的span标签 - URL字段:用
::attr(href)提取属性更健壮,避免元素不存在时抛出异常
- 价格字段:原
翻页逻辑错误
- 分页URL应在循环内部生成,避免未定义变量报错
- 回调方法名需小写
parse,原代码大写Parse会导致找不到方法 - 分页URL格式错误,需去掉多余的
/,正确格式为https://www.stylevana.com/en_US/skincare.html?p={page_num}
修正后的完整代码:
import scrapy class StylevanaspiderSpider(scrapy.Spider): name = "stylevanaspider" allowed_domains = ["www.stylevana.com"] start_urls = ["https://www.stylevana.com/en_US/skincare.html"] def parse(self, response): # 获取所有产品节点的Selector列表 products = response.css('li.product-item') for product in products: yield { 'name': product.css('div.product-item-details > h2::text').get(default='').strip(), 'price': product.css('div.product-item-details > div.price-box span.price::text').get(default=''), # 如需旧价格,可取消注释并修正选择器 # 'old_price': product.css('div.product-item-details > div.price-box span.old-price::text').get(default=''), 'url': product.css('div > div > div > a::attr(href)').get(default=''), } # 翻页逻辑修正 for page_num in range(2, 875): next_page_url = f'https://www.stylevana.com/en_US/skincare.html?p={page_num}' yield response.follow(next_page_url, callback=self.parse)
额外说明:
- 使用
get(default='')可以避免字段为None,导出CSV时更规范 - 文本提取后用
strip()去除多余空格,保证数据整洁 - 若网站有反爬机制,可在
settings.py中添加USER_AGENT模拟浏览器请求
内容的提问来源于stack exchange,提问作者so_ko
相关产品推荐
相关产品推荐

