You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Android中解析雅虎财经涨跌/最活跃股数据?求方案示例

嘿,我来帮你解决这两个Android解析雅虎财经数据的问题,还有你那跑不起来的Jsoup代码我也一起梳理下~

问题1:Android平台解析雅虎网站数据的核心思路

要在Android上解析雅虎网站的HTML数据,用Jsoup是个不错的选择,核心步骤和注意事项如下:

  • 准备工作:
    1. 在app模块的build.gradle里添加Jsoup依赖:
      implementation 'org.jsoup:jsoup:1.17.2'
      
    2. 在AndroidManifest.xml中添加网络权限:
      <uses-permission android:name="android.permission.INTERNET" />
      
  • 执行流程:
    1. 必须在子线程发起网络请求(Android禁止主线程做网络操作),可以用AsyncTask、Coroutine或者线程池实现。
    2. 设置合理的User-Agent模拟浏览器请求,避免被雅虎的反爬机制拦截。
    3. 解析返回的HTML文档,通过Jsoup的选择器定位目标元素,提取所需数据。
  • 反爬应对:
    • 不要频繁发起请求,避免IP被封禁;
    • 可以适当延长超时时间(比如15秒),应对网络波动;
    • 如果遇到Cookie验证,可尝试在请求中添加浏览器的Cookie值(雅虎目前对普通页面的反爬不算严格)。
问题2:解析雅虎财经的下跌股、上涨股及最活跃股数据

雅虎财经把这三类股票分别放在了不同的页面:

  • 最活跃股:https://sg.finance.yahoo.com/most-active
  • 上涨股:https://sg.finance.yahoo.com/gainers
  • 下跌股:https://sg.finance.yahoo.com/losers

针对这些页面,我整理了修复后的Jsoup代码示例,同时解决你原来代码的问题(比如截断的User-Agent、主线程请求风险、超时时间不足等):

完整Java代码示例(用AsyncTask实现)

import android.os.AsyncTask;
import android.util.Log;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import java.io.IOException;

public class YahooFinanceScraper extends AsyncTask<Void, Void, String> {
    private static final String TAG = "YahooFinance";
    // 可替换为gainers或losers对应的URL
    private static final String TARGET_URL = "https://sg.finance.yahoo.com/most-active";

    @Override
    protected String doInBackground(Void... voids) {
        StringBuilder result = new StringBuilder();
        try {
            // 用现代浏览器的User-Agent,避免被反爬拦截
            Document document = Jsoup.connect(TARGET_URL)
                    .userAgent("Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36")
                    .timeout(15000)
                    .get();

            // 定位股票表格(注意转义特殊字符,class里的W(100%)要写成W\\(100%\\))
            Element stockTable = document.selectFirst("table.W\\(100%\\)");
            if (stockTable == null) {
                Log.e(TAG, "页面结构可能已变更,未找到股票表格");
                return "未获取到有效数据";
            }

            // 遍历表格行,提取关键信息
            Elements rows = stockTable.select("tbody tr");
            for (Element row : rows) {
                // 提取股票名称、代码、价格、涨跌幅
                Element nameLink = row.selectFirst("td:nth-child(1) a");
                Element priceSpan = row.selectFirst("td:nth-child(3) span");
                Element changeSpan = row.selectFirst("td:nth-child(4) span");

                if (nameLink != null && priceSpan != null && changeSpan != null) {
                    String stockName = nameLink.text();
                    // 从链接中提取股票代码(链接格式类似/quote/CODE.sg)
                    String stockCode = nameLink.attr("href").split("/")[2].split("\\.")[0];
                    String price = priceSpan.text();
                    String change = changeSpan.text();

                    result.append(String.format("%s (%s): 价格%s,涨跌幅%s\n", stockName, stockCode, price, change));
                }
            }

        } catch (IOException e) {
            Log.e(TAG, "请求失败: " + e.getMessage());
            result.append("请求出错:").append(e.getMessage());
        }
        return result.toString();
    }

    @Override
    protected void onPostExecute(String s) {
        super.onPostExecute(s);
        // 这里可以把结果显示到UI组件,比如TextView
        Log.d(TAG, "爬取结果:\n" + s);
    }
}

调用方式(在Activity中)

// 启动爬虫任务,必须在主线程调用
new YahooFinanceScraper().execute();

注意事项

  1. 网页结构变更:雅虎可能会调整页面的DOM结构,如果代码突然失效,记得用浏览器开发者工具查看最新的表格class或元素位置,调整Jsoup的选择器。
  2. 替代方案:网页解析稳定性较差,如果长期使用,建议考虑雅虎财经的官方API(需要申请API密钥),数据格式更规范且不易失效。

内容的提问来源于stack exchange,提问作者Anup Singh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 07:36:05