为何Selenium与BeautifulSoup获取的页面源码不同?如何仅用bs4爬取正确数据?
问题1:两种方案获取页面源码存在差异的根本原因
requests发起请求时只会拿到服务端返回的初始静态HTML,整个过程不会执行页面内嵌或引用的任何JavaScript代码。该站点做了明确的前端内容反爬:真实利率数据不会直接写入初始静态响应,表格td标签内的“web giá”是专门返回给无JS执行能力的爬虫的占位文本,标签上的nb属性存储的是经过前端加密的密文,不解密就无法获取真实值。- Selenium驱动Chrome加载页面时,会完整复现真实浏览器的运行逻辑:自动加载所有关联的JS、CSS资源,按顺序执行页面脚本。站点自带的前端解密脚本会在页面加载阶段自动读取每个td的
nb属性密文,解密后替换占位文本,最终渲染出用户肉眼可见的真实利率表格。此时调用driver.page_source拿到的是JS执行完毕、DOM渲染完成后的最终页面内容,和requests拿到的未执行JS的初始静态源码自然存在明显差异。
问题2:不依赖Selenium、仅用requests+BeautifulSoup爬取完整数据的实现方法
不需要模拟浏览器,只要本地复现站点的前端解密逻辑就能拿到全部数据,具体步骤如下:
- 构造和真实浏览器完全一致的请求头,重点替换
User-Agent字段为普通Chrome浏览器的UA值,不要使用requests默认的标识爬虫的UA,发起请求拿到初始静态HTML后,传入BeautifulSoup用lxml解析器正常定位表格结构即可。 - 提取站点的前端解密逻辑:打开浏览器开发者工具,在全局源码搜索栏检索和
nb属性读取、td文本替换相关的代码片段,就能找到页面对应的解密函数。该站点的解密计算完全在前端本地完成,不需要额外向服务端发送请求获取密钥或真实数据。 - 将找到的JavaScript解密逻辑逐行翻译为可运行的Python代码,遍历解析结果里所有带
nb属性的td标签,取出属性内存储的密文传入翻译好的解密函数,计算得到的返回值就是真实利率数值,直接替换标签内的占位文本即可。 - 后续的字段提取、数据清洗存储逻辑,和你之前用Selenium拿到渲染后源码的解析逻辑完全一致,爬取效率远高于Selenium方案,也不容易触发站点的反爬拦截。
内容的提问来源于stack exchange,提问作者ShanN
相关产品推荐
相关产品推荐

