爬取onclick按钮触发的detailTable数据是否只能用Selenium
爬取方案结论
不需要强制使用Selenium,完全可以通过Requests+BeautifulSoup组合实现该场景的爬取需求,效率比模拟浏览器方案高很多。
具体实现思路
- 先定位真实接口的参数规律,不要被URL无规律的表象误导:
打开浏览器开发者工具的Network面板,清空所有请求记录后再点击橙色按钮,精准定位到加载detailTable内容的那条POST请求,重点核对三类信息:- 请求头(Request Headers):重点关注
Referer、Cookie、跨域校验头、CSRF令牌类参数,这类参数大多能在首次访问列表页的响应里拿到 - 请求体(Form Data/Request Payload):逐个核对参数来源——绑定onclick事件的按钮,一般会把请求需要的条目ID、分页参数直接写在按钮的
data-*自定义属性、或者onclick调用的函数传参里,不存在真正无规律的参数 - 响应内容:如果接口直接返回
detailTable的HTML片段,拿到响应后可以直接交给BeautifulSoup解析;如果返回JSON格式数据,提取对应字段后再解析即可
- 请求头(Request Headers):重点关注
- 搭请求逻辑的时候用
requests.Session()维持会话一致性:- 首先用Session发起GET请求访问初始列表页,拿到初始HTML后用BeautifulSoup解析,提取所有橙色按钮携带的请求参数、页面内嵌的校验token,同时自动保留服务端返回的Cookie
- 按照浏览器抓包拿到的格式拼接POST请求参数,带上和浏览器一致的请求头(异步加载接口一般要求携带
X-Requested-With: XMLHttpRequest标识,标识这是AJAX请求,否则容易被拦截) - 直接向接口地址发POST请求,就能拿到
detailTable的完整内容,不需要模拟真实点击操作。
注意事项
- 如果发现请求里带疑似加密的参数,直接在开发者工具的Sources面板里搜索onclick绑定的JS函数,顺着函数逻辑找加密规则即可,该站点这类面向普通用户的公开数据接口,前端加密逻辑一般不会做高强度混淆,逆向成本很低
- 如果排查后发现接口确实有无法复现的参数校验,再考虑用Selenium做兜底,绝大多数情况下直接抓POST接口的方案都能跑通,爬取效率远高于模拟浏览器。
内容的提问来源于stack exchange,提问作者hyeppy
相关产品推荐
相关产品推荐

