2017-02-18 50 views
0

在我的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。它們都不能修復它。當然,我也嘗試過沒有設置這兩個選項,但這也不起作用。

有誰知道爲什麼會發生這種情況,以及如何讓它在控制檯應用程序上工作?謝謝!

+0

您應該記錄您的應用在android上發出的html請求(例如wireshark),然後您可以看到它發送的標頭(和內容,別忘了你可以看到內容;-)。您也可以查看身份驗證(請求時是哪個用戶)和Cookie設置,但它可能不是那些。這也可能是一個編碼問題(它通常是一個編碼問題;-)。無論如何:wireshark。 –

+0

以編程方式,您可以使用普通的URL連接將文檔作爲字符串加載並在終端上打印出來,以查看您實際獲得的內容。但我會使用wireshark更通用。 –

+0

@JohnSmith好的謝謝。但我如何使用wireshark?我是否可以通過手機上的瀏覽器訪問它,還是將它集成到應用程序中?我不知道如何使用wireshark,因爲我以前從未使用過。 –

回答

2

看起來像是與userAgent字符串有關。我必須使用以下(Android UA)才能使其從我的PC上運行:Mozilla/5.0 (Linux; U; Android 4.0.3; ko-kr; LG-L160L Build/IML74K) AppleWebkit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30

+0

這工作!謝謝 :] –

相關問題