java爬虫工具Jsoup学习
目录
前言
一、基本使用
二、爬取豆瓣电影的案例
三、Jsoup能做什么?
四、Jsoup相关概念
五、Jsoup获取文档
六、定位选择元素
七、获取数据
八、具体案例
前言
JSoup是一个用于处理HTML的Java库,它提供了一个非常方便类似于使用DOM,CSS和jquery的方法的API来提取和操作数据。
一、基本使用
<dependency><groupId>org.jsoup</groupId><artifactId>jsoup</artifactId><version>1.13.1</version>
</dependency>
二、爬取豆瓣电影的案例
public class DouBan {public static void main(String[] args) {String url = "https://movie.douban.com/top250";crawlMovies(url);}/*** 爬取的方法* @param url* @return*/public static void crawlMovies(String url) {try {Document doc = Jsoup.connect(url).get(); //模拟浏览器向服务器发起get请求Elements elements = doc.select("#content > div > div.article > ol > li");// System.out.println(elements);for (Element element : elements) {String rank = element.select("div.pic > em").text();String name = element.select("div.info > div.hd > a > span:nth-child(1)").text();String score = element.select("div.info > div.bd > div.star > span.rating_num").text();System.out.println(rank + " " + name + " " + score);}} catch (IOException e) {e.printStackTrace();}}
}
三、Jsoup能做什么?
- 从 URL、文件或字符串中抓取和解析HTML(爬虫)
- 使用DOM 遍历或 CSS 选择器查找和提取数据
- 操作HTML 元素、属性和文本
- 根据安全列表清理用户提交的内容,以防止XSS攻击
- 输出整洁的网页
四、Jsoup相关概念
- Document :文档对象。每份HTML页面都是一个文档对象,Document 是 jsoup 体系中最顶层的结构。
- Element:元素对象。一个 Document 中可以着包含着多个 Element 对象,可以使用 Element 对象来遍历节点提取数据或者直接操作HTML。
- Elements:元素对象集合,类似于List。
- Node:节点对象。标签名称、属性等都是节点对象,节点对象用来存储数据。
- 类继承关系:Document 继承自 Element(class Document extends Element) ,Element 继承自 Node(class Element extends Node)。
- 一般执行流程:先获取 Document 对象,然后获取 Element 对象,最后再通过 Node 对象获取数据。

五、Jsoup获取文档
1.导入jsoup的jar包
<!-- jsoup -->
<dependency> <groupId>org.jsoup</groupId> <artifactId>jsoup</artifactId> <version>1.11.3</version>
</dependency>
2.从URL中加载文档对象(常用)
使用 Jsoup.connect(String url).get()方法获取(只支持 http 和 https 协议)
try {Document document = Jsoup.connect("http://www.baidu.com").get();System.out.println(document);
} catch (IOException e) {throw new RuntimeException(e);
}
connect(String url)方法创建一个新的 Connection并通过.get()或者.post()方法获得数据。如果从该URL获取HTML时发生错误,便会抛出 IOException,应适当处理。
3.设置请求头,模拟浏览器访问服务器
public class ParseUtils {public static final String url ="https://www.zhaopin.com/sou/jl530/kw01L00O80EO062/p2";public static void main(String[] args) throws IOException {Document scriptHtml = Jsoup.connect(url).header("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7").header("Accept-Encoding", "gzip, deflate, br, zstd").header("Accept-Language", "zh-CN,zh;q=0.9")//,en-US;q=0.5,en;q=0.3.header("Cache-Control","max-age=0").header("Cookie", "x-zp-client-id=ef9626f5-a52b-4a15-8a12-b0a85e7c218d;").header("Priority", "u=0, i").header("Sec-Ch-Ua","\"Not/A)Brand\";v=\"8\", \"Chromium\";v=\"126\", \"Google Chrome\";v=\"126\"").header("Sec-Ch-Ua-Mobile","?0").header("Sec-Ch-Ua-Platform","\"Windows\"").header("Sec-Fetch-Dest","document").header("Sec-Fetch-Mode","navigate").header("Sec-Fetch-Site","same-origin").header("Sec-Fetch-User","?1").header("Upgrade-Insecure-Requests","1").header("User-Agent","Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36").timeout(50000).get();System.out.println(scriptHtml);}
}
六、定位选择元素
我们可以利用dom结构的方式,通过标签,id,class等查找到下属元素
1.查找元素-下列方法返回的是Element或Elements
- getElementById(String id):通过id来查找元素
- getElementsByTag(String tag):通过标签来查找元素
- getElementsByClass(String className):通过类选择器来查找元素
- getElementsByAttribute(String key) :通过属性名称来查找元素,例如查找带有href元素的标签。
- siblingElements():获取兄弟元素。如果元素没有兄弟元素,则返回一个空列表。
- firstElementSibling():获取第一个兄弟元素。
- lastElementSibling():获取最后一个兄弟元素。
- nextElementSibling():获取下一个兄弟元素。
- previousElementSibling():获取上一个兄弟元素。
- parent():获取此节点的父节点。
- children():获取此节点的所有子节点。
- child(int index):获取此节点的指定子节点。
2.select(String selector)-下列方法返回的是Element或Elements
- tagname: 通过标签查找元素,例如通过"a"来查找< a >标签。
- #id: 通过ID查找元素,比如通过#logo查找< p id=“logo”>
- .class: 通过class名称查找元素,比如通过.titile查找< p class=“titile”>
- ns|tag: 通过标签在命名空间查找元素,比如使用 fb|name 来查找 < fb:name>
- [attribute]: 利用属性查找元素,比如通过[href]查找< a href=“…”>
- [ ^attribute]: 利用属性名前缀来查找元素,比如:可以用[^data-] 来查找带有HTML5 dataset属性的元素
- [ attribute=value]: 利用属性值来查找元素,比如:[ width=500]
- [attribute^=value], [attribute$=value], [attribute*=value]: 利用匹配属性值开头、结尾或包含属性值来查找元素,比如通过[href*=/path/]来查找
- [attribute~=regex]: 利用属性值匹配正则表达式来查找元素,比如通过 img[src~=(?i).(png|jpe?g)]来匹配所有的png或者jpg、jpeg格式的图片
- *: 通配符,匹配所有元素
七、获取数据
attr(String key):获取单个属性值
attributes():获取所有属性值
attr(String key, String value):设置属性值
text():获取文本内容
text(String value):设置文本内容
html():获取元素内的HTML内容
html(String value):设置元素内的HTML内容
outerHtml():获取元素外HTML内容
data():获取数据内容(例如:script和style标签)
id():获得id值
className():获得第一个类选择器值
classNames():获得所有的类选择器值
tag():获取元素标签
tagName():获取元素标签名
八、具体案例
爬取智联招聘网站
public class ParseUtils {public static final String url ="https://www.zhaopin.com/sou/jl530/kw01L00O80EO062/p1";public static void main(String[] args) throws IOException {Document scriptHtml = Jsoup.connect(url).header("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7").header("Accept-Encoding", "gzip, deflate, br, zstd").header("Accept-Language", "zh-CN,zh;q=0.9")//,en-US;q=0.5,en;q=0.3.header("Cache-Control","max-age=0").header("Cookie", "x-zp-client-id=ef9626f5-a52b-4a15-8a12-b0a85e7c218d;").header("Priority", "u=0, i").header("Sec-Ch-Ua","\"Not/A)Brand\";v=\"8\", \"Chromium\";v=\"126\", \"Google Chrome\";v=\"126\"").header("Sec-Ch-Ua-Mobile","?0").header("Sec-Ch-Ua-Platform","\"Windows\"").header("Sec-Fetch-Dest","document").header("Sec-Fetch-Mode","navigate").header("Sec-Fetch-Site","same-origin").header("Sec-Fetch-User","?1").header("Upgrade-Insecure-Requests","1").header("User-Agent","Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36").timeout(50000).get();// System.out.println(scriptHtml);Elements content = scriptHtml.getElementsByClass("joblist-box__item");for(Element element:content){String price = element.getElementsByClass("jobinfo__salary").text();String company = element.getElementsByClass("companyinfo__name").text();System.out.println(price+" " + company);}}
}
相关文章:
java爬虫工具Jsoup学习
目录 前言 一、基本使用 二、爬取豆瓣电影的案例 三、Jsoup能做什么? 四、Jsoup相关概念 五、Jsoup获取文档 六、定位选择元素 七、获取数据 八、具体案例 前言 JSoup是一个用于处理HTML的Java库,它提供了一个非常方便类似于使用DOM࿰…...
基于SpringBoot电脑组装系统平台系统功能实现六
一、前言介绍: 1.1 项目摘要 随着科技的进步,计算机硬件技术日新月异,包括处理器(CPU)、主板、内存、显卡等关键部件的性能不断提升,为电脑组装提供了更多的选择和可能性。不同的硬件组合可以构建出不同类…...
Java实战项目-基于 springboot 的校园选课小程序(附源码,部署,文档)
Java 基于 springboot 的校园选课小程序 博主介绍:✌程序员徐师兄、8年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战*✌ 🍅文末获取源码联系🍅 👇&…...
洛谷P3884 [JLOI2009] 二叉树问题(详解)c++
题目链接:P3884 [JLOI2009] 二叉树问题 - 洛谷 | 计算机科学教育新生态 1.题目解析 1:从8走向6的最短路径,向根节点就是向上走,从8到1会经过三条边,向叶节点就是向下走,从1走到6需要经过两条边,…...
SQL99之内连接查询
SQL99是SQL语言的一个标准,于1999年发布。内连接查询是SQL中非常常用的一种查询方式,用于根据指定的条件从两个或多个表中获取相关联的数据。下面将详细介绍SQL99中的内连接查询,并以通熟易懂的语言进行讲解,同时给出代码例子、注…...
Qt Ribbon使用实例
采用SARibbon创建简单的ribbon界面 实例代码如下所示: 1、头文件: #pragma once #include <SARibbonBar.h> #include "SARibbonMainWindow.h" class QTextEdit; class SAProjectDemo1 : public SARibbonMainWindow { Q_OBJECT pub…...
【事务管理】
目录 一. 介绍与操作二. Spring事务管理三. 事务四大特性 \quad 一. 介绍与操作 \quad \quad 二. Spring事务管理 \quad 推荐加在经常进行增删改的方法上 \quad 三. 事务四大特性 \quad ctrlaltt...
[250129] Archinstall 3.0.2 发布 | Wolfram 语言与 Mathematica 14.2 版本发布
目录 Archinstall 3.0.2 版本发布Wolfram 语言与 Mathematica 14.2 版本发布🌟 主要亮点 Archinstall 3.0.2 版本发布 Archlinux 的自动化安装程序 Archinstall 发布了 3.0.2 版本,该版本带来了大量的改进和修复,以及一些新功能和贡献者。 …...
以创新芯片技术助力科技发展
在当今数字化与智能化浪潮中,芯片作为现代科技的核心,正悄然推动着各个行业的变革。厦门国科安芯科技有限公司专注于高性能芯片的研发与创新,致力于为工业、汽车和商业航天等领域提供高效、可靠的解决方案。以下是国科安芯推出的几款具有代表…...
单细胞-第五节 多样本数据分析,打分R包AUCell
文件在单细胞\5_GC_py\1_single_cell\3.AUCell.Rmd 1.基因 rm(list = ls()) load("g.Rdata")2.AUCell https://www.ncbi.nlm.nih.gov/pmc/articles/PMC9897923 IF: NA NA NA用这个文章里的方法,将单细胞亚群的marker基因与ros相关基因取交集,用作AUCell的基因集…...
详解:网站地图对快速收录的重要性
本文来自:百万收录网 原文链接:https://www.baiwanshoulu.com/16.html 网站地图(Sitemap)在快速收录方面扮演着至关重要的角色。以下是对网站地图重要性的详细解析: 一、定义与功能 网站地图是一个包含网站上所有或…...
OSPF邻接关系无法建立之MTU问题
OSPF中路由器间从邻居到建立完全邻接需满足以下条件: 1、邻居之间网络通 2、建立邻接的接口不能为OSPF被动接口 3、两台路由器的HELLO时间间隔和DEAD时间间隔必须一致 4、两台路由器的router-id 必须不同 5、如果开了OSPF认证,认证方式和KEY必须一致 6、两台路由器建立…...
OpenEuler学习笔记(十五):在OpenEuler上搭建Java运行环境
一、在OpenEuler上搭建Java运行环境 在OpenEuler上搭建Java运行环境可以通过以下几种常见方式,下面分别介绍基于包管理器安装OpenJDK和手动安装Oracle JDK的步骤。 使用包管理器安装OpenJDK OpenJDK是Java开发工具包的开源实现,在OpenEuler上可以方便…...
【蓝桥杯省赛真题02】C++猫吃鱼 第十届蓝桥杯青少年创意编程大赛 算法思维 C++编程省赛真题解
目录 C猫吃鱼 一、题目要求 1、编程实现 2、输入输出 二、算法分析 三、程序编写 四、运行结果 五、考点分析 七、推荐资料 C猫吃鱼 第十届蓝桥杯青少年创意编程大赛C选拔赛真题 一、题目要求 明明家从1号站点出发,开车去旅游,一共要经过n个…...
开源 OA 办公系统
目前尚未有关于勾股 OA 5.6.8 新春版发布的相关确切信息,但勾股 OA v5.6 已于 2025 年 1 月 19 日发布2。勾股 OA 是一款基于 ThinkPHP6 Layui MySql 打造的实用的开源的企业办公系统2。勾股 OA v5.6 的相关信息如下2: 系统特点 系统各功能模块一目了…...
SpringCloudGateWay和Sentinel结合做黑白名单来源控制
假设我们的分布式项目,admin是8087,gateway是8088,consumer是8086 我们一般的思路是我们的请求必须经过我们的网关8088然后网关转发到我们的分布式项目,那我要是没有处理我们绕过网关直接访问项目8087和8086不也是可以࿱…...
CVE-2020-0796永恒之蓝2.0(漏洞复现)
目录 前言 产生原因 影响范围 漏洞复现 复现环境 复现步骤 防御措施 总结 前言 在网络安全的战场上,漏洞一直是攻防双方关注的焦点。CVE-2020-0796,这个被称为 “永恒之蓝 2.0” 的漏洞,一度引起了广泛的关注与担忧。它究竟是怎样的…...
构建具身智能体的时空宇宙!GRUtopia:畅想城市规模下通用机器人的生活图景
作者: Hanqing Wang, Jiahe Chen, Wensi Huang, Qingwei Ben, Tai Wang, Boyu Mi, Tao Huang, Siheng Zhao, Yilun Chen, Sizhe Yang, Peizhou Cao, Wenye Yu, Zichao Ye, Jialun Li, Junfeng Long, Zirui Wang, Huiling Wang, Ying Zhao, Zhongying Tu, Yu Qiao, D…...
1.五子棋对弈python解法——2024年省赛蓝桥杯真题
问题描述 原题传送门:1.五子棋对弈 - 蓝桥云课 "在五子棋的对弈中,友谊的小船说翻就翻?" 不!对小蓝和小桥来说,五子棋不仅是棋盘上的较量,更是心与心之间的沟通。这两位挚友秉承着"友谊第…...
YOLOv8改进,YOLOv8检测头融合DynamicHead,并添加小目标检测层(四头检测),适合目标检测、分割等,全网独发
摘要 作者提出一种新的检测头,称为“动态头”,旨在将尺度感知、空间感知和任务感知统一在一起。如果我们将骨干网络的输出(即检测头的输入)视为一个三维张量,其维度为级别 空间 通道,这样的统一检测头可以看作是一个注意力学习问题,直观的解决方案是对该张量进行全自…...
【16届蓝桥杯寒假刷题营】第2期DAY5
5.变变数组 - 蓝桥云课 给定一个长度为 n 的整数数组 A,A 中第 i 个元素为 Ai(1≤i≤n),你只能在 A 中选择一个元素 a,将 A 中所有数值等于 a 的元素变为 a2,请问变化后 A 中所有元素和的最大为多少。 …...
什么是心跳
心跳(Heartbeat) 是在计算机网络、分布式系统和嵌入式系统中常见的一种机制,用于检测系统或组件的可用性、存活状态以及维持连接。 1. 心跳的作用 ✅ 检测存活状态 确保服务器、客户端、微服务或设备仍然在线。适用于 分布式系统、集群、高…...
有限元分析学习——Anasys Workbanch第一阶段笔记梳理
第一阶段笔记主要源自于哔哩哔哩《ANSYS-workbench 有限元分析应用基础教程》 张晔 主要内容导图: 笔记导航如下: Anasys Workbanch第一阶段笔记(1)基本信息与结果解读_有限元分析变形比例-CSDN博客 Anasys Workbanch第一阶段笔记(2)网格单元与应力奇…...
目标跟踪之sort算法(3)
这里写目录标题 1 流程1 预处理2 跟踪 2 代码 参考:sort代码 https://github.com/abewley/sort 1 流程 1 预处理 1.1 获取离线检测数据。1.2 实例化跟踪器。2 跟踪 2.1 轨迹处理。根据上一帧的轨迹预测当前帧的轨迹,剔除到当前轨迹中为空的轨迹得到当前…...
uniapp 地图添加,删除,编辑标记,在地图中根据屏幕范围中呈现标记
前言 小程序实现新功能,在地图中选取位置添加标记,并在地图中呈现添加的标记,(呈现的是根据当前屏幕范围内的标记),并对标记进行分享,删除,编辑,导航,并从分…...
第 5 章:声音与音乐系统
5.1 声音效果的应用 在游戏中,声音效果是增强游戏沉浸感和趣味性的重要元素。Pygame 提供了强大的音频处理功能,使得添加各种声音效果变得相对简单。声音效果可以包括角色的动作音效,如跳跃、攻击、受伤时的声音;环境音效&#x…...
SOME/IP服务接口
本系列文章将分享我在学习 SOME/IP 过程中积累的一些感悟,并结合 SOME/IP 的理论知识进行讲解。主要内容是对相关知识的梳理,并结合实际代码展示 SOME/IP 的使用,旨在自我复习并与大家交流。文中引用了一些例图,但由于未能找到原作…...
NeetCode刷题第17天(2025.1.27)
文章目录 086 Course Schedule II 课程安排二087 Graph Valid Tree 图有效树088 Number of Connected Components in an Undirected Graph 无向图中的连接组件数量 086 Course Schedule II 课程安排二 您将获得一个数组 prerequisites ,其中 prerequisites[i] [a,…...
c++学习第十四天
提示:以下是本篇文章正文内容,下面案例可供参考。 //力扣代码 class Solution {const char* numStrArr[10]{"","","abc","def","ghi","jkl","mno","pqrs","tuv&q…...
遗传算法【Genetic Algorithm(GA)】求解函数最大值(MATLAB and Python实现)
一、遗传算法基础知识 来自B站视频的笔记: 【超容易理解】手把手逐句带你解读并实现遗传算法的MATLAB编程(结合理论基础)_哔哩哔哩_bilibili 1、遗传算法 使用“适者生存”的原则,在遗传算法的每一代中,…...
