欢迎访问宙启技术站
智能推送

如何在Java中使用函数批量下载网页?

发布时间:2023-05-31 11:25:37

在Java中实现批量下载网页,可以考虑使用HttpURLConnection或者Apache HttpClient这两种方式。

使用HttpURLConnection:

1. 构造URL对象,传入需要下载的网页链接,然后打开连接。

2. 设置请求头:设置User-Agent、Referer等信息,以便服务器识别请求。

3. 获取响应输入流:使用getInputStream()方法获得响应输入流。

4. 将响应输入流转化成字符串,读取完成后关闭输入流与连接。

5. 将下载的网页保存到本地文件中。

下面是具体实现代码:

import java.io.*;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.ArrayList;

public class BatchDownloader {

    /**
     * 使用HttpURLConnection批量下载网页
     * @param urls 网页链接列表
     * @param path 保存路径
     */
    public static void downloadWithHttpUrlConnection(ArrayList<String> urls, String path) throws Exception{
        for (String url : urls) {
            // 构造URL对象
            URL u = new URL(url);
            HttpURLConnection conn = (HttpURLConnection) u.openConnection();
            conn.setRequestMethod("GET");

            // 设置请求头
            conn.setRequestProperty("User-Agent", "Mozilla/4.0 (compatible; MSIE 5.0; Windows NT; DigExt)");
            conn.setRequestProperty("Referer", "http://www.google.com");

            // 获取响应输入流
            InputStream in = conn.getInputStream();
            BufferedReader reader = new BufferedReader(new InputStreamReader(in, "UTF-8"));
            StringBuilder sb = new StringBuilder();
            String line;
            while ((line = reader.readLine()) != null) {
                sb.append(line);
            }

            // 关闭输入流和连接
            in.close();
            conn.disconnect();

            // 将网页保存到文件中
            saveToFile(sb.toString(), path + File.separator + getFileName(url));
        }
    }

    /**
     * 获取URL的文件名
     * @param url 网址
     * @return 文件名
     */
    public static String getFileName(String url) {
        int lastIndex = url.lastIndexOf("/");
        if (lastIndex != url.length() - 1) {
            return url.substring(lastIndex + 1);
        }
        return "index.html";
    }

    /**
     * 将网页保存到本地文件中
     * @param content 网页内容
     * @param filePath 文件保存路径
     */
    public static void saveToFile(String content, String filePath) throws Exception{
        File file = new File(filePath);
        if (!file.exists()) {
            file.createNewFile();
        }
        FileOutputStream out = new FileOutputStream(file);
        OutputStreamWriter osw = new OutputStreamWriter(out);
        osw.write(content);
        osw.flush();
        osw.close();
    }

    public static void main(String[] args) {
        ArrayList<String> urls = new ArrayList<>();
        urls.add("http://www.baidu.com");
        urls.add("http://www.sina.com.cn/");
        urls.add("http://www.qq.com");

        String path = "downloads";
        File file = new File(path);
        if (!file.exists()) {
            file.mkdir();
        }

        try {
            downloadWithHttpUrlConnection(urls, path);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

使用Apache HttpClient:

1. 创建HttpClient对象。

2. 构造HttpGet对象,传入需要下载的网页链接。

3. 设置请求头:设置User-Agent、Referer等信息,以便服务器识别请求。

4. 执行HttpGet请求,获取响应实体。

5. 将响应实体转化成字符串,读取完成后关闭响应实体。

6. 将下载的网页保存到本地文件中。

下面是具体实现代码:

import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.utils.HttpClientUtils;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.util.EntityUtils;

import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStreamWriter;
import java.util.ArrayList;

public class BatchDownloader {

    /**
     * 使用Apache HttpClient批量下载网页
     * @param urls 网页链接列表
     * @param path 保存路径
     */
    public static void downloadWithHttpClient(ArrayList<String> urls, String path) throws Exception{
        HttpClient client = new DefaultHttpClient();

        for (String url : urls) {
            // 构造HttpGet对象
            HttpGet request = new HttpGet(url);

            // 设置请求头
            request.setHeader("User-Agent", "Mozilla/4.0 (compatible; MSIE 5.0; Windows NT; DigExt)");
            request.setHeader("Referer", "http://www.google.com");

            // 执行HttpGet请求
            String content = "";
            try {
                content = EntityUtils.toString(client.execute(request).getEntity(), "UTF-8");
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                request.releaseConnection();
            }

            // 将网页保存到文件中
            saveToFile(content, path + File.separator + getFileName(url));
        }

        HttpClientUtils.closeQuietly(client);
    }

    /**
     * 获取URL的文件名
     * @param url 网址
     * @return 文件名
     */
    public static String getFileName(String url) {
        int lastIndex = url.lastIndexOf("/");
        if (lastIndex != url.length() - 1) {
            return url.substring(lastIndex + 1);
        }
        return "index.html";
    }

    /**
     * 将网页保存到本地文件中
     * @param content 网页内容
     * @param filePath 文件保存路径
     */
    public static void saveToFile(String content, String filePath) throws Exception{
        File file = new File(filePath);
        if (!file.exists()) {
            file.createNewFile();
        }
        FileOutputStream out = new FileOutputStream(file);
        OutputStreamWriter osw = new OutputStreamWriter(out);
        osw.write(content);
        osw.flush();
        osw.close();
    }

    public static void main(String[] args) {
        ArrayList<String> urls = new ArrayList<>();
        urls.add("http://www.baidu.com");
        urls.add("http://www.sina.com.cn/");
        urls.add("http://www.qq.com");

        String path = "downloads";
        File file = new File(path);
        if (!file.exists()) {
            file.mkdir();
        }

        try {
            downloadWithHttpClient(urls, path);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

总体而言,使用HttpURLConnection或者Apache HttpClient实现批量下载网页都是比较简单的操作,只需要通过URL或者HttpGet对象来发送请求,并通过流的方式读取响应,并保存到指定的文件中即可。当然,对于需要处理大量数据的情况,还需要考虑如何进行优化。