在问我的问题之前(这基本上就是标题所说的)我想提供一些背景知识,以便更好地了解我的情况。
我正在用Java编写一个小应用程序,主要用于学术目的,但也考虑了一个非常具体的任务。此应用程序的作用基本上是从基本URL开始构建URL层次结构,稍后可以组织链接并对其执行某些操作。
想象一下以下网址:
http://www.example.com
http://www.example.com/sub001
http://www.example.com/sub002
http://www.example.com/sub002/ultrasub
我希望我的程序在提供基本网址http://www.example.com
(或http://www.example.com/
)时检索此层次结构。
在我的代码中,我有一个能够编码URL的类,我已经想到了一种验证它们的方法,我找不到找到基本URL下面的URL层次结构的方法。
是否有直接的方法,或者我只需要从基本URL下载文件并从文件中存在的相对和绝对链接开始构建层次结构?
我不是要求特定的代码,只是(有点)完整的解释我可以采取什么方式来做这件事,可能会有一些骨架代码来指导我。
此外,我将网址存储在TreeMap<URL,Boolean>
结构中,如果已经分析了URL,则Boolean
表示。我在Java 7 API规范中快速浏览后选择了这个结构,但是你是否建议任何更适合这个特定目的的结构?
提前致谢:)
答案 0 :(得分:1)
HTTP协议中无法请求给定URL下“所有”的所有URL。你运气不好。
某些协议(例如ftp:// ...)确实有明确的机制.....
如果您请求“目录”,某些HTTP服务器将打印索引页面,但不推荐这种做法,并且没有多少服务器会这样做。
最重要的是,您必须遵循链接以确定服务器层次结构是什么,即使这样,您也可能找不到指向层次结构所有区域的链接。
编辑:我应该补充一点,作为一个表现良好的网民,你应该遵守你访问的任何服务器上的robots.txt文件....
EDIT2 :(评论FTP机制后)
FTP协议有许多命令:See this wiki list。其中一个命令是:NLIST
“返回指定目录中的文件名列表”。
URL specification为FTP协议URL的URL格式提供了特殊规定,并在3.2.2节中提供:
FTP URL的url-path具有以下语法:
<cwd1>/<cwd2>/.../<cwdN>/<name>;type=<typecode>
...
如果类型代码为“d”,请执行带有参数的NLST(名称列表)命令,并将结果解释为文件目录列表。
当我从命令行(而不是浏览器)尝试此操作时,我可以看到效果:
rolf@home ~ $ curl 'ftp://sunsite.unc.edu/README'
Welcome to ftp.ibiblio.org, the public ftp server of ibiblio.org. We
hope you find what you're looking for.
If you have any problems or questions, please see
http://www.ibiblio.org/help/
Thanks!
和type=d
我得到了:
rolfl@home ~ $ curl 'ftp://sunsite.unc.edu/README;type=d'
HEADER.images
incoming
HEADER.html
pub
unc
README