-1

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

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

顺便说一句,我使用 Java。

4

2 回答 2

0

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

现在您明确表示您对抓取 Javascript不感兴趣,但就客户端而言,Javascript 确实是获取动态内容的唯一途径。

于 2014-12-04T06:27:55.970 回答
0

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

您可以通过对动态 url 执行 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)。

于 2013-10-21T13:48:22.873 回答