如何抓取服务器端动态生成的页面

时间:2013-10-21 13:39:21

标签: java web-crawler

我需要抓取一些网站。问题是 - 我错了吗? - 大多数抓取工具只是浏览网站中的链接,但不抓取动态链接。换句话说,不会抓取从数据库生成的页面(即URL包含带有“?”的查询)。

您是否知道可以执行此工作的爬虫?我在这里搜索过,发现只有关于抓取javascript生成内容的答案,这不是我想要的。

BTW我使用Java。

2 个答案:

答案 0 :(得分:0)

当然可以抓取动态生成的网址。根据谷歌,他们能够扫描动态网址,因此技术肯定存在:http://googlewebmastercentral.blogspot.co.uk/2008/09/dynamic-urls-vs-static-urls.html

您可以通过动态网址的wget轻松验证这一点,即http://mysite.com/?page=2

但是,当您的抓取工具必须处理sessionID和Cookie以及在鼠标悬停或其他动态功能上显示内容的网页时,会出现复杂性。我可以想象一个像gmail或facebook这样的网站更难抓取,然后说维基百科。

实质上,如果您可以通过执行wget将页面下载到硬盘驱动器,也可以使用Java将页面保存到文本文件中,然后解析其中的字符串内容。

看看crawler4j,作为一个很好的起点。如果它太复杂,请编写自己的java代码来完成它。

import java.net.*;
import java.io.*;

public class URLReader {
    public static void main(String[] args) throws Exception {

        URL oracle = new URL("http://www.oracle.com/");
        BufferedReader in = new BufferedReader(
        new InputStreamReader(oracle.openStream()));

        String inputLine;
        while ((inputLine = in.readLine()) != null)
            System.out.println(inputLine);
        in.close();
    }
}

来自:http://docs.oracle.com/javase/tutorial/networking/urls/readingURL.html

然后可以使用java的字符串操作方法解析此页面(我倾向于更快地找到wget / sed / awk / perl)。

答案 1 :(得分:0)

我认为您误解了动态生成的含义。服务器端生成的任何内容在爬虫看到它时都不是动态的。其中包含?的网址并不特殊。您正在使用的抓取工具软件可能忽略了包含问号的网址的链接,但这可能只是为了避免无限地抓取网页。风险在于任何动态生成的内容可能没有有限数量的页面。当然,许多Web开发框架生成内容服务器端而根本不使用查询参数。此内容对任何抓取工具都是动态且透明的。同样,您仍然存在潜在地抓取无限动态生成的页面的问题,但是没有简单的方法来检测您是否正在爬行无限的站点。确定是否应该在动态生成的网站上继续抓取一组网页中的链接,这实际上等同于halting problem

现在,您明确表示您对抓取Javascript不感兴趣,但Javascript实际上是客户端的动态内容的唯一方式关心。