Java 如何从主机下载所有文件

Java 如何从主机下载所有文件,java,file,url,download,webpage,Java,File,Url,Download,Webpage,我想从主机获取所有文件,并使用Java代码将其传输到一个目录中,例如 然后我想下载所有的东西,或者特别是它之后的所有文件 我想我知道用套接字、URL和端口来实现这一点的方法,但话说回来……您可以使用它。非常易于使用,例如: Connection.Response response = Jsoup.connect(url).method(Method.GET).execute(); Document doc = response.parse(); String html = doc.html()

我想从主机获取所有文件,并使用Java代码将其传输到一个目录中,例如

然后我想下载所有的东西,或者特别是它之后的所有文件

我想我知道用套接字、URL和端口来实现这一点的方法,但话说回来……

您可以使用它。非常易于使用,例如:

Connection.Response response = Jsoup.connect(url).method(Method.GET).execute();

Document doc = response.parse();
String html = doc.html(); //this contains the html in order
然后将包含
html
字符串
写入所需目录中的文件

维基百科API 你只是想下载维基百科的文章吗?如果你这样做了,你就可以使用它。我是在一个问题上发现的

一个简单的例子

此URL告诉英语维基百科的web服务API向您发送主页的内容:

使用任何编程语言对该URL发出HTTP GET请求(或者只访问浏览器中的链接),您将获得一个JSON文档,其中包含标题为“主页”的页面的当前wiki标记。将格式更改为jsonfm将返回一个“打印精美”的HTML结果,便于调试

以下是jsonfm URL,它是一个易于阅读的可点击链接

api.php?操作=查询和标题=主页%20页&prop=修订&rvprop=内容和格式=jsonfm

让我们把这个URL分开来展示它是如何工作的

端点

format=json

这就是终点。它就像MediaWiki web服务API的主页。这个URL是英文维基百科API的基本URL,就像它的网站的基本URL一样

如果您正在编写一个使用英文维基百科的程序,那么您构建的每个URL都将以这个基本URL开头。如果您使用的是不同的MediaWiki安装,则需要找到其端点并使用该端点。所有Wikimedia Wiki都有遵循以下模式的端点:

https://en.wikipedia.org/w/api.php      # English Wikipedia API
https://nl.wikipedia.org/w/api.php      # Dutch Wikipedia API
https://commons.wikimedia.org/w/api.php # Wikimedia Commons API
自r75621以来,我们对端点进行了RSD发现:在任何页面的HTML源代码中查找
链接rel=“EditURI”
,并提取
api.php
URL;实际链接包含其他信息。例如,在这个wiki上:

<link rel="EditURI" type="application/rsd+xml" href="//www.mediawiki.org/w/api.php?action=rsd" />
这告诉API我们希望以JSON格式返回数据。您可能还希望尝试format=jsonfm,以获得有利于调试的结果的HTML版本。API支持其他输出格式,如XML和本机PHP,但计划删除不太流行的格式(phab:T95715),因此您可能不想使用它们

行动

action=query
MediaWiki web服务API实现了几十个操作,扩展实现了更多操作;动态生成的API帮助记录wiki上的所有可用操作。在本例中,我们使用“查询”操作来获取一些信息。“查询”操作是API最重要的操作之一,它有自己丰富的文档。下面只是一个例子的解释

特定于动作的参数

titles=Main%20Page
示例URL的其余部分包含“查询”操作使用的参数。在这里,我们告诉web服务API,我们需要有关称为“主页”的Wiki页面的信息。(20来自对空间进行百分比编码。)如果需要查询多个页面,请将它们全部放在一个请求中以优化网络和服务器资源:titles=PageA | PageB | PageC。有关详细信息,请参阅查询文档

prop=revisions
您可以请求有关页面的多种信息或属性。此参数告诉web服务API我们需要关于页面特定修订的信息。由于我们没有指定任何修订信息,API将为我们提供有关最新修订的信息——目前的维基百科主页

rvprop=content
最后,这个参数告诉web服务API我们需要页面最新版本的内容。如果我们传入rvprop=content | user,我们将得到最新的页面内容和做出最新修订的用户的姓名

同样,这只是一个例子。这里更详细地解释了查询,API参考列出了所有可能的操作、rvprop的所有可能值,等等

更通用的方法 这是一种更通用的方法。用于清除html

你必须找到一种方法来获取所有你想要抓取的URL。可能将其保存在字符串数组或列表中。然后像这样迭代:

for (String url : urls) {
    downloadAllFilesOnURL(url);
}
Elements anchorElements = doc.select("a");
for(Element anchor : anchorElements) {
    downloadAllFilesOnURL(anchor.attr("abs:href"));
}
创建一个方法
下载所有文件url(字符串url)
。这接受url作为字符串参数。然后使用JSoup连接到它

Document doc = Jsoup.connect(url).timeout(60 * 1000)//60 seconds
                    .userAgent("Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_2) "
                    + "AppleWebKit/537.36 (KHTML, like Gecko) "
                    + "Chrome/33.0.1750.152 Safari/537.36").get();
然后,将
doc
对象写入文件

PrintWriter pen = new PrintWriter(<somefilehere>);
pen.println(doc.toString());
pen.close();
至于图像和其他文件,逻辑是相同的

Elements imageElements = doc.select("img");
for(Element image : imageElements) {
    downloadFile(image.attr("abs:src");
}
这里我们声明了一个方法
downloadFile(stringurl)
。此方法从url下载文件,如
http://media.example.com/ariticleA/image2.png

Connection.Response response = Jsoup.connect(url).timeout(60 * 1000)
                    .userAgent("Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_2) "
                    + "AppleWebKit/537.36 (KHTML, like Gecko) "
                    + "Chrome/33.0.1750.152 Safari/537.36").ignoreContentType(true)
                    .execute();

byte[] bytes = response.bodyAsBytes();

//this is how you write the file
try (FileOutputStream outputStream = new FileOutputStream(<somefilehere>)) {
        outputStream.write(bytes);
} catch (Exception e) {  }
Connection.Response=Jsoup.connect(url).超时(60*1000)
.userAgent(“Mozilla/5.0(Macintosh;英特尔Mac OS X 10_9_2)”
+“AppleWebKit/537.36(KHTML,像壁虎一样)”
+“Chrome/33.0.1750.152 Safari/537.36”)。ignoreContentType(真)
.execute();
byte[]bytes=response.bodyAsBytes();
//这就是您编写文件的方式
try(FileOutputStream outputStream=newfileoutputstream()){
outputStream.write(字节);
}捕获(例外e){}

这只是一个如何做到这一点的指南。如果我是负责完成此任务的人,这将是我的方法。

是否要删除
html
?是的,但我希望所有下载的文件与网站上的文件位于同一个组织中。出于安全原因,我认为您无法下载所有文件。你可以把他们所有的公开文件都删掉。是的,这就是我的意思。所有的都是公共的。