持续努力中,感谢支持
URL
、HttpURLConnection
等 API 来实现。
建立网络连接:利用URL类确定目标网页的地址,再通过openConnection()
方法获取HttpURLConnection
对象。
URL url = new URL("https://example.com");
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
设置请求参数:明确请求方式(GET/POST)以及超时时间等参数。
conn.setRequestMethod("GET");
conn.setConnectTimeout(5000);
获取响应数据:通过输入流读取网页的内容,并将其转换为字符串进行处理。
InputStream in = conn.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(in));
String line;
StringBuilder sb = new StringBuilder();
while ((line = br.readLine()) != null) {
sb.append(line);
}
数据解析与提取:结合字符串处理方法或者正则表达式,从网页源码中提取出目标信息,如链接、文本内容等。
HttpURLConnection
:用于发送 HTTP 请求和接收响应,支持设置请求头、获取响应码等操作。
InputStream
、BufferedReader
):这些类的作用是读取网络数据。
<a>
标签中的链接,或者<div class="content">
中的文本内容。
Pattern pattern = Pattern.compile("<title>(.*?)</title>");
Matcher matcher = pattern.matcher(htmlContent);
while (matcher.find()) {
String title = matcher.group(1);
if (title.contains("Java")) {
System.out.println(title);
}
}
.*
匹配<div>
content1</div>``<div>
content2</div>
时,会从第一个<div>
一直匹配到最后一个</div>
。
.*?
能够分别匹配两个<div>
标签内的内容。
"<div>(.*)</div>"
(贪婪):匹配结果为 “content1content2”
"<div>(.*?)</div>"
(非贪婪):匹配结果为 “content1” 和 “content2”
.
(可匹配任意字符)、*
(匹配前导字符 0 次或多次)、+
(匹配前导字符 1 次或多次)、?
(匹配前导字符 0 次或 1 次)、()
(用于分组)等。
\d
(匹配数字)、\w
(匹配字母、数字、下划线)、\s
(匹配空白字符)等。
表示编译后的正则表达式,可通过compile()
方法创建实例。
Pattern pattern = Pattern.compile("\\d+"); // 匹配1个或多个数字
用于对字符串进行匹配操作,常用方法包括:
Matcher matcher = pattern.matcher("abc123def456");
while (matcher.find()) {
System.out.println(matcher.group()); // 输出:123、456
}
设置合理的请求间隔,可使用Thread.sleep()
实现;添加请求头来模拟浏览器,例如设置User-Agent
。
conn.setRequestProperty("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64)");
避免使用过度复杂的表达式,对于频繁使用的正则,提前将其编译为Pattern实例,这样可实现复用,减少性能消耗。
爬取数据时,需遵守网站的robots.txt
协议,避免侵犯隐私或者引发法律风险。