如何在Scrapy中抓取发布日期(替换相对时间为具体日期)
Scrapy抓取文章发布日期的修正方案
针对你在Scrapy中处理目标网站发布日期的需求,原代码存在几个需要优化的点,以下是修正后的实现方案:
原代码问题分析
- 未导入
datetime模块相关类,运行时会报错 - 相对时间判断用大写
"AGO",但目标网站的相对时间是小写"ago"(如"2 days ago"),会导致判断失效 - 未处理抓取结果为空的情况,会触发
AttributeError - 未考虑非英文环境下月份缩写解析失败的问题
优化后的代码实现
方式一:优先读取time标签的datetime属性(推荐)
目标网站的<time>标签带有datetime属性,存储了标准ISO格式的真实发布日期,无需处理相对时间文本,直接读取该属性更可靠:
from datetime import datetime # 提取datetime属性值 date_attr = response.css('time::attr(datetime)').get() if date_attr: # 解析ISO格式日期,仅保留日期部分 Published_Date = datetime.fromisoformat(date_attr.split('+')[0]).date() else: # 当属性不存在时,降级为文本处理 raw_date = response.css('time::text').get() Published_Date = date.today() # 或根据需求设置默认值
方式二:文本内容处理(兼容相对时间)
如果必须通过文本内容处理,可按以下代码实现:
from datetime import date, datetime import locale # 配置英文本地化,确保月份缩写解析正常(非英文环境需执行) try: locale.setlocale(locale.LC_TIME, 'en_US.UTF-8') except locale.Error: # 若系统无对应locale,跳过设置(英文环境可忽略) pass raw_date = response.css('time::text').get() if not raw_date: Published_Date = date.today() else: cleaned_date = raw_date.replace(",", "").replace("Published ", "").strip() # 不区分大小写判断相对时间 if "ago" in cleaned_date.lower(): Published_Date = date.today() else: try: # 解析英文格式日期 Published_Date = datetime.strptime(cleaned_date, "%b %d %Y").date() except ValueError: # 解析失败时 fallback 到当前日期 Published_Date = date.today()
关键改进说明
- 增加空值处理,避免程序崩溃
- 用
lower()统一判断相对时间,兼容大小写差异 - 加入异常捕获,处理日期解析失败的情况
- 优先读取
datetime属性,获取最准确的原始发布日期,而非依赖前端显示的相对时间
内容的提问来源于stack exchange,提问作者Info Rewind
相关产品推荐
相关产品推荐

