【问题标题】:is it possible to get all possible urls?是否可以获得所有可能的网址?
【发布时间】:2013-05-24 04:58:29
【问题描述】:

我正在尝试编写如下函数:

def get_urls(*urls,restrictions=None):
    #here there should be some code that
    #iterates through the urls and create
    #a dictionary where the keys are the 
    #respective urls and their values are
    #a list of the possible extentions. The
    #function should return that dictionary.

首先,解释一下。如果我有一个网站:www.example.com,并且它只有以下页面:www.example.com/faq、www.example.com/history 和 www.example.com/第2页。这将是应用程序:

In[1]: site = 'http://example.com'
In[2]: get_urls(site)
Out[2]: {'http://example.com':['/faq','/history','/page/2']}

我花了几个小时研究,到目前为止这似乎是不可能的!那么我是否缺少一些可以做到这一点的模块?有没有一个存在但在 python 中不存在的?如果有,是什么语言?

现在你可能想知道为什么会有restrictions=None,这就是为什么:

我希望能够对可接受的 url 添加限制。例如restrictions='first' 可以使它只处理存在一个'/' 的页面。这是一个例子:

In[3]: get_urls(site,restrictions='first')
Out[3]: {'http://example.com':['/faq','/history']}

我不需要继续解释限制的想法,但你明白它的必要性!一些网站,尤其是社交网络,有一些疯狂的图片插件,在保留包含所有照片的原始页面的同时清除这些插件很重要。

所以是的,我完全没有代码,但那是因为我不知道该怎么做!但我想我已经清楚自己需要能够做什么,所以,这可能吗?如果是,如何?如果没有,为什么不呢?

编辑:

所以在一些答案和 cmets 之后,这里有更多信息。我想获得一个 url,不一定是域,并返回一个字典,其中原始 url 作为键,该 url 的所有扩展名的列表作为项目。这是我之前的'example.com'的例子:

In[4]: site = 'http://example.com/page'
In[5]: get_urls(site)
Out[5]: {'http://example.com/page':['/2']}

爬取的例子和漂亮的汤很棒,但是如果有一些没有直接链接到任何页面上的url,那我就找不到了。是的,这通常不是问题,但我希望能够!

【问题讨论】:

  • 除非该网站具有易于解析的站点地图,否则您可能需要抓取它。
  • “一切皆有可能”有多宽泛?该页面上的所有链接?整个网站的所有链接?到目前为止,您尝试过什么?
  • @Blender:我没有真正尝试过任何东西,因为我无法为此找到一个库。看到我不知道如何获取给定站点上的所有 url,我想知道哪个模块能够做到这一点。一切皆有可能,但函数中会有一个restrictions 部分,所以它只做一些。
  • 通常不可能获取给定站点上的所有 URL。不是因为 Python 的某些缺陷,而是因为 HTTP 协议不允许这样做。
  • 所以没有办法访问它?有什么文章可以解释原因吗?

标签: python function url


【解决方案1】:

我将您的问题解释为“给定一个 URL,找到该 URL “下方”存在的 URL 集。 - 如果不正确,请更新您的问题,不是很清楚。

不可能发现域上的整个有效路径集,您唯一的选择是逐字逐句遍历每个有效字符,例如/, /a, /b, /c, ..., /aa, .... 并访问每个 URL 以确定服务器是否返回 200。我希望很明显这根本不可行。

有可能(尽管有一些警告,并且网站所有者可能不喜欢它/阻止您)通过访问一组预定义的页面、从页面中抓取所有链接、依次跟随这些链接来抓取域,并重复。这基本上就是谷歌所做的。这将为您提供一组域上的“可发现”路径,这些路径或多或少是完整的,具体取决于您抓取多长时间以及您在其页面中查找 URL 的力度。虽然更可行,但这仍然会很慢,并且不会为您提供“所有”网址。

您到底想解决什么问题?爬取整个网站可能不是正确的做法,也许如果您多解释一下您的最终目标,我们可以帮助您确定比您目前想象的更好的行动方案。


根本问题是 URL 的“扩展”不一定有任何明确的含义。如果我运行一个网站(无论我的网站位于http://example.comhttp://subdomain.example.com 还是http://example.com/page/ 都无关紧要),我可以简单地配置我的服务器以成功响应您向它提出的任何请求。就像说“对http://example.com/page/.* 的每个请求都返回Hello World.”一样简单,突然之间我就有了无限数量的有效页面。 Web 服务器和 URL 相似,但从根本上与硬盘驱动器和文件不同。与保存有限数量文件的硬盘驱动器不同,网站可以说“是的,该路径存在!”尽可能多的请求。这使得获取“所有可能的”URL 成为不可能。

除此之外,网络服务器通常不希望您能够找到所有有效页面 - 也许只有在您登录后或在一天中的特定时间才能访问它们,或者来自中国的请求 - 不要求 URL 始终存在,或者网络服务器告诉您它存在。我可以很容易地将我的无限 URL 行为置于http://example.com/secret/path/no/one/knows/about/.* 之下,除非我告诉你(或者你手动爬取了所有可能的 URL……),否则你永远不会知道它的存在。

长话短说:不,不可能获取所有 URL,甚至是其中的一个子集,因为理论上它们的数量可能是无限的,而您无法知道这是否是案例。


如果我可以添加限制,那就更容易了!

我理解你为什么这么想,但不幸的是这不是真的。想想像正则表达式这样的 URL。有多少字符串匹配正则表达式.*?一个无限的数字,对吧? /path/.* 怎么样?较少的?还是/path/that/is/long/and/explicit/.*?尽管看起来与直觉相反,there are actually no fewer URLs that match the last case than the first

话虽如此,到目前为止,我的回答都是关于一般情况,因为这就是您提出问题的方式。如果你明确定义和限制搜索空间,或者放宽问题的要求,你就能得到答案。假设您改为说“是否可以获取此页面上列出的所有 URL 并匹配我的过滤器?”那么答案是肯定的。在某些情况下(例如Apache's Directory Listing 行为),这将巧合与您原始问题的答案相同。但是,无法保证这实际上是真的 - 我可以很容易地拥有一个目录列表,其中包含仍然与您的模式匹配的秘密、未列出的 URL,而您不会找到它们。

【讨论】:

  • 我添加了一个编辑以使其更清晰!至于我要解决的问题,目前还没有,这只是我想做的事情
  • 无论您想要域上所有 URL 的列表还是仅在域的子路径中,问题(以及问题空间,即可能的 URL 的数量)都不会得到不幸的是,这更容易。
  • 对,但如果我可以添加限制,那就更容易了!由于您所指出的,很少有不受限制地运行这样的事情。
  • @RyanSaxe,请参阅我的其他编辑。恐怕您提出的问题的答案仍然是“否”。如果你放宽要求(例如,“get some”而不是“get all”)答案会改变,但“get all”是不可能的。
  • 这正是我想要的!是的,我知道可以获取页面上的所有链接以及那些页面上符合许多库限制的所有链接,但是您给出了一个有效的解释,说明为什么我找不到模式将停止的其他 url 和 garentee!
【解决方案2】:

这个question 有一个很好的答案。本质上,您是在问为什么需要爬虫而不是所有目录的列表。 Wikipedia 解释说,“基本前提是一些网站有大量的动态页面,这些页面只能通过使用表单和用户条目来获得。”

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-11-11
    • 2012-07-12
    • 1970-01-01
    • 2010-10-08
    • 2011-12-10
    • 2020-01-13
    • 2019-02-12
    • 1970-01-01
    相关资源
    最近更新 更多