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

Scrapy抓取的time标签datetime属性与Chrome开发者工具不一致问题咨询

Scrapy抓取time标签datetime属性与Chrome显示不一致的原因及解决方法

问题原因

你遇到的差异核心在于页面DOM的渲染逻辑不同:

  • Chrome开发者工具展示的是客户端JavaScript执行完成后的最终DOM状态——网站大概率通过JS动态修改了time标签的datetime属性和显示文本,让二者匹配一致。
  • Scrapy默认只抓取服务器直接返回的原始HTML内容,不会执行页面中的JavaScript,所以拿到的是JS修改前的初始datetime值,而文本可能是服务器返回的原始内容(或部分修改,但datetime未被Scrapy捕获到更新后的状态)。

从你提供的代码返回值和Chrome节点对比就能明确:Scrapy拿到的datetime是2021-11-15T08:17:20+01:00,而Chrome里是2020-03-08T17:20:16+01:00,显然是页面加载后JS替换了正确的日期属性。

解决方法

1. 让Scrapy模拟浏览器执行JavaScript

使用支持JS渲染的Scrapy扩展(如scrapy-playwright),模拟真实浏览器行为,等JS执行完成后再抓取最终DOM:

  • 先安装依赖:
    pip install scrapy-playwright
    
  • 在Scrapy项目的settings.py中配置:
    DOWNLOAD_HANDLERS = {
        "http": "scrapy_playwright.handler.ScrapyPlaywrightDownloadHandler",
        "https": "scrapy_playwright.handler.ScrapyPlaywrightDownloadHandler",
    }
    PLAYWRIGHT_LAUNCH_OPTIONS = {"headless": True}  # 无头模式,需可视化可设为False
    
  • 在Spider中启用Playwright:
    import scrapy
    from scrapy_playwright.page import PageCoroutine
    
    class NewsSpider(scrapy.Spider):
        name = "news_spider"
        start_urls = ["你的目标文章URL"]
    
        def start_requests(self):
            for url in self.start_urls:
                yield scrapy.Request(
                    url,
                    meta={
                        "playwright": True,
                        "playwright_page_coroutines": [
                            PageCoroutine("wait_for_selector", ".a20-news-date time")  # 等待目标元素加载完成
                        ],
                    },
                )
    
        def parse(self, response):
            # 此时抓取到的是JS执行后的正确datetime属性
            correct_datetime = response.xpath("//*[@class='a20-news-date']/time/@datetime").get()
            yield {"datetime": correct_datetime}
    

2. 直接提取页面的原始数据源(更高效)

很多网站会把文章元数据(包括日期)以JSON形式嵌入在页面的<script>标签或XHR接口中,无需渲染JS就能直接提取:

  • 找数据源:在Chrome开发者工具「Network」标签过滤XHR请求,查找返回文章数据的接口;或查看页面<script>标签,找类似window.__ARTICLE_DATA__的内嵌变量。
  • 示例代码(假设日期数据在window.__NEWS_INFO__中):
    import json
    from scrapy import Spider
    
    class NewsSpider(Spider):
        name = "news_spider"
        start_urls = ["你的目标文章URL"]
    
        def parse(self, response):
            # 提取包含数据的script标签内容
            script_content = response.xpath("//script[contains(text(), '__NEWS_INFO__')]/text()").get()
            # 剥离变量定义,提取JSON部分
            json_str = script_content.split("window.__NEWS_INFO__ = ")[1].rstrip(";")
            news_info = json.loads(json_str)
            # 获取正确的datetime
            correct_datetime = news_info["publish_time"]
            yield {"datetime": correct_datetime}
    

3. 验证原始响应内容

先确认服务器返回的原始HTML是否真的包含错误datetime:

  • 在终端运行scrapy shell 目标文章URL,执行以下命令:
    print(response.xpath("//*[@class='a20-news-date']/time/@datetime").get())
    print(response.text)  # 查看完整原始HTML内容
    

如果原始HTML里的datetime确实和Chrome显示不同,就能确定是JS动态修改的问题,再选择上述方法解决。

内容的提问来源于stack exchange,提问作者Henrik

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 21:40:39