JAVA API (三):从基础爬虫构建到带条件数据提取 —— 详解 URL、正则与爬取策略
个人主页-爱因斯晨
文章专栏-Java学习
相关文章:API (一)
相关文章:API(二)
持续努力中,感谢支持

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