使用Jsoup抓取Binance数据网页全部链接仅能获取头部链接问题咨询
问题根因
你要抓取的币安公开数据页面的交易对列表是前端JavaScript异步加载后动态渲染的,你用Jsoup直接请求拿到的是未执行JS的初始HTML源码,里面根本没有列表区域的tbody、td、对应链接等元素,所以不管怎么调整CSS选择器都拿不到目标内容,这不是选择器写法的问题,是获取的页面内容不对。
现有尝试的问题点
Elements tableLinks = doc.select("#listing a");:#listing是列表容器,但初始HTML中该容器为空,JS未执行完成前没有子元素Elements tableElement = doc.getElementsByAttribute("tbody");:写法错误,tbody是标签名不是元素属性,就算修正为getElementsByTag("tbody"),初始HTML中也不存在该节点Elements links = doc.select("a[href]");:只能匹配到初始HTML中静态写死的页头链接,也就是你现在拿到的非目标内容Elements resultLinks = doc.select("td > a");:动态渲染的td和a节点在初始HTML中不存在,自然匹配不到结果
可行解决方案
方案1:直接调用底层列表接口(更高效)
该页面的列表本质是调取站点自身的公开存储查询接口返回的XML数据,不需要爬页面,按照你要的路径前缀构造查询请求即可,返回的XML里直接包含所有交易对的路径,直接解析XML就能拿到所有目标链接,无需处理前端渲染逻辑。
方案2:使用带JS渲染能力的工具爬取
如果必须通过页面抓取,需要替换纯静态HTML解析工具,使用Selenium、Playwright、HtmlUnit等支持JS执行的工具,等待页面JS执行完成、列表渲染完毕后,再用你之前写的td > a选择器就能正常匹配到目标链接。
内容的提问来源于stack exchange,提问作者JG-TLS
相关产品推荐
相关产品推荐

