Jsoup在Android应用程序上获取所有html数据,但不在Java控制台应用程序上获取

Jsoup在Android应用程序上获取所有html数据,但不在Java控制台应用程序上获取,java,android,jsoup,Java,Android,Jsoup,在我的Android应用程序中,我正在异步任务中抓取一些数据。它工作正常,Jsoup可以正确地检索整个文档。但是,当我在Java控制台应用程序中运行相同的Jsoup代码时,它会连接到ESPN网站,但无法获取整个文档,因为games对象始终为空(大小始终为0)。由于某些原因,控制台应用程序上的代码document.select(“section.sb score”)在html中找不到此数据。但在安卓系统中确实如此 以下是运行良好的android代码: public class NBAScraper

在我的Android应用程序中,我正在异步任务中抓取一些数据。它工作正常,Jsoup可以正确地检索整个文档。但是,当我在Java控制台应用程序中运行相同的Jsoup代码时,它会连接到ESPN网站,但无法获取整个文档,因为
games
对象始终为空(大小始终为0)。由于某些原因,控制台应用程序上的代码
document.select(“section.sb score”)在html中找不到此数据。但在安卓系统中确实如此

以下是运行良好的android代码:

public class NBAScraper extends GameScraper  //GameScraper extends AsyncTask
{
    public NBAScraper(DateTime date)
    {
        super(date);
        mUrl = "http://www.espn.com/nba/scoreboard/_/date/" + mDateStr; //mDateStr format: yyyyMMdd
    }

    @Override
    protected GameSorterHelper doInBackground(Void... voids)
    {
        GameSorterHelper gsh = new GameSorterHelper();
        try
        {
            Document document = Jsoup.connect(mUrl).get();
            games = document.select("section.sb-score");
            if(games.size() == 0)
                return null;
        } catch (IOException)
        {
            e.printStackTrace();
            return null;
        }

        //do stuff with gsh object...
        return gsh;
    }
}
以下是我尝试过的控制台应用程序:

public class Main
{
    public static void main(String[] args)
    {
        String url = "http://www.espn.com/nba/scoreboard/_/date/20170225";
        try
        {
            Document document = Jsoup.connect(url)
                    .maxBodySize(0)
                    .userAgent("Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36")
                    .get();
            Elements games = document.select("section.sb-score");
            System.out.println(games.size());

            if (games.size() == 0)
                System.out.println("games size is 0");
            else
                System.out.println("games exist");

        } catch (Exception e)
        {
            e.printStackTrace();
        }
    }
}
如您所见,我已尝试将
maxBodySize
设置为0,允许任何文档下载大小,并将
userAgent
设置为0。两者都无法解决问题。当然,我也尝试过不使用这两个选项集,但这也不起作用


有人知道为什么会发生这种情况,以及我如何让它在控制台应用程序上工作吗?谢谢大家!

看起来它与
userAgent
字符串有关。为了让它在我的PC上运行,我不得不使用以下(Android UA)版本:
Mozilla/5.0(Linux;U;Android 4.0.3;ko-kr;LG-L160L Build/IML74K)AppleWebkit/534.30(KHTML,像Gecko)版本/4.0 Mobile Safari/534.30
看起来它与
用户代理
字符串有关。为了让它在我的PC上运行,我不得不使用以下(Android UA)版本:
Mozilla/5.0(Linux;U;Android 4.0.3;ko-kr;LG-L160L Build/IML74K)AppleWebkit/534.30(KHTML,像Gecko)版本/4.0 Mobile Safari/534.30

你应该记录你的应用程序在Android上发出的html请求(例如wireshark),然后您可以看到它发送的标题(以及内容,不要忘记您可以看到内容;-)。您还可以查看身份验证(请求时您是哪个用户)和cookies集,但很可能不是这些。这也可能是编码问题(通常是编码问题;-)。无论如何:wireshark。以编程方式,您可以使用普通url连接将文档作为字符串加载,并在终端上打印出来,以查看实际得到的内容。但我会使用wireshark,它更通用。@JohnSmith好的,谢谢。但我如何使用wireshark?我是通过手机浏览器访问它,还是将其集成到应用程序中?我不知道如何使用wireshark,因为我以前从未使用过它。你也尝试过在控制台应用程序中为移动版本设置userAgent吗?@FredericKlein我会怎么做?你应该记录你的应用程序在android上发出的html请求(例如wireshark),然后你可以看到它发送的标题(还有内容,别忘了你可以看到内容;-)。你也可以查看身份验证(请求时是哪个用户)和cookies集,但很可能不是这些。这也可能是编码问题(通常是编码问题;-)。无论如何:wireshark。以编程方式,您可以使用普通url连接将文档作为字符串加载,并在终端上打印出来,以查看实际得到的内容。但我会使用wireshark,它更通用。@JohnSmith好的,谢谢。但我如何使用wireshark?我是从手机浏览器访问它,还是将它集成到应用程序中?我不知道如何使用wireshark,因为我以前从未使用过它。你也尝试过在控制台应用程序中为移动版本设置userAgent吗?@FredericKlein我该怎么做?