动态网页内容通常是通过JavaScript动态加载的,传统的静态网页抓取工具(如简单的HTTP请求)无法直接获取这些内容。因此,我们需要借助一些技术手段来模拟浏览器行为,或者直接解析动态加载的数据。
Java和Kotlin是两种广泛使用的编程语言,它们在动态网页抓取中具有以下优势:
HttpURLConnection
、Jsoup
、OkHttp
等,用于简化网络请求和HTML解析。确保已安装JDK(Java Development Kit)并配置好开发环境。本文代码兼容Java和Kotlin。
如果使用Maven构建项目,可以在<font style="color:rgb(64, 64, 64);">pom.xml</font>
中添加以下依赖:
以下是完整的Java和Kotlin实现代码,包含代理服务器的配置。
import java.net.*;
import java.io.*;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
public class DynamicWebScraper {
public static void main(String[] args) {
String url = "https://example.com"; // 目标网页URL
String proxyHost = "www.16yun.cn"; // 代理主机
int proxyPort = 5445; // 代理端口
String proxyUser = "16QMSOML"; // 代理用户名
String proxyPass = "280651"; // 代理密码
try {
// 设置代理
Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress(proxyHost, proxyPort));
Authenticator.setDefault(new Authenticator() {
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(proxyUser, proxyPass.toCharArray());
}
});
// 创建HTTP连接
HttpURLConnection connection = (HttpURLConnection) new URL(url).openConnection(proxy);
connection.setRequestMethod("GET");
connection.setRequestProperty("User-Agent", "Mozilla/5.0");
// 获取响应
int responseCode = connection.getResponseCode();
if (responseCode == HttpURLConnection.HTTP_OK) {
InputStream inputStream = connection.getInputStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
StringBuilder response = new StringBuilder();
String line;
while ((line = reader.readLine()) != null) {
response.append(line);
}
reader.close();
// 使用Jsoup解析HTML
Document doc = Jsoup.parse(response.toString());
String title = doc.title();
System.out.println("网页标题: " + title);
// 提取动态内容(例如特定标签)
String dynamicContent = doc.select("div.dynamic-content").text();
System.out.println("动态内容: " + dynamicContent);
} else {
System.out.println("请求失败,响应码: " + responseCode);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
import java.net.*
import org.jsoup.Jsoup
fun main() {
val url = "https://example.com" // 目标网页URL
val proxyHost = "www.16yun.cn" // 代理主机
val proxyPort = 5445 // 代理端口
val proxyUser = "16QMSOML" // 代理用户名
val proxyPass = "280651" // 代理密码
try {
// 设置代理
val proxy = Proxy(Proxy.Type.HTTP, InetSocketAddress(proxyHost, proxyPort))
Authenticator.setDefault(object : Authenticator() {
override fun getPasswordAuthentication(): PasswordAuthentication {
return PasswordAuthentication(proxyUser, proxyPass.toCharArray())
}
})
// 创建HTTP连接
val connection = URL(url).openConnection(proxy) as HttpURLConnection
connection.requestMethod = "GET"
connection.setRequestProperty("User-Agent", "Mozilla/5.0")
// 获取响应
val responseCode = connection.responseCode
if (responseCode == HttpURLConnection.HTTP_OK) {
val inputStream = connection.inputStream
val reader = inputStream.bufferedReader()
val response = reader.readText()
// 使用Jsoup解析HTML
val doc = Jsoup.parse(response)
val title = doc.title()
println("网页标题: $title")
// 提取动态内容(例如特定标签)
val dynamicContent = doc.select("div.dynamic-content").text()
println("动态内容: $dynamicContent")
} else {
println("请求失败,响应码: $responseCode")
}
} catch (e: Exception) {
e.printStackTrace()
}
}
<font style="color:rgb(64, 64, 64);">Proxy</font>
类设置代理服务器的主机和端口。<font style="color:rgb(64, 64, 64);">Authenticator</font>
类提供代理的用户名和密码。<font style="color:rgb(64, 64, 64);">HttpURLConnection</font>
发送GET请求。<font style="color:rgb(64, 64, 64);">User-Agent</font>
模拟浏览器行为,避免被反爬虫机制拦截。<font style="color:rgb(64, 64, 64);">Jsoup</font>
库解析HTML文档。<font style="color:rgb(64, 64, 64);">div.dynamic-content</font>
)提取动态内容。<font style="color:rgb(64, 64, 64);">IOException</font>
等异常,确保程序稳定性。