Jsoup在Android应用程序上获取所有html数据,但不在Java控制台应用程序上获取
在我的Android应用程序中,我正在异步任务中抓取一些数据。它工作正常,Jsoup可以正确地检索整个文档。但是,当我在Java控制台应用程序中运行相同的Jsoup代码时,它会连接到ESPN网站,但无法获取整个文档,因为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
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我该怎么做?