Java 解析网页

Java 解析网页,java,html,css,Java,Html,Css,我想解析一个网站,并从中获得一些信息。问题是,当我用java加载页面并将其保存到文件中时,它不包含我需要的信息。当我单击页面上的“查看源”时,也没有任何信息。然而,当我下载页面(另存为)并用记事本打开它时,我就能找到我需要的东西 简言之,java加载的网页与我下载并用记事本打开的网页不同 如何将页面加载到字符串中,使其看起来与我在计算机上下载的页面相同 public static void main(String[] args) { try { String webPa

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

一旦浏览器加载了起始页,例如
index.html
,它将尝试加载和解析更多内容:CSS文件、Javascript文件、多媒体文件等。然后,随着事件的触发,所有Javascript都将运行,并可能加载更多的内容

因此,可以想象,大部分网页内容都是在第二步加载的。如果像在代码段中那样只下载带有
URLConnection
的起始页,则只会收到第一个启动帧,而不包含其他内容

如果你仔细想想,你就会意识到一个简单的
URLConnection
与浏览器的强大功能相去甚远。在
URLConnection
和浏览器之间是
HTTPClient
。对于所有这些级别,您会发现Java库的行为或多或少都比较复杂,因此会获得更多或更少的内容

在下面的线程中,提到了Apache Java
HTTPClient

在这个线程中,提到了Java
HTMLUnit
。它可以几乎完全加载网站,也可以解析大量Javascript:

如果您使用
HTMLUnit
,您会找到下载大部分网页的方法,包括额外加载的内容。这样,你就看不出你抓取的网页和浏览器抓取的网页有多大区别了

--

另一种抓取网页的方法是在shell执行中使用
wget
命令
wget
可以递归地下载包含其他内容和文件结构的网站,并将其存储到磁盘中

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