事件起因
叶总在安装个开源软件,但是包依赖太麻烦,于是想把依赖的rpm包都给下载下来,但是找到的下载链接,只有http的,没有提供ftp方式,问我有什么方式可以搞下来,想了想,用公司的linux服务器貌似连不了外网wget方式就排除了;用迅雷倒是可以下载所有链接,但是不合规范;一个一个点击下载显然太过麻烦;搜了个软件下载又不可靠,算了,还是自己动手,要不写个java程序来把这些rpm包都下载吧。
开始行动
首先,获取到链接文件的形式,使用chrome打开,查看源码,发现都是用的相对路径的方式,如下
<a href="DSDP-doc-5.8-1.14.x86_64.rpm">DSDP-doc-5.8-1.14.x86_64.rpm</a>
正好都是文件名嘛,第一步,获取到网页源码
获取到源码后怎么解析呢,返回的也不是xml,于是用htmlparser去解析,实际直接用htmlparser发起连接都好,get方式淘汰
然后是解析里面的文件名,然后下载
源代码
package net.blog.csdn;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.net.URL;
import java.net.URLConnection;
import org.htmlparser.Parser;
import org.htmlparser.filters.TagNameFilter;
import org.htmlparser.util.NodeList;
/**
* 下载文件到指定目录
*
* @author coder_xia
*/
public class HttpTest
{
private static final String URL = "http://download.opensuse.org/repositories/devel:/languages:/python/SLE_11_SP2/x86_64";
private static final String PROXY_HOST = "...";
private static final String PROXY_PORT = "8080";
private static final String FILE_SUFFIX = ".rpm";
/**
* 下载文件
*
* @param urlString
* 下载文件链接
* @param filename
* 保存的文件名
*/
private static void downloadNet(String urlString, String filename)
{
System.out.println("Begin to download " + urlString + "...");
int byteread = 0;
try
{
URL url = new URL(urlString);
URLConnection conn = url.openConnection();
InputStream inStream = conn.getInputStream();
FileOutputStream fs = new FileOutputStream("D:/test/" + filename);
byte[] buffer = new byte[1204];
while ((byteread = inStream.read(buffer)) != -1)
{
fs.write(buffer, 0, byteread);
}
fs.flush();
fs.close();
System.out.println("Success to download file...");
}
catch (Exception e)
{
e.printStackTrace();
}
}
/**
*
* 设置服务代理
*
* @param host
* 代理主机
* @param port
* 代理端口
*/
public static void setProxy(String host, String port)
{
System.getProperties().setProperty("http.proxyHost", host);
System.getProperties().setProperty("http.proxyPort", port);
}
public static void main(String[] args)
{
setProxy(PROXY_HOST, PROXY_PORT);
try
{
Parser parser = new Parser((new URL(URL)).openConnection());
NodeList nodes = parser.extractAllNodesThatMatch(new TagNameFilter("a"));
if (nodes == null)
{
return;
}
for (int i = 0; i < nodes.size(); i++)
{
String text = nodes.elementAt(i).getText();
int index = text.indexOf("\"");
String filename = text.substring(index + 1, text.length() - 1);
if (filename.endsWith(FILE_SUFFIX))
{
downloadNet(URL + "/" + filename, filename);
}
}
}
catch (Exception e)
{
e.printStackTrace();
}
}
}
说明
可能看的同学会有个问题,为什么在里面的filter里要写死按照a去过滤呢,那在其它网站岂不是没法扩展了么?另外,为什么拼接文件链接的时候用了URL+/+filename拼接,其它用绝对路径的怎么办?
楼主想说,实际上每个网站实现都不一样,比如这个用了div去搞
<div class="content">
<p><img class="alignright wp-image-11654" src="http://coolshell.cn//wp-content/uploads/2014/05/tin-can-phone.jpg" alt="" width="360" height="257" />
标签页都不一样了,所以实现兼容所有网页的,太麻烦,就把这个网站的搞定先。
改进
后来加个界面,给这个网站的不同网址,再加个后缀名填写
最后,参考网址:
http://www.cnblogs.com/loveyakamoz/archive/2011/07/27/2118937.html