2014-07-02 128 views
2

我想解析一個網站,並從中獲取一些信息。問題是,當我在java中加載頁面並將其保存到文件中時,它不包含我需要的信息。當我點擊頁面上的查看源時,也沒有任何信息。但是,當我下載頁面(另存爲),並用記事本打開時,我可以找到我需要的內容。解析網頁

簡而言之,該網頁,該Java加載不同於我下載和打開記事本。

如何將頁面加載到字符串中,使其看起來與我在計算機上下載的頁面相同?

public static void main(String[] args) { 

    try { 
     String webPage = "http://www.integral-calculator.com/#"; 
     URL url = new URL(webPage); 
     URLConnection urlConnection = url.openConnection(); 
     InputStream is = urlConnection.getInputStream(); 
     InputStreamReader isr = new InputStreamReader(is); 

     int numCharsRead; 
     char[] charArray = new char[1024]; 
     StringBuffer sb = new StringBuffer(); 
     while ((numCharsRead = isr.read(charArray)) > 0) { 
      sb.append(charArray, 0, numCharsRead); 
     } 
     String result = sb.toString(); 

     PrintWriter out = new PrintWriter("C:\\Users\\Patryk\\Desktop\\filename.txt"); 
     out.println(result); 
     out.close(); 
    } catch (MalformedURLException e) { 
     e.printStackTrace(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 

回答

2

一旦瀏覽器加載了開始頁面,例如,它會嘗試加載和解析更多內容:CSS文件,Javascript文件,多媒體文件等等。然後,當事件被觸發時,所有的Javascript都會運行並且可能會加載更多的內容。

因此可以想象,網頁內容的大部分都是在第二步加載的。如果您只下載與URLConnection一樣的起始頁面,則只會在您的代碼段中執行此操作,您將只收到第一個沒有附加內容的啓動幀。

如果你仔細想想,你會發現一個簡單的URLConnection遠離瀏覽器的強大行爲。在URLConnection和瀏覽器之間有HTTPClient。對於所有這些級別,您會發現具有或多或少複雜行爲的Java庫,因此獲得更多或更少的內容。

在此以下螺紋的,在Apache的Java HTTPClient中提到:

Equivallent of .NET's WebClient and HttpWebRequest in Java?

而且在這個線程中,Java HTMLUnit被提及。它可以加載網站幾乎完全多的Javascript和解析的:

Apache HttpClient 4 And JavaScript

如果你會使用HTMLUnit,你會想方設法下載大部分的網頁,包括額外加載的內容。然後,您不會看到您或瀏覽器抓取的網頁之間的差異。

- 其他

一種方法搶網頁是涉及在殼執行wget命令。 wget可遞歸下載具有額外內容和文件結構的網站,並將它們存儲到磁盤。

只需打開一個shell並嘗試wget -E -H -k -K -p http://www.garfield.com。這將下載完整鏈接的哲學貓的內容。