如何在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对象来发送请求,并通过流的方式读取响应,并保存到指定的文件中即可。当然,对于需要处理大量数据的情况,还需要考虑如何进行优化。
