java-jsoup爬虫

article/2025/8/27 8:19:28

1. 介绍

Jsoup是Java中的一个包,可以用于爬取页面中的数据

Jsoup爬取数据分为以下几个步骤:
1. 获取所爬取网页的Document对象
2. 找到所爬取数据所在的父级标签,将其从Document对象中解析出来,解析出来的内容放置在Element对象中
3. 再在Element中通过每一个数据所在的子标签去解析,解析出来的内容放置在Elements对象中
4. 最后再通过每一个Element对象中的属性获得想要爬取的数据

接下来以爬取京东商品页面中的商品数据为例

2. 新建SpringBoot项目,并导入依赖

<!-- 解析网页 -->
<dependency><groupId>org.jsoup</groupId><artifactId>jsoup</artifactId><version>1.10.2</version>
</dependency>
<!-- lombok -->
<dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional>
</dependency>

3. 确认进行爬取的链接

进入京东官网,随便搜索一个商品,看上方的链接
例如:https://search.jd.com/Search?keyword=笔记本&enc=utf-8&wq=笔记本&pvid=371fd4a6b1ef4b138e493cd39d4a34dc

去掉后面多余的参数,得到最后的目标链接:
https://search.jd.com/Search?keyword=笔记本

这个就是最后我们爬取数据时需要的链接

//  获取请求  https://search.jd.com/Search?keyword=java
String url = "https://search.jd.com/Search?keyword=" + keywords;/*解析网页超过 30s 没有返回就报错Jsoup返回的Document就是浏览器的Document对象
*/
Document document = Jsoup.parse(new URL(url), 30000);

4. 找到所有数据的父级标签

父级div

找到所有商品所在的父级div,通过其id获取该div的Element对象

/*J_goodsList 是京东数据展示的那个 div 的名字获取上述 url 中 div 名字为 J_goodsList 的 html
*/
Element element = document.getElementById("J_goodsList");

5. 找到每个数据放置的标签

数据放置的标签
发现页面中每个商品的数据都是放在li里,然后通过getElementsByTag()方法获取上述父级盒子的Element对象里所有li标签的Element对象集合

//  获取 J_goodsList 中的所有 li,然后进行循环
Elements elements = element.getElementsByTag("li");
for (Element el : elements) {...
}

6. 准备对象

本次只爬取页面中商品的标题,图片链接和价格

@Data
@NoArgsConstructor
@AllArgsConstructor
public class Content {private String title;private String img;private String price;
}

6.1 找到数据所处的位置

位置都是通过标签里的属性来进行定位的

普及:
大部分图片特别多的网站,所有的图片都是延迟加载的,即在页面进行渲染时,图片的链接不是放在标签的src属性中
所谓延迟加载,意思是页面在出现的时候,所有图片不会立马显现出来,而是都会先默认显示一张图片,等到真正的图片传输过来时才将默认图片替换成真正的图片

所以在这里寻找图片链接时,不能去寻找图片的src属性

6.1.1 寻找图片

图片链接所在的地址
在京东,图片的真正地址在img标签里的data-lazy-img属性中。所以我们要获取上述li标签里的img标签的属性

/*getElementsByTag 通过标签进行获取eq(0) 获取第一个元素attr() 获取属性里的值
*/
String img = el.getElementsByTag("img").eq(0).attr("data-lazy-img");

6.1.2 寻找价格数据所处位置

价格数据所处位置

/*getElementsByClass 通过 class 的名字进行获取eq(0) 获取第一个元素text()  所有的文本
*/
String price = el.getElementsByClass("p-price").eq(0).text();

6.1.3 寻找标题数据所处位置

标题数据所处位置

/*getElementsByClass 通过 class 的名字进行获取eq(0) 获取第一个元素text()  所有的文本
*/
String title = el.getElementsByClass("p-name").eq(0).text();

7. 将找到的数据封装进对象

完整代码如下:

import com.gec.pojo.Content;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import java.io.IOException;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;public class HtmlParseUtil {public static void main(String[] args) throws IOException {new HtmlParseUtil().parseJD("搞笑").forEach(System.out::println);}public List<Content> parseJD(String keywords) throws IOException {String url = "https://search.jd.com/Search?keyword=" + keywords;Document document = Jsoup.parse(new URL(url), 30000);Element element = document.getElementById("J_goodsList");//  获取 J_goodsList 中的所有 liElements elements = element.getElementsByTag("li");List<Content> goodsList = new ArrayList<>();//  获取元素中的内容,这里是 el ,就是每一个li标签for (Element el : elements) {String img = el.getElementsByTag("img").eq(0).attr("data-lazy-img");String price = el.getElementsByClass("p-price").eq(0).text();String title = el.getElementsByClass("p-name").eq(0).text();Content content = new Content();content.setImg(img);content.setPrice(price);content.setTitle(title);goodsList.add(content);}return goodsList;}
}

8. 结果

Content(title=汇鑫泉运通 假山流水喷泉屏风高山水景观流水墙水幕墙风水轮家居公司前台风水轮招财落地摆件装饰品 7079 (长91*宽51*高170CM), img=//img12.360buyimg.com/n7/jfs/t1/154317/8/10257/352628/5fdac831Efef04fcb/13a5e3a464c0c024.jpg, price=¥3188.00)
Content(title=抖音同款网红遥控大便屎玩具便便车发声仿真粑粑恶搞整蛊搞笑礼物 遥控便便 普通电池款 抖音同款网红遥控大便屎玩具便便车发声仿真粑粑恶搞整蛊搞笑礼物 遥控便便 普通电池款, img=//img11.360buyimg.com/n7/jfs/t1/135096/39/22238/136938/61e57f8fE8f1f97a3/7a462e78f4d3b762.jpg, price=¥25.80)
...

http://chatgpt.dhexx.cn/article/iQ1RY5uU.shtml

相关文章

java爬虫 教程_Java爬虫其实也很简单,教你实用的入门级爬虫

原标题&#xff1a;Java爬虫其实也很简单&#xff0c;教你实用的入门级爬虫 任何语言都是可以爬虫的&#xff0c;只要你懂的常用的http协议啥的就可以模仿浏览器的行为获取你想要的数据。这里我将教大家一个简单实用的案例&#xff1a;如何获取全民K歌的下载链接。 ps: 这主要是…

java爬虫视频教程_JAVA开发教程:java视频教程java爬虫实战项目 百度网盘

– 源码 – 0 B |- 猫了个咪-更多IT精品课程.html – 41.00 kB |- 猫了个咪–it视频论坛.url – 51 B |- 22_项目优化三&#xff1a;邮件提醒.mp4 – 345.30 MB |- 21_项目优化二&#xff1a;爬虫项目监控[itjc8.com].mp4 – 353.40 MB |- 20-4_项目优化一&#xff1a;解决频繁…

手把手Java爬虫教学 - 1. 了解爬虫

一、什么是爬虫 先来看一下百度百科&#xff0c;了解一下爬虫~ 我们通过爬虫主要的目的就是爬取数据&#xff0c;好比 A 网站、B 网站有我们所需要的内容&#xff0c;但是这两个网站并没有给我们提供接口&#xff0c;那我们怎么能拿到上面的数据呢&#xff1f; 这时候我们就可…

java爬虫教程:模拟用户表单登录

转自&#xff1a;http://xiaolongonly.cn/2016/06/01/Reptile3/ 这个是爬虫教程第三篇&#xff0c;教大家如何模拟用户表单登录。 前期准备&#xff1a; JSOUP 1.83 jar包 Eclipse 任意版本能运行java就行 谷歌浏览器 第一步&#xff1a;依然是分析页面结构 我们要模拟C…

REmap包介绍及使用

2019独角兽企业重金招聘Python工程师标准>>> #REmap包简介 #包安装 #remapH函数 #remapH案例 #get_theme函数 #remapC函数 #markLineControl函数 #markPointControl函数 #remapC案例 REmap包简介 REmap包是R与echart的对接&#xff0c;在R里调用echar的api直接作图&…

用R语言绘制动态地图,代码奉上!(REmap包详解)

options(remap.ak="MY07CLhm3wKi4N2tQ6WP4kzz21BBZagI") 安装包 library(devtools) install_github(badbye/baidumap) install_github(lchiffon/REmap) baidumap包函数说明 getBaiduMap函数 getBaiduMap(location, width = 400, height = 400, zoom = 10, scale = …

remap()

学习自&#xff1a;【OpenCV入门教程之十七】OpenCV重映射 重映射&#xff0c;就是把一幅图像中某位置的像素放置到另一个图片指定位置的过程。为了完成映射过程, 我们需要获得一些插值为非整数像素的坐标,因为源图像与目标图像的像素坐标不是一一对应的。一般情况下&#xff…

REmap绘制地图

本文出自&#xff1a; http://blog.csdn.net/wzgl__wh/article/details/53108754 REmap这个包是通过调用百度地图API的一个程序包&#xff0c;与Google的ggmap包相比&#xff0c;不用翻墙就可以使用。其函数主要有&#xff1a;remap()&#xff0c;remapB()、remapC()、remapH()…

R语言:使用REmap绘制超炫酷的地图

REmap这个包是通过调用百度地图API的一个程序包,与Google的ggmap包相比,不用翻墙就可以使用。其函数主要有:remap(),remapB()、remapC()、remapH()四个。该程序包目前要github网站上,因此我们需要从github上面下载安装。 install.packages("devtools")#如果安装…

ioremap()

活动地址&#xff1a;CSDN21天学习挑战赛 前言 之前&#xff0c;我们使用 devmem 命令的方式&#xff0c;直接操作寄存器&#xff0c;控制 LED 的亮灭。 今天&#xff0c;我们在内核中使用 ioremap() 来实现该功能。 物理地址 vs 虚拟地址 在嵌入式 Linux 中&#xff0c;通常…

STM32和GD32的GPIO引脚的default(默认) alternate(引脚复用) remap(引脚重映射)三种用法 别把复用和重映射当一回事儿

STM32有很多内置外设&#xff0c;这些外设的外部引脚都是与GPIO复用的。也就是说&#xff0c;一个GPIO如果可以复用为内置外设的功能引脚&#xff0c;那么当这个GPIO作为内置外设使用的时候&#xff0c;就叫做复用 重映射就是引脚重映射&#xff0c;本来每个内置外设都有原来设…

OpenCV函数remap详解

OpenCV函数remap详解 remap的作用是将原影像映射到目标影像的函数。 这是OpenCV文档中的说明。 但这个描述给人的感觉是&#xff0c;云里雾里&#xff0c;到底是需要计算目标到原的映射关系&#xff0c;还是原到目标的映射呢。 经过我的实验发现是需要给出目标到原的映射关系…

remap函数

cvRemap( img1, img1r, mx1, my1 );在这个函数中mx1、my1是由前面函数计算出的校正系数&#xff0c;其指明了具体像素重新分配的位置。在learning opencv的12.3自带程序中可以发现&#xff0c;一般来说my1的值是比较集中的&#xff0c;mx1的值是比较分散的&#xff0c;这满足基…

Python-OpenCV 的 remap函数

恒等映射 result_img 和 原图一模一样 import cv2 import numpy as npimg cv2.imread("OpenCV.png") rows, cols, ch img.shape mapx np.ones(img.shape[:2], np.float32) mapy np.ones(img.shape[:2], np.float32) for i in range(rows):for j in range(cols)…

STM32重映射(Remap)

STM32重映射&#xff08;Remap&#xff09; 在外设的初始化中默认为Default重映射函数复用功能 在外设的初始化中默认为Default 在参考手册中 均有USART1的功能&#xff0c;但是若是想要用PB6与PB7作为USART1_TX与USART1_RX则需要用到重映射。 使用PA9 PA10只需要直接配置就…

Opencv remap函数

Opencv remap函数 函数签名实例应用亚像素信息扭曲特效 函数签名 void cv::remap ( InputArray src, OutputArray dst, InputArray map1, InputArray map2, int interpolation, int borderMode BORDER_CONSTANT, const Scalar & borderValue Scalar() ) 将通用几何变换…

OpenCV图像处理——重映射 remap函数

在《学习OpenCV3&#xff0c;OReilly系列丛书》中的第11章常见的图像变换中讲到的“任意映射”&#xff0c;Remap函数。函数cv::remap通常用来纠正校准的立体图像&#xff0c;包括图像变形和图像扭曲。其实这个函数在无人机拍摄延时摄影&#xff08;使用电子防抖算法&#xff0…

重映射:remap()函数

remap()函数会根据指定的映射形式&#xff0c;将原图像进行重映射几何变换&#xff0c;基于公式如下&#xff1a; dst(x, y) src( mapx(x, y), mapy(x, y) )函数原型C&#xff08;程序 / 20&#xff09;: void remap( InputArray src, OutputArray dst, InputArray map1, In…

OpenCV:remap()简单重映射

学习自&#xff1a;【OpenCV入门教程之十七】OpenCV重映射 重映射&#xff0c;就是把一幅图像中某位置的像素放置到另一个图片指定位置的过程。为了完成映射过程, 我们需要获得一些插值为非整数像素的坐标,因为源图像与目标图像的像素坐标不是一一对应的。一般情况下&#xff…

JS获取对象键值对中key值的方法

使用Object.keys Object.keys( ) 会返回一个数组&#xff0c;数组中是这个对象的key值列表 所以只要Object.keys(a)[0]&#xff0c; 就可以得只包含一个键值对的key值 下面是MDN中对Object.keys的描述 Object.keys() 方法会返回一个由一个给定对象的自身可枚举属性组成的数组&…