解析网页

时间:2014-07-02 18:19:03

标签: java html css

我想解析一个网站并从中获取一些信息。问题是,当我在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();
    }
}

1 个答案:

答案 0 :(得分:2)

一旦浏览器加载了起始页面,例如index.html,它将尝试加载和解析更多内容: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命令包含在shell执行中。 wget可以递归下载包含其他内容和文件结构的网站,并将它们存储到磁盘中。

只需打开一个shell并尝试wget -E -H -k -K -p http://www.garfield.com。这将下载完整链接的哲学猫的内容。