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
相关产品推荐
相关产品推荐

