个人主页-爱因斯晨
文章专栏-Java学习
相关文章:API (一)
相关文章:API(二)
持续努力中,感谢支持

一、爬虫基础
(一)爬虫的基本概念
-
定义:爬虫是按照一定规则自动抓取网络信息的程序,在 Java 环境下,可借助
URL
、HttpURLConnection
等 API 来实现。 -
应用场景:广泛应用于数据采集,如电商平台的价格监控、各类新闻的聚合;还可用于信息分析,如舆情监测等。
(二)Java 实现简单爬虫的步骤
建立网络连接:利用URL类确定目标网页的地址,再通过openConnection()
方法获取HttpURLConnection
对象。
java
URL url = new URL("https://example.com");
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
设置请求参数:明确请求方式(GET/POST)以及超时时间等参数。
java
conn.setRequestMethod("GET");
conn.setConnectTimeout(5000);
获取响应数据:通过输入流读取网页的内容,并将其转换为字符串进行处理。
java
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);
}
数据解析与提取:结合字符串处理方法或者正则表达式,从网页源码中提取出目标信息,如链接、文本内容等。
(三)爬虫的核心 API
-
URL:代表统一资源定位符,主要功能是标识网络资源的地址。
-
HttpURLConnection
:用于发送 HTTP 请求和接收响应,支持设置请求头、获取响应码等操作。 -
输入流相关类(
InputStream
、BufferedReader
):这些类的作用是读取网络数据。
二、带条件爬取与贪婪爬取
(一)带条件爬取
-
定义:按照特定规则对目标数据进行筛选,避免无差别地抓取无关信息,从而提高爬取效率。
-
实现方式:
-
基于标签筛选:例如只提取
<a>
标签中的链接,或者<div class="content">
中的文本内容。 -
基于内容关键词:通过字符串的contains()方法或者正则表达式,过滤出包含指定关键词的数据。
-
示例:爬取网页中所有包含 "Java" 关键词的标题
java
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
(匹配空白字符)等。
(二)Java 中处理正则的两个核心类
Pattern 类:
表示编译后的正则表达式,可通过compile()
方法创建实例。
java
Pattern pattern = Pattern.compile("\\d+"); // 匹配1个或多个数字
Matcher 类:
用于对字符串进行匹配操作,常用方法包括:
java
Matcher matcher = pattern.matcher("abc123def456");
while (matcher.find()) {
System.out.println(matcher.group()); // 输出:123、456
}
-
find():查找下一个匹配的子序列。
-
group():返回当前匹配的子序列(需要与find()配合使用)。
-
matches():判断整个字符串是否完全匹配正则表达式。
四、实战注意事项
反爬机制规避:
设置合理的请求间隔,可使用Thread.sleep()
实现;添加请求头来模拟浏览器,例如设置User-Agent
。
java
conn.setRequestProperty("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64)");
正则表达式效率优化:
避免使用过度复杂的表达式,对于频繁使用的正则,提前将其编译为Pattern实例,这样可实现复用,减少性能消耗。
合法性与道德规范:
爬取数据时,需遵守网站的robots.txt
协议,避免侵犯隐私或者引发法律风险。