使用Scrapy与XPath解析数据及Pipeline数据清洗配置问题咨询
问题解答
节点提取问题
你后续更新的提取方案是正确的:原HTML结构中announcement-block__date节点内部包含了子span节点(存放公司名),你需要的日期、城市文本属于span的后续兄弟文本节点,直接取div的text()无法拿到跨标签的文本内容,使用following-sibling::text()结合normalize-space处理后再按逗号拆分,就可以正确获取到对应字段。
额外问题:items.py 与 pipeline 用法说明
两者不是二选一的关系,功能定位不同,需要配合使用:
- items.py 的作用:定义结构化的字段规范,避免爬虫开发中字段名拼写错误,统一各爬虫的输出数据结构,不同爬虫可以定义不同的Item类。
- pipelines.py 的作用:全局统一处理所有爬虫提交的Item,包括数据清洗、格式转换、校验、存储等逻辑,你需要的字段转换规则都可以放在这里实现。
具体实现步骤
1. 配置 items.py
先定义你需要的字段,这里示例给jobs爬虫单独定义Item,其他爬虫可以同理新增对应Item类:
import scrapy class JobItem(scrapy.Item): date = scrapy.Field() city = scrapy.Field() company = scrapy.Field() salary = scrapy.Field() employer = scrapy.Field() # 其他爬虫的Item可以继续在这里定义 class ApartmentItem(scrapy.Item): # 对应公寓爬虫的字段 pass class CarItem(scrapy.Item): # 对应车辆爬虫的字段 pass
2. 配置 pipelines.py
通过spider.name区分不同爬虫,只对jobs爬虫执行你需要的清洗规则:
from itemadapter import ItemAdapter class ScrapebooksPipeline: def process_item(self, item, spider): # 只处理jobs爬虫的Item if spider.name == 'jobs': adapter = ItemAdapter(item) # 规则1:salary小于1000替换为Negotiable salary = adapter.get('salary') if salary and isinstance(salary, (int, float)) and salary < 1000: item['salary'] = 'Negotiable' # 规则2:日期包含Өчигдөр则替换为Yesterday,保留时间 date = adapter.get('date', '').strip() if 'Өчигдөр' in date: item['date'] = date.replace('Өчигдөр', 'Yesterday') # 规则3:employer包含Хувь хүн则修改company字段 employer = adapter.get('employer', '') if 'Хувь хүн' in employer: item['company'] = 'Хувь хүн' return item
3. 开启pipeline配置
找到项目的settings.py文件,新增/修改以下配置,开启pipeline才会生效:
ITEM_PIPELINES = { '你的项目名.pipelines.ScrapebooksPipeline': 300, }
内容的提问来源于stack exchange,提问作者WX1505
相关产品推荐
相关产品推荐

