鉴于link
,比如说,Java.sg/downloads
,我需要抓取它以查找各种zip文件并下载它们。是否有现有的apache commons library
来执行此任务?apache通用库,用于通过http s协议下载文件
0
A
回答
-1
0
我不知道是否有一个Apache库,但我使用htmlunit以抓取网页和所有它的子代码页如下。然后可以通过URLConnection完成下载,参见例如。 this page。
public static void walkAllHtmlPages(final String startURL) throws IOException, SAXException {
final WebClient webClient = createWebClient();
try {
final HtmlPage page = webClient.getPage(startURL);
try {
Set visitedURLs = new HashSet();
List links = page.getAnchors();
// now recursively walk all pages
recursivelyFollowLinks(webClient, links, visitedURLs);
} finally {
if(page != null) {
page.cleanUp();
}
}
} finally {
webClient.closeAllWindows();
}
}
public static WebClient createWebClient() {
final WebClient webClient = new WebClient(BrowserVersion.FIREFOX_3_6);
webClient.setTimeout(30000);
webClient.setJavaScriptEnabled(false);
webClient.setCssEnabled(true);
webClient.setAppletEnabled(true);
webClient.setRedirectEnabled(true); // follow old-school HTTP 302 redirects - standard behaviour
webClient.setHTMLParserListener(null);
webClient.setIncorrectnessListener(new IncorrectnessListener() {
@Override
public void notify(String message, Object origin) {
// Swallow for now, but maybe collect it for optional retrieval?
}
});
webClient.setCssErrorHandler(new SilentCssErrorHandler());
return webClient;
}
private static void recursivelyFollowLinks(WebClient webClient, List links, Set visitedURLs) throws SAXException, IOException {
try {
for(HtmlAnchor link : links) {
String url = link.getHrefAttribute();
if (!visitedURLs.contains(url)) {
visitedURLs.add(url);
visitSubLink(webClient, visitedURLs, link, url);
}
}
} catch (RuntimeException e) {
throw new IllegalArgumentException("While retrieving links: " + getLinksAsString(links), e);
}
}
private static void visitSubLink(WebClient webClient,
Set visitedURLs, HtmlAnchor link, String url) throws IOException, SAXException {
URL current = link.getPage().getUrl();
try {
HtmlPage ret = (HtmlPage)link.click();
List sublinks = ret.getAnchors();
recursivelyFollowLinks(webClient, sublinks, visitedURLs);
} catch (RuntimeException e) { // NOPMD
throw new RuntimeException("While clicking link: " + link.getId() + " to " + url, e);
}
}
相关问题
- 1. 通过HTTPS协议从FTPS文件夹下载文件
- 2. 哪个协议通过Apache与数据库通信?
- 3. 从iPhone通过FTP协议上传/下载文件
- 4. 使用ffmpeg库通过http协议编码视频流
- 5. Apache Tomcat将使用非阻塞http协议关闭文件下载连接
- 6. 通过Apache和Tomcat的WebSockets:AJP协议不支持HTTP升级
- 7. 通过非HTTP协议的SOAP
- 8. 通过http寻找API /协议
- 9. 在Loadrunner中通过http协议的java
- 10. 通过HTTP协议抓取VLC帧
- 11. 通过HTTP的二进制协议
- 12. FTP通过HTTP的协议规范
- 13. 通过http-auth下载文件
- 14. 通过Net :: HTTP下载压缩文件
- 15. 通过HTTP从Gerrit下载文件夹
- 16. 用于从文件服务器下载文件的协议
- 17. Swift协议专用通用协议
- 18. 使用哪种协议从Rapid share Http或FTP下载文件?
- 19. 使用http协议,java和javascript下载大文件> 1GB
- 20. 通过http加载文件
- 21. 使用Javascript通过HTTP协议以外的协议连接服务器
- 22. 如何正确地通过python-urllib2通过HTTP下载文件?
- 23. 如何测试HTML是从文件系统加载还是通过http协议
- 24. 如何使通过http协议浏览SVN仓库
- 25. 用于渐进式下载的RTSP或HTTP协议
- 26. 具有通用协议类型变量的通用协议
- 27. 如何用c语言通过tcp以http协议发送html文件?
- 28. 通过Apache比使用PHP读取文件更慢的下载
- 29. 使用Apache CXF通过Web服务下载文件
- 30. 使用HTTP协议通过TCP套接字获取图像
为什么downvote? Wget可以单独使用或从Java中调用,它包含了一个强大的,经过测试的软件包中的所有必需的功能。 – dotancohen 2012-03-01 10:08:23