Safari开发者工具Elements与Resources差异及requests爬虫内容不符的疑问
为什么requests返回的是Resources内容而非Elements内容?
这事儿我太熟了!你遇到的本质是**静态HTML(服务器返回)和动态渲染DOM(浏览器生成)**的差异,咱们把问题拆解清楚:
先搞懂Safari里Elements和Resources的区别
- Resources里的内容:是服务器直接返回的原始HTML代码,也就是你用
requests.get拿到的东西——这是浏览器刚收到的“毛坯房”。 - Elements里的内容:是浏览器执行完页面所有JavaScript后,最终渲染出来的完整DOM结构——相当于“装修好的房子”,很多元素是JS动态生成、插入进去的,原始HTML里根本没有。
Chrome的开发者工具其实是把这俩合并/重命名了:Chrome的Elements对应Safari的Elements,Chrome的Sources面板里的HTML文件对应Safari的Resources,本质是一回事。
为什么requests拿不到Elements里的内容?
requests只是个HTTP请求工具,它只会发送请求、接收服务器返回的静态数据,不会执行任何JavaScript代码。那些你在Elements里看到的目标元素,是页面加载完成后,由页面内的JS脚本动态创建并插入DOM的,所以requests自然拿不到这些内容。
怎么解决这个问题?
有两种常见的思路,根据你的场景选:
思路1:直接请求数据接口(推荐)
很多网站的动态内容是通过AJAX(XHR/Fetch)请求从后端API获取的,你可以直接抓这个接口来拿数据,比爬渲染后的页面高效得多:
- 打开浏览器开发者工具的
Network面板 - 刷新页面,筛选
XHR或Fetch类型的请求 - 逐个查看请求的响应内容,找到包含你要的时间列表(
bought-wrapper-mod__create-time___yNWVS)的接口 - 用
requests直接请求这个接口,注意带上必要的Cookie、请求头参数
思路2:用无头浏览器模拟真实渲染
如果找不到接口或者接口有复杂的验证逻辑,那就用工具模拟真实浏览器的行为,让它帮你执行JS并渲染出最终DOM。这里推荐用Playwright(比Selenium更轻量):
先安装Playwright:
pip install playwright playwright install chromium
然后修改你的代码:
from bs4 import BeautifulSoup from playwright.sync_api import sync_playwright with sync_playwright() as p: browser = p.chromium.launch(headless=True) # headless=True表示不显示浏览器窗口 page = browser.new_page() # 先登录(模拟你的post请求) page.goto("https://login.xxxx.com/") page.fill('input[name="TPL_username"]', "xxxx") page.fill('input[name="TPL_password"]', "1xxx") page.click('button[type="submit"]') # 假设登录按钮是submit类型,根据实际情况调整 # 跳转到目标页面 page.goto("http://www.xxxx.com") # 获取渲染后的完整HTML content = page.content() browser.close() soup = BeautifulSoup(content, "html.parser") # 注意:你原来的代码里用了bs.find_all,但变量名是soup,这里要修正 timelists = soup.find_all("span", {"class": "bought-wrapper-mod__create-time___yNWVS"}) print(timelists)
最后提个小bug
你原来的代码里有个拼写错误:timelists = bs.find_all(...)这里的bs应该是soup,不然会报NameError,记得修正哦!
内容的提问来源于stack exchange,提问作者Treaser
相关产品推荐
相关产品推荐

