如何在动态链接创建网站爬虫时停止无限循环?

时间:2014-05-02 14:43:50

标签: python url web-crawler

我正在做一个创建Crawler的小项目,它将以最大可能的深度提取网站上的所有链接:

我已展示以下代码的一部分,我用它来避免错误的链接或将抓取工具带到目标网站之外的链接。

代码段:

            # block all things that can't be urls
            if url[0:4]!="http" and url[0:4]!="https" and url[0:1]!='/':
                continue

            # block all links going away from website
            if url[0:len(seed)]!=seed and (url[0:4]=='http'or url[0:4]=="https"):
                continue

            if "php" in url.split('/')[1]:
                url = seed + url

我面临的问题是我遇到了一个链接:

http://www.msit.in/index.php/component/jevents/day.listevents/二〇一五年十月十三日/ - ?ITEMID = 1

这个链接不断产生无限的结果,我突出显示的链接部分显示了日期。

现在当Crawler抓取此链接时,它会进入无限循环,如下所示。我在网站上查了2050/10/13的链接,这意味着需要很长时间。

少量输出序列:

http://www.msit.in/index.php/component/jevents/day.listevents/2015/04/13/-?Itemid=1 http://www.msit.in/index.php/component/jevents/day.listevents/2015/05/13/-?Itemid=1 http://www.msit.in/index.php/component/jevents/day.listevents/2015/06/13/-?Itemid=1 http://www.msit.in/index.php/component/jevents/day.listevents/2015/07/13/-?Itemid=1 http://www.msit.in/index.php/component/jevents/day.listevents/2015/08/13/-?Itemid=1 http://www.msit.in/index.php/component/jevents/day.listevents/2015/09/13/-?Itemid=1 http://www.msit.in/index.php/component/jevents/day.listevents/2015/10/13/-?Itemid=1 http://www.msit.in/index.php/component/jevents/day.listevents/2015/11/13/-?Itemid=1 http://www.msit.in/index.php/component/jevents/day.listevents/2015/11/14/-?Itemid=1 http://www.msit.in/index.php/component/jevents/day.listevents/2015/11/15/-?Itemid=1 http://www.msit.in/index.php/component/jevents/day.listevents/2015/11/16/-?Itemid=1 http://www.msit.in/index.php/component/jevents/day.listevents/2015/11/17/-?Itemid=1 http://www.msit.in/index.php/component/jevents/day.listevents/2015/11/18/-?Itemid=1 http://www.msit.in/index.php/component/jevents/day.listevents/2015/11/19/-?Itemid=1 http://www.msit.in/index.php/component/jevents/day.listevents/2015/11/20/-?Itemid=1 http://www.msit.in/index.php/component/jevents/day.listevents/2015/11/21/-?Itemid=1

我的问题:

我的问题是如何避免这个问题?

2 个答案:

答案 0 :(得分:0)

如果您专门为此网站编写项目,则可以通过比较URL中的日期来尝试查明链接是否与过去的事件不同。但是,这很可能会产生特定于站点的代码,如果这个项目需要更加通用,则可能不是一个选项。

如果这对您不起作用,您可以添加更多信息(这个项目是什么,有时间限制等)。

编辑 - 我错过了关于动态链接的部分,所以这不是一个有限集,所以我的答案的第一部分没有适用

答案 1 :(得分:0)

如果站点的内容存储在数据库中并被拉出以在页面上按需显示,则可以使用动态URL。在这种情况下,该网站基本上用作内容的模板。通常,动态网址如下所示:http://code.google.com/p/google-checkout-php-sample-code/issues/detail ?id = 31

您可以通过查找以下字符来查看动态网址? =& 。动态URL的缺点是不同的URL可以具有相同的内容。因此,不同的用户可能链接到具有相同内容的不同参数的URL。这就是为什么网站管理员有时想要将其URL重写为静态网址的原因之一。