在我的Android應用程序中,我在AsyncTask中獲取一些數據。它完美地工作,Jsoup正確地檢索整個文檔。但是,當我在Java控制檯應用程序中運行相同的Jsoup代碼時,它連接到ESPN網站,但沒有得到整個文檔,因爲games
對象始終爲空(大小始終爲0)。出於某種原因,在控制檯應用程序代碼document.select("section.sb-score");
沒有在html中找到此數據。但在Android中它確實。Jsoup獲取Android應用程序中的所有html數據,但不是Java控制檯應用程序
下面是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
。它們都不能修復它。當然,我也嘗試過沒有設置這兩個選項,但這也不起作用。
有誰知道爲什麼會發生這種情況,以及如何讓它在控制檯應用程序上工作?謝謝!
您應該記錄您的應用在android上發出的html請求(例如wireshark),然後您可以看到它發送的標頭(和內容,別忘了你可以看到內容;-)。您也可以查看身份驗證(請求時是哪個用戶)和Cookie設置,但它可能不是那些。這也可能是一個編碼問題(它通常是一個編碼問題;-)。無論如何:wireshark。 –
以編程方式,您可以使用普通的URL連接將文檔作爲字符串加載並在終端上打印出來,以查看您實際獲得的內容。但我會使用wireshark更通用。 –
@JohnSmith好的謝謝。但我如何使用wireshark?我是否可以通過手機上的瀏覽器訪問它,還是將它集成到應用程序中?我不知道如何使用wireshark,因爲我以前從未使用過。 –