如何从主机下载所有文件

时间:2015-12-01 04:11:25

标签: java file url download webpage

我想从主机获取所有文件并使用Java代码将其传输到目录中,例如https://en.m.wikipedia.org/wiki/2006_ACC_Championship_Gamehttps://en.m.wikipedia.org/wiki/Bernice,_Californiahttps://en.m.wikipedia.org/wiki/TB10Cs5H3_snoRNA

然后我想从https://en.m.wikipedia.org或特别是https://en.m.wikipedia.org/wiki以及其后的所有文件下载所有内容。

我想我知道使用套接字,URL和端口执行此操作的方法,但是再次......

2 个答案:

答案 0 :(得分:0)

您可以使用api documentation。非常容易使用,例如:

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

Document doc = response.parse();
String html = doc.html(); //this contains the html in order

然后将包含string的{​​{1}}写入您想要的目录中的文件!

答案 1 :(得分:0)

维基百科API

您是否只想下载维基百科文章?如果您这样做,则可以使用Wikiepedia's API。我在问题here

上找到了它

一个简单示例 copy-pasted from the main page

此网址告诉英文维基百科的网页服务API向您发送主页内容:

  

https://en.wikipedia.org/w/api.php?action=query&titles=Main%20Page&prop=revisions&rvprop=content&format=json

使用任何编程语言为该URL发出HTTP GET请求(或者只是访问浏览器中的该链接),并且您将获得一个JSON文档,其中包含标题为&#34的页面的当前wiki标记。 ;主页"。将格式更改为jsonfm将返回"漂亮的打印" HTML结果很适合调试。

以下是jsonfm URL作为易于阅读的可点击链接。

  

api.php? action = query& titles = Main%20Page& prop = revisions& rvprop = content&格式= jsonfm

让我们选择该网址以显示其工作原理。

终端

  

https://en.wikipedia.org/w/api.php

这是端点。它就像MediaWiki Web服务API的主页。此网址是英语维基百科API的基本网址,就像https://en.wikipedia.org/wiki/是其网站的基本网址一样。

如果您正在编写程序以使用英语维基百科,则您构建的每个URL都将以此基本URL开头。如果您使用其他MediaWiki安装,则需要找到其端点并使用该端点。所有维基媒体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源代码中查找link rel="EditURI"并提取api.php URL;实际链接包含其他信息。例如,在这个维基上:

<link rel="EditURI" type="application/rsd+xml" href="//www.mediawiki.org/w/api.php?action=rsd" />

否则,在任何维基上找不到端点都没有安全的方法。如果你很幸运,那么index.php的完整路径不会被隐藏在奇怪的重写规则下,因此你只需要进行&#34;编辑&#34; (或历史)链接和替换in​​dex.php(等)与api.php,或者你将能够使用默认的脚本路径(如w / api.php)。

现在让我们转到URL的查询字符串中的参数。

格式

format=json

这告诉API我们希望以JSON格式返回数据。您可能还想尝试使用format = jsonfm来获取适合调试的结果的HTML版本。 API支持其他输出格式,如XML和本机PHP,但有计划删除不太流行的格式(phab:T95715),因此您可能不想使用它们。

行动

action=query

MediaWiki Web服务API实现了许多操作和扩展,实现了更多;动态生成的API帮助记录维基上的所有可用操作。在这种情况下,我们会使用&#34;查询&#34;获取一些信息的行动。 &#34;查询&#34;行动是API最重要的行动之一,它拥有自己的大量文档。以下只是一个例子的解释。

特定于行动的参数

titles=Main%20Page

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

prop=revisions

您可以请求有关页面的多种信息或属性。此参数告诉Web服务API我们需要有关页面特定修订的信息。由于我们没有指定任何修订信息,因此API将向我们提供有关最新修订的信息 - 维基百科的主页现在就是它。

rvprop=content

最后,此参数告诉Web服务API我们想要页面的最新版本的内容。如果我们改为传入rvprop = content | user,我们将获取最新的页面内容以及进行最新修订的用户的名称。

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

更多通用方法

这是一种更通用的方法。使用Jsoup来抓取HTML。

您必须找到一种方法来获取您想要抓取的所有网址。也许将它保存在String数组或List中。然后像这样迭代它:

for (String url : urls) {
    downloadAllFilesOnURL(url);
}

创建方法downloadAllFilesOnURL(String url)。这会将url作为String参数。然后使用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();

获取该网址上的所有链接,以便我们也可以访问它们。在这里,我们可以递归调用我们以前的方法downloadAllFilesOnURL(String url)。你是这样做的:

Elements anchorElements = doc.select("a");
for(Element anchor : anchorElements) {
    downloadAllFilesOnURL(anchor.attr("abs:href"));
}

对于图像和其他文件,逻辑是相同的。

Elements imageElements = doc.select("img");
for(Element image : imageElements) {
    downloadFile(image.attr("abs:src");
}

这里我们声明了一个方法downloadFile(String 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) {  }

这只是如何执行此操作的指南。如果我是指定执行此任务的人,那将是我的方法。

相关问题