requests只能获取原始html,因目标内容由javascript动态渲染生成,原始html中仅含空壳结构(如),无实际数据;需用selenium或playwright启动真实浏览器执行js并等待渲染完成后再提取dom。

因为 requests 拿到的只是服务器返回的原始 HTML,而目标内容由 JavaScript 动态渲染生成——你看到的页面和源码根本不是一回事。
怎么确认是 JS 渲染导致的空内容
别猜,直接验证:
- 浏览器中打开目标页 → 右键「查看网页源代码」→ 搜索你要的数据关键词(比如价格、列表项),搜不到就基本确定是动态渲染
- 对比「开发者工具」→「Elements」面板里的 DOM:如果那里有内容,但源代码里只有
<div id="app"></div>或空<tbody>,就是 JS 加载的 <li>执行 <code>print(r.text[:500]),看requests.get()实际拿到的是不是一堆脚本或空壳结构 - 别只靠
driver.implicitly_wait(10),它只等 DOM 出现,不等 JS 渲染完成;必须用显式等待,比如WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.CSS_SELECTOR, ".price"))) - 避免用
driver.page_source再喂给BeautifulSoup—— 直接用driver.find_element(By.CSS_SELECTOR, "...")提取更稳,绕过解析差异 -
tbody是隐形坑:浏览器 Elements 面板里显示的/tbody/tr,原始 HTML 里往往根本不存在tbody标签,XPath 或 CSS 里硬写会失败;改用table tr更可靠 - 没设
User-Agent?很多站直接返回 403 或空白页;至少加上{"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64)..."} - 需要登录态或 Referer 才能加载内容?用
requests.Session()复用 Cookie,或手动补全Referer和Cookie字段 - 响应状态码不是 200?打印
r.status_code和r.headers.get("Location"),检查是否被 302 重定向到首页或拦截页 - 中文 URL 没
quote编码?会导致请求路径截断或 400,用urllib.parse.quote(url, safe=':/?&=')
为什么加了 Selenium 还是返回空
常见陷阱不是没启动浏览器,而是没等真实内容出来:
headers、Cookie、重定向这些细节也常导致“空”
表面成功,实际拿错页:
真正难的不是换工具,而是每次都要先判断:空,到底是没发出去、被拦下来、还是压根没渲染完。这三个环节任何一处断掉,结果都一样——什么也没有。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











