使用htmlparser下载网页中链接的所有文件

事件起因

叶总在安装个开源软件,但是包依赖太麻烦,于是想把依赖的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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值