2014-07-02 95 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。这将下载完整链接的哲学猫的内容。