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

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

个人主页-爱因斯晨

文章专栏-Java学习

相关文章:API (一)

相关文章:API(二)

持续努力中,感谢支持
在这里插入图片描述

一、爬虫基础

(一)爬虫的基本概念

  • 定义:爬虫是按照一定规则自动抓取网络信息的程序,在 Java 环境下,可借助URLHttpURLConnection等 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 请求和接收响应,支持设置请求头、获取响应码等操作。
  • 输入流相关类(InputStreamBufferedReader):这些类的作用是读取网络数据。

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

(一)带条件爬取

  • 定义:按照特定规则对目标数据进行筛选,避免无差别地抓取无关信息,从而提高爬取效率。
  • 实现方式:
  • 基于标签筛选:例如只提取<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协议,避免侵犯隐私或者引发法律风险。

Read more

Linux 磁盘基础:从物理结构到 CHS/LBA 寻址,吃透数据存储底层逻辑

Linux 磁盘基础:从物理结构到 CHS/LBA 寻址,吃透数据存储底层逻辑

🔥草莓熊Lotso:个人主页 ❄️个人专栏: 《C++知识分享》《Linux 入门到实践:零基础也能懂》 ✨生活是默默的坚持,毅力是永久的享受! 🎬 博主简介: 文章目录 * 前言: * 一. 磁盘硬件基础:机械结构与存储单元 * 1.1 磁盘物理组成 * 1.2 磁盘容量计算 * 1.3 核心概念辨析:磁道、柱面、扇区 * 二. 磁盘逻辑结构:系统对物理硬件的抽象 * 2.1 多维度理解和理清磁盘逻辑结构 * 2.2 逻辑结构的本质 * 2.3 逻辑结构的核心优势 * 三. CHS 寻址:早期的物理坐标定位 * 3.1 CHS 寻址原理 * 3.2

By Ne0inhk
Flutter 三方库 sparky 的鸿蒙化适配指南 - 实现极简 2D 游戏引擎功能、支持高效精灵图渲染与跨端游戏逻辑

Flutter 三方库 sparky 的鸿蒙化适配指南 - 实现极简 2D 游戏引擎功能、支持高效精灵图渲染与跨端游戏逻辑

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net Flutter 三方库 sparky 的鸿蒙化适配指南 - 实现极简 2D 游戏引擎功能、支持高效精灵图渲染与跨端游戏逻辑 前言 在 Flutter for OpenHarmony 的娱乐化开发领域,我们有时需要构建一些轻量级的小游戏或交互动效,但又不想引入像 Flame 这样的大型游戏引擎。sparky 是一个定位极其精简的 2D 游戏开发框架。它提供了基础的层级管理、精灵渲染和碰撞检测。本文将探讨如何在鸿蒙端利用 sparky 快速搭建游戏原型。 一、原理解析 / 概念介绍 1.1 基础原理 sparky 通过在 Flutter 的 CustomPainter 之上建立了一套简易的场景树(Scene Tree)。它将每一个游戏元素抽象为节点,并提供高频刷新的引擎循环(Engine

By Ne0inhk
Flutter 三方库 flutter_connectivity 的鸿蒙化适配指南 - 实现具备网络类型感知与连通性自愈的状态管理、支持端侧多网融合环境下的业务自适应实战

Flutter 三方库 flutter_connectivity 的鸿蒙化适配指南 - 实现具备网络类型感知与连通性自愈的状态管理、支持端侧多网融合环境下的业务自适应实战

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net Flutter 三方库 flutter_connectivity 的鸿蒙化适配指南 - 实现具备网络类型感知与连通性自愈的状态管理、支持端侧多网融合环境下的业务自适应实战 前言 在进行 Flutter for OpenHarmony 的全场景应用开发时,网络状态的剧烈波动(如从 WiFi 切换到 4G/5G,或进入无信号的电梯)是影响用户体验的关键因素。如何实现毫秒级的网络类型探测并据此优化 UI 策略?flutter_connectivity(或其增强分支)是处理此类需求的经典库。本文将探讨如何在鸿蒙端构建极致灵敏的网络状态感知体系。 一、原直观解析 / 概念介绍 1.1 基础原理 该库通过监听鸿蒙系统的网络状态变更广播(Broadcast)或利用端侧轮询机制,实时捕获当前活跃网络接口(Interface)的变化。它将复杂的系统底层网络状态抽象为 wifi, mobile,

By Ne0inhk
Flutter for OpenHarmony: Flutter 三方库 intl_utils 自动化管理鸿蒙应用国际化多语言资源(零样板代码的多端适配)

Flutter for OpenHarmony: Flutter 三方库 intl_utils 自动化管理鸿蒙应用国际化多语言资源(零样板代码的多端适配)

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net 前言 在开发 OpenHarmony 面向全球市场的 App 时,国际化(i18n)是必经之路。虽然 Flutter 官方提供了 intl 库,但在实际项目中,手动维护 .arb 文件并生成代码非常繁琐。 intl_utils (配合 IDE 插件) 是业界公认的最佳实践方案。它能自动监听翻译文件的变更,并实时生成强类型的 Dart 调用代码,让国际化像使用普通变量一样简单安全。 一、核心工作流 保存触发 生成代码 强类型调用 pubspec.yaml (配置开启) l10n/*.arb (翻译源文件) intl_utils (自动生成) lib/generated/

By Ne0inhk