当前位置: 首页 > news >正文

JAVA API (三):从基础爬虫构建到带条件数据提取 —— 详解 URL、正则与爬取策略

个人主页-爱因斯晨

文章专栏-Java学习

相关文章:API (一)

相关文章:API(二)

持续努力中,感谢支持

在这里插入图片描述

一、爬虫基础

(一)爬虫的基本概念

  • 定义:爬虫是按照一定规则自动抓取网络信息的程序,在 Java 环境下,可借助 URLHttpURLConnection 等 API 来实现。

  • 应用场景:广泛应用于数据采集,如电商平台的价格监控、各类新闻的聚合;还可用于信息分析,如舆情监测等。

(二)Java 实现简单爬虫的步骤

建立网络连接:利用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);
}

数据解析与提取:结合字符串处理方法或者正则表达式,从网页源码中提取出目标信息,如链接、文本内容等。

(三)爬虫的核心 API

  • URL:代表统一资源定位符,主要功能是标识网络资源的地址。

  • HttpURLConnection:用于发送 HTTP 请求和接收响应,支持设置请求头、获取响应码等操作。

  • 输入流相关类(InputStreamBufferedReader):这些类的作用是读取网络数据。

二、带条件爬取与贪婪爬取

(一)带条件爬取

  • 定义:按照特定规则对目标数据进行筛选,避免无差别地抓取无关信息,从而提高爬取效率。

  • 实现方式:

  • 基于标签筛选:例如只提取<a>标签中的链接,或者<div class="content">中的文本内容。

  • 基于内容关键词:通过字符串的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协议,避免侵犯隐私或者引发法律风险。

http://www.lryc.cn/news/596369.html

相关文章:

  • M3088NL是一款网络滤波器/变压器支持100M和1000M网络环境,适用于高速网络传输场景M3088
  • 在腾讯云上安装gitlab
  • HCIP第一二章笔记整理
  • 网络基础DAY16-MSTP-VRRP
  • 公司内部网址怎么在外网打开?如何让外网访问内网的网站呢?
  • 5G工业路由器如何凭借高性价比助力多行业数字化转型?
  • Hugging Face 模型的缓存和直接下载有什么区别?
  • TI DLP3010光机与相机触发使用指南
  • Android app如果不适配Android 15会怎么样
  • 一款基于 WPF 开源、功能全面的串口调试工具
  • 【Spark征服之路-3.7-Spark-SQL核心编程(六)】
  • Aspose.Cells 应用案例:法国能源企业实现能源数据报告Excel自动化
  • 中国科技信息杂志中国科技信息杂志社中国科技信息编辑部2025年第14期目录
  • stm32 智能小车
  • vue2使用v-viewer实现自动预览
  • S2B2C电子商务模式介绍
  • 【Pytest】从配置到固件的使用指南
  • Vue底层换成啥了?如何更新DOM的?
  • YOLO-实例分割头
  • 大数据量查询计算引发数据库CPU告警问题复盘
  • 静态登录界面
  • vscode,cursor,Trae终端不能使用cnpm、npm、pnpm命令解决方案
  • 类加载过程及双亲委派模型
  • git push新版问题解决
  • 以 Everoute 替代 VMware NSX:关键能力可对标,使用和运维更简单
  • 单片机的几种GPIO输入输出模型详解
  • Linux CentOS 虚拟机升级内核至4.x以上版本
  • 对随机生成的html文件做标签简析
  • CentOS 7 安装nginx
  • Docker/DockerHub 镜像源可用列表