我想从主机获取所有文件并使用Java代码将其传输到目录中,例如https://en.m.wikipedia.org/wiki/2006_ACC_Championship_Game,https://en.m.wikipedia.org/wiki/Bernice,_California,https://en.m.wikipedia.org/wiki/TB10Cs5H3_snoRNA。
然后我想从https://en.m.wikipedia.org或特别是https://en.m.wikipedia.org/wiki以及其后的所有文件下载所有内容。
我想我知道使用套接字,URL和端口执行此操作的方法,但是再次......
答案 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)
您是否只想下载维基百科文章?如果您这样做,则可以使用Wikiepedia's API。我在问题here
上找到了它一个简单示例 copy-pasted from the main page
此网址告诉英文维基百科的网页服务API向您发送主页内容:
使用任何编程语言为该URL发出HTTP GET请求(或者只是访问浏览器中的该链接),并且您将获得一个JSON文档,其中包含标题为&#34的页面的当前wiki标记。 ;主页"。将格式更改为jsonfm将返回"漂亮的打印" HTML结果很适合调试。
以下是jsonfm URL作为易于阅读的可点击链接。
api.php? action = query& titles = Main%20Page& prop = revisions& rvprop = content&格式= jsonfm
让我们选择该网址以显示其工作原理。
终端
这是端点。它就像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; (或历史)链接和替换index.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) { }
这只是如何执行此操作的指南。如果我是指定执行此任务的人,那将是我的方法。