我正在做一个创建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
我的问题:
我的问题是如何避免这个问题?
答案 0 :(得分:0)
如果您专门为此网站编写项目,则可以通过比较URL中的日期来尝试查明链接是否与过去的事件不同。但是,这很可能会产生特定于站点的代码,如果这个项目需要更加通用,则可能不是一个选项。
如果这对您不起作用,您可以添加更多信息(这个项目是什么,有时间限制等)。
编辑 - 我错过了关于动态链接的部分,所以这不是一个有限集,所以我的答案的第一部分没有适用
答案 1 :(得分:0)
如果站点的内容存储在数据库中并被拉出以在页面上按需显示,则可以使用动态URL。在这种情况下,该网站基本上用作内容的模板。通常,动态网址如下所示:http://code.google.com/p/google-checkout-php-sample-code/issues/detail ?id = 31 。
您可以通过查找以下字符来查看动态网址:? =& 。动态URL的缺点是不同的URL可以具有相同的内容。因此,不同的用户可能链接到具有相同内容的不同参数的URL。这就是为什么网站管理员有时想要将其URL重写为静态网址的原因之一。