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)
爬行的例子和美丽的汤很棒,但如果有一些网址没有直接链接在任何页面上,那么我找不到它.是的,这通常不是问题,但我希望能够!
我将您的问题解释为"给定一个网址,在"该网址"下方找到存在的网址集". - 如果这不正确,请更新您的问题,这不是很清楚.
这是不可能发现一整套域上有效的路径,你唯一的选择是从字面上遍历每一个有效的字符,例如/
,/a
,/b
,/c
,... /aa
,...,参观这些URL来确定服务器是否返回200.我希望很明显这根本不可行.
通过访问预定义的页面集,抓取页面中的所有链接,依次跟踪这些链接并重复,可以(尽管有警告,网站所有者可能不喜欢它/阻止您)抓取域名.这基本上就是谷歌所做的.这将为您提供一组域上的"可发现"路径,这些路径或多或少会完整,具体取决于您抓取的时长以及您在其网页中查找网址的频率.虽然更可行,但这仍然会很慢,并且不会为您提供"所有"网址.
你究竟要解决什么问题?爬行整个网站可能不是正确的方法,也许如果你解释一下你的最终目标,我们可以帮助确定一个比你现在想象的更好的行动方案.
根本问题是对URL的"扩展"不一定有任何明确的含义.如果我运行一个网站(我的网站是否住在http://example.com
,http://subdomain.example.com
或http://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,您将找不到它们.
归档时间: |
|
查看次数: |
4940 次 |
最近记录: |