You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Scrapy中抓取发布日期(替换相对时间为具体日期)

Scrapy抓取文章发布日期的修正方案

针对你在Scrapy中处理目标网站发布日期的需求,原代码存在几个需要优化的点,以下是修正后的实现方案:

原代码问题分析

  1. 未导入datetime模块相关类,运行时会报错
  2. 相对时间判断用大写"AGO",但目标网站的相对时间是小写"ago"(如"2 days ago"),会导致判断失效
  3. 未处理抓取结果为空的情况,会触发AttributeError
  4. 未考虑非英文环境下月份缩写解析失败的问题

优化后的代码实现

方式一:优先读取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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 06:55:17