如何从Benzinga网站获取最热门卖空股票的指定数据?
问题描述
需要获取Benzinga网站「最热门卖空股票」板块的以下数据:
- Symbol(股票代码)
- Current Short Int(当前卖空比率)
- Previous Short Int(上期卖空比率)
- Short In(卖空天数)
- Short Share Value(卖空股票价值)
当前使用Jsoup直接抓取页面文本,但未获取到目标数据,代码如下:
public class doIT extends AsyncTask<Void,Void,Void> { String words; @Override protected Void doInBackground(Void... params) { try { Document document = Jsoup.connect("https://www.benzinga.com/short-interest/most-shorted").get(); words = document.text(); } catch (IOException e) { e.printStackTrace(); } return null; } @Override protected void onPostExecute(Void aVoid) { super.onPostExecute(aVoid); Log.i("words",words); } }
解决方案
问题根源
目标页面的卖空数据是通过JavaScript动态渲染加载的,Jsoup仅能抓取页面的静态HTML源码,无法解析执行JS后生成的动态内容,所以直接调用document.text()无法获取到表格里的目标数据。
可行解决方法
1. 抓取后端API(推荐)
打开浏览器开发者工具(F12),切换到「网络」标签,刷新页面后筛选XHR/fetch请求,找到加载卖空数据的API接口。这类接口通常返回JSON格式数据,直接请求API比解析页面DOM更高效稳定。
修改后的AsyncTask示例:
public class doIT extends AsyncTask<Void,Void,String> { @Override protected String doInBackground(Void... params) { try { // 替换为你找到的实际API地址 String apiUrl = "https://example-api.benzinga.com/short-interest/most-shorted"; String jsonResponse = Jsoup.connect(apiUrl) .ignoreContentType(true) // 允许Jsoup处理JSON响应 .userAgent("Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36") .execute() .body(); return jsonResponse; } catch (IOException e) { e.printStackTrace(); return null; } } @Override protected void onPostExecute(String jsonResponse) { super.onPostExecute(jsonResponse); if (jsonResponse != null) { Log.i("API响应数据", jsonResponse); // 使用Gson/Jackson等JSON解析库提取所需字段 // 例如: // MostShortedData data = new Gson().fromJson(jsonResponse, MostShortedData.class); } } }
2. 使用WebView渲染页面后抓取
如果找不到可用API,可以用Android的WebView加载页面,等待JS渲染完成后再提取数据:
- 在布局中添加WebView组件
- 启用JavaScript支持,监听页面加载完成事件
- 通过
evaluateJavascript()执行JS脚本获取渲染后的页面内容
示例代码片段:
WebView webView = findViewById(R.id.webview); webView.getSettings().setJavaScriptEnabled(true); webView.setWebViewClient(new WebViewClient() { @Override public void onPageFinished(WebView view, String url) { super.onPageFinished(view, url); // 执行JS获取表格的HTML,需根据页面实际DOM结构调整选择器 webView.evaluateJavascript("document.querySelector('.table-responsive table').outerHTML", new ValueCallback<String>() { @Override public void onReceiveValue(String value) { // 解析返回的HTML字符串 Document doc = Jsoup.parse(value.replace("\"", "")); // 去除JS返回的引号包裹 Elements rows = doc.select("tr"); for (Element row : rows) { Elements cols = row.select("td"); if (cols.size() >= 5) { String symbol = cols.get(0).text().trim(); String currentShortInt = cols.get(1).text().trim(); String previousShortInt = cols.get(2).text().trim(); String shortInDays = cols.get(3).text().trim(); String shortShareValue = cols.get(4).text().trim(); Log.i("卖空数据", String.format("%s | 当前比率:%s | 上期比率:%s | 天数:%s | 价值:%s", symbol, currentShortInt, previousShortInt, shortInDays, shortShareValue)); } } } }); } }); webView.loadUrl("https://www.benzinga.com/short-interest/most-shorted");
注意事项
- 严格遵守网站的使用条款和
robots.txt规则,避免高频请求导致IP被封禁 - 部分API可能需要特定请求头(如User-Agent、Referer),需在请求中添加对应参数
- 使用WebView时,注意处理内存泄漏问题,及时销毁WebView实例
内容的提问来源于stack exchange,提问作者Arron Lapta
相关产品推荐
相关产品推荐

