有可能获得所有可能的网址吗?

Rya*_*axe 3 python url function

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

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.
Run Code Online (Sandbox Code Playgroud)

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

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

我花了几个小时研究,到目前为止这似乎是不可能的!所以我错过了一些可以做到这一点的模块吗?是否存在但不存在于python中?如果是这样,用什么语言?

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

我希望能够为可接受的URL添加限制.例如,restrictions='first'可以使它只与一个存在的页面'/'.这是一个例子:

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

我不需要继续解释限制的想法,但你理解它的必要性!有些网站,特别是社交网络,有一些疯狂的添加图片和除草这些是重要的,同时保持原始页面包含所有的照片.

所以,是的,我绝对没有这个代码,但那是因为我不知道该怎么做!但我想我已经明确了我需要做什么,所以,这可能吗?如果有,怎么样?如果不是,为什么不呢?

编辑:

所以经过一些答案和评论后,这里有更多信息.我希望获得一个网址,不一定是域名,并返回一个字典,其中包含原始网址作为密钥,以及该网址的所有扩展名列表作为项目.这是我之前的一个例子'example.com':

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

爬行的例子和美丽的汤很棒,但如果有一些网址没有直接链接在任何页面上,那么我找不到它.是的,这通常不是问题,但我希望能够!

dim*_*414 8

我将您的问题解释为"给定一个网址,在"该网址"下方找到存在的网址集". - 如果这不正确,请更新您的问题,这不是很清楚.

这是不可能发现一整套域上有效的路径,你唯一的选择是从字面上遍历每一个有效的字符,例如/,/a,/b,/c,... /aa,...,参观这些URL来确定服务器是否返回200.我希望很明显这根本不可行.

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

你究竟要解决什么问题?爬行整个网站可能不是正确的方法,也许如果你解释一下你的最终目标,我们可以帮助确定一个比你现在想象的更好的行动方案.


根本问题是对URL的"扩展"不一定有任何明确的含义.如果我运行一个网站(我的网站是否住在http://example.com,http://subdomain.example.comhttp://example.com/page/无所谓)我可以平凡配置我的服务器,以成功向你扔在它的任何要求作出回应.它可以像说"每个http://example.com/page/.*返回请求"一样简单,Hello World.突然间我有无限数量的有效页面.Web服务器和URL类似,但从根本上说与硬盘驱动器和文件不同.与拥有有限数量文件的硬盘驱动器不同,网站可以说"是的,存在路径!" 尽可能多的请求.这使得"所有可能的"URL无法实现.

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

所以长话短说:不,不可能得到所有的URL,甚至是它们的一部分,因为理论上它们可能是无数的,你无法知道是否是这种情况.


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

我理解你为什么这么想,但不幸的是,事实并非如此.考虑像正则表达式这样的URL.有多少个字符串匹配正则表达式.*?无数,对吧?怎么样/path/.*?减?还是/path/that/is/long/and/explicit/.*?虽然看起来很直观,但实际上与最后一种情况相比,实际上没有与第一种情况相匹配的URL.

既然如此,我对这一点的回答是关于一般情况,因为这就是你提出问题的方式.如果您明确定义和限制搜索空间,或放宽问题的要求,您可以得到答案.假设您改为说"是否可以获取此页面上列出的所有网址并匹配我的过滤器?" 绝对是答案是肯定的.在某些情况下(例如Apache的目录列表行为),这恰好与原始问题的答案相同.然而,没有办法保证这实际上是正确的 - 我可以很容易地拥有一个目录列表,其中包含仍与您的模式匹配的秘密,不公开的URL,您将找不到它们.