韵搜坊 -- java爬虫抓取数据

文章目录

  • 三种抓取方式
  • 数据抓取的流程
  • 获取文章
    • 具体操作
  • 获取用户
  • 获取图片
    • jsoup操作

三种抓取方式

  1. 直接调用请求接口(最方便,这里使用该方法) HttpClient,OKHttp,RestTemplate,Hutool
  2. 等网页渲染出明文内容后,从前端页面的内容抓取
  3. 有些网站可能是动态请求的,不会一次性加载所有的数据,而是要你点击某个按钮,输入某个验证码才会显示出数据 -> 无头浏览器

数据抓取的流程

  1. 分析数据源(怎么获取)
  2. 拿到数据后怎么处理
  3. 写入数据库等存储

获取文章

离线抓取方式

具体操作

  1. 过滤请求

image.png

  1. 将响应的数据复制到data/passage.json文件中

image.png

  1. 引入Hutool依赖
<!-- https://hutool.cn/docs/index.html#/ -->
<dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.8.16</version>
</dependency>
  1. 查看官方文档

https://hutool.cn/docs/index.html#/
image.png

  1. 编写测试类

获取用于爬虫的数据
image.png
编写测试类

@SpringBootTest
public class CrawlerTest {@Resourceprivate PostService postService;@Testvoid testFetchPassage() {//1.获取数据String json = "{\"current\":1,\"pageSize\":8,\"sortField\":\"createTime\",\"sortOrder\":\"descend\",\"category\":\"文章\",\"tags\":[],\"reviewStatus\":1}";String url = "https://api.code-nav.cn/api/post/search/page/vo";String result = HttpRequest.post(url).body(json).execute().body();//2.处理数据:json转对象Map<String, Object> map = JSONUtil.toBean(result, Map.class);JSONObject data = (JSONObject) map.get("data");JSONArray records = (JSONArray) data.get("records");List<Post> postList = new ArrayList<>();for (Object record : records) {Post post = new Post();JSONObject tempRecord = (JSONObject) record;post.setId(0L);post.setTitle(tempRecord.getStr("title"));post.setContent(tempRecord.getStr("content"));//这里将json数组转为列表再转为json字符串,不知道是为了干什么,为什么不直接把json数组转为json字符串呢?JSONArray tags = (JSONArray) tempRecord.get("tags");List<String> tagList = tags.toList(String.class);//            System.out.println(JSONUtil.toJsonStr(tags));post.setTags(JSONUtil.toJsonStr(tagList));System.out.println(JSONUtil.toJsonStr(tagList));post.setUserId(1L);postList.add(post);//3.写入数据库postService.saveBatch(postList);}}
}
  1. 写入一次性任务
// 取消@Component注释每次项目启动都会执行run任务
//@Component
@Slf4j
public class FetchInitPostList implements CommandLineRunner {@Resourceprivate PostService postService;@Overridepublic void run(String... args) {//1.获取数据String json = "{\"current\":1,\"pageSize\":8,\"sortField\":\"createTime\",\"sortOrder\":\"descend\",\"category\":\"文章\",\"tags\":[],\"reviewStatus\":1}";String url = "https://api.code-nav.cn/api/post/search/page/vo";String result = HttpRequest.post(url).body(json).execute().body();//2.处理数据:json转对象Map<String, Object> map = JSONUtil.toBean(result, Map.class);JSONObject data = (JSONObject) map.get("data");JSONArray records = (JSONArray) data.get("records");List<Post> postList = new ArrayList<>();for (Object record : records) {Post post = new Post();JSONObject tempRecord = (JSONObject) record;post.setId(0L);post.setTitle(tempRecord.getStr("title"));post.setContent(tempRecord.getStr("content"));//这里将json数组转为列表再转为json字符串,不知道是为了干什么,为什么不直接把json数组转为json字符串呢?JSONArray tags = (JSONArray) tempRecord.get("tags");List<String> tagList = tags.toList(String.class);//JSONUtil.toJsonStr(tags);post.setTags(JSONUtil.toJsonStr(tagList));post.setUserId(1L);postList.add(post);//3.写入数据库postService.saveBatch(postList);}}
}

获取用户

每个网站的用户都是自己的,没必要抓取

获取图片

实时抓取:我们自己的网站不存在这些数据,用户要搜的时候,直接从别人的接口(网站)去搜
image.png
jsoup库:获取到HTML文档,然后从中解析出需要的字段

jsoup操作

  1. 导入依赖
<!-- https://mvnrepository.com/artifact/org.jsoup/jsoup -->
<dependency><groupId>org.jsoup</groupId><artifactId>jsoup</artifactId><version>1.15.3</version>
</dependency>
  1. 打开官网 (https://jsoup.org/),获取示例代码
Document doc = Jsoup.connect("https://en.wikipedia.org/").get();
log(doc.title());
Elements newsHeadlines = doc.select("#mp-itn b a");
for (Element headline : newsHeadlines) {log("%s\n\t%s", headline.attr("title"), headline.absUrl("href"));
}
  1. 通过在网页前端html界面找对应的css选择器,拿到需要的内容
  2. 测试代码
  //抓取图片@Testvoid testFetchPicture() throws IOException {int current = 1;String url = "https://cn.bing.com/images/search?q=%E5%B0%8F%E9%BB%91%E5%AD%90&form=HDRSC2&first=" + current;Document doc = Jsoup.connect(url).get();Elements elements = doc.select(".iuscp.isv"); //数组,每个元素是每一张图片for (Element element : elements) {//取图片地址murlString m = element.select(".iusc").attr("m");Map<String,Object> map = JSONUtil.toBean(m, Map.class);String murl  = (String) map.get("murl");//取标题String title = element.select(".inflnk").attr("aria-label");System.out.println(murl);System.out.println(title);}}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/838742.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

第三十二天 | 46.全排列 47.全排列||

终于进入排列&#xff01;&#xff08;之前都是组合&#xff09; 排列和组合的区别&#xff1a;在数学上的区别都懂&#xff0c;主要是看在代码实现上有什么区别 题目&#xff1a;46.全排列 树型结构比较简单 用used标记某一元素是否使用过。在组合问题中&#xff0c;其实是…

【制作100个unity游戏之26】unity2d横版卷轴动作类游戏7(附带项目源码)

最终效果 系列导航 文章目录 最终效果系列导航前言血条 能量条UI配置画布绘制血条 能量条UI 头像框 延迟虚血源码完结 前言 欢迎来到【制作100个Unity游戏】系列&#xff01;本系列将引导您一步步学习如何使用Unity开发各种类型的游戏。在这第26篇中&#xff0c;我们将探索如何…

C语言指向结构体数组的指针如何应⽤?

一、问题 在使⽤数组时&#xff0c;可以⽤指向数组或数组元素的指针和指针变量。同样&#xff0c;在结构体类型的数组及其元素中也可以应⽤指针或指针变量来指向。具体怎么应⽤呢&#xff1f; 二、解答 在如下代码中实现指向结构体数组的指针的应⽤。 #include <stdio.h&g…

【华为OD机试-C卷D卷-200分】找城市(C++/Java/Python)

【华为OD机试】-(A卷+B卷+C卷+D卷)-2024真题合集目录 【华为OD机试】-(C卷+D卷)-2024最新真题目录 题目描述 一张地图上有n个城市,城市和城市之间有且只有一条道路相连:要么直接相连,要么通过其它城市中转相连(可中转一次或多次)。城市与城市之间的道路都不会成环。 当…

token存入前端的请求头中,后端获取【秒杀项目】

token存入前端的请求头中,后端获取【秒杀项目】 前言token存入前端的请求头中,后端获取【秒杀项目】token存入前端的请求头中后端获取 前言 2023-08-28 17:34:39 token存入前端的请求头中,后端获取【秒杀项目】 token存入前端的请求头中 function set_login_status() {var …

数据库设计大题详解

大题一&#xff1a;画E-R图&#xff08;概念结构设计&#xff09; 实体就是具体的物品&#xff0c;关系就是实体之间的关系&#xff0c;属性就是特征&#xff0c;内涵的意思 简单的小栗子&#xff1a; 1对1&#xff0c;1对n&#xff0c;n对m&#xff0c;自己考虑两者存在这个关…

PatterNodes 3 mac矢量图设计 ,色彩与图案的完美融合!

PatterNodes 3 for Mac是一款功能强大的矢量图形模式创建软件&#xff0c;专为Mac用户设计。它采用基于节点的界面&#xff0c;支持创建形状、线条、曲线或文本&#xff0c;以构建复杂的矢量图形模式。该软件还具备灵活的参数调整功能&#xff0c;允许用户实时预览结果并进行无…

根据参考风格进行矢量图绘制

摘要 利用机器学习根据给定的文本描述生成图像的技术已经取得了显著的进步&#xff0c;例如CLIP图像-文本编码器模型的发布&#xff1b;然而&#xff0c;当前的方法缺乏对生成图像风格的艺术控制。我们提出了一种方法&#xff0c;用于为给定的文本描述生成指定风格的绘图&…

Spring框架学习笔记(三):AOP编程

1 动态代理 1.1 通过案例理解动态代理 &#xff08;1&#xff09;需求说明&#xff1a; 1. 有 Vehicle接口(交通工具接口, 有一个 run 方法), 下面有两个实现类 Car 和 Ship 2. 当运行 Car 对象 的 run 方法和 Ship 对象的 run 方法时&#xff0c;输入如下内容, 注意观察前后…

HTML静态网页成品作业(HTML+CSS+JS)——在线购物商城网页设计制作(4个页面)

&#x1f389;不定期分享源码&#xff0c;关注不丢失哦 文章目录 一、作品介绍二、作品演示三、代码目录四、网站代码HTML部分代码 五、源码获取 一、作品介绍 &#x1f3f7;️本套采用HTMLCSS&#xff0c;使用Javacsript代码实现图片轮播切换&#xff0c;共有4个页面。 二、…

手机图片恢复不求人:手动找回丢失的照片!

无论是外出旅行、聚会还是日常点滴&#xff0c;我们总是习惯用手机记录下来&#xff0c;让美好的瞬间定格在一张张照片中。然而&#xff0c;有时因为误删、清空缓存或是更换手机&#xff0c;那些珍贵的照片突然消失了。手机图片恢复有什么简单易行、容易上手的方法吗&#xff1…

头歌答案哪里找

头歌EduCoder平台实训答案在此&#xff1a;实训笔记 有些作业是在难写&#xff0c;参考上面的连接地址吧&#xff0c;看看有没有自己想要的解答。

容器组件:角标组件,纵向拖动组件(HarmonyOS学习第四课【4.2】)

Badge&#xff08;角标组件&#xff09; 可以附加在单个组件上用于信息标记的容器组件。 说明 该组件从API Version 7开始支持。后续版本如有新增内容&#xff0c;则采用上角标单独标记该内容的起始版本。 子组件 支持单个子组件。 说明 子组件类型&#xff1a;系统组件…

Win端交叉编译鸿蒙Ohos Native层第三方库流程

1. 概述 鸿蒙端SDK开发需要依赖使用到的三方库(如OpenCV、其他C库等)&#xff0c;以下为Windows端交叉编译Ohos端三方库流程 2. 准备工作 与Android NDK交叉编译相类似&#xff0c;我们首先需要下载OpenHarmony NDK(包含在OpenHarmony SDK中)&#xff0c;这里笔者使用IDE中自…

Online RL + IL : Active Policy Improvement from Multiple Black-box Oracles

ICML 2023 paper code 紧接上一篇MAMBA&#xff0c;本文在同种问题设定下的在线模仿学习方法。 Intro 文章提出了一种新的模仿学习算法&#xff0c;名为 MAPS&#xff08;Max-aggregation Active Policy Selection&#xff09;和其变体 MAPS-SE&#xff08;Max-aggregation A…

SSL证书对于网络安全的重要作用

SSL证书是一种数字证书&#xff0c;它通过加密技术确保了客户端&#xff08;如浏览器&#xff09;与服务器之间的数据传输安全。当一个网站安装了SSL证书后&#xff0c;用户在浏览器地址栏中可以观察到HTTPS&#xff08;超文本传输安全协议&#xff09;前缀和挂锁图标&#xff…

点量云流分享:关于实时渲染云推流技术

提到云串流或者云推流很多人可能和游戏关联起来&#xff0c;其实这个技术的应用领域不仅仅是游戏&#xff0c;还有云上旅游、考古、智慧园区、智慧城市、虚拟仿真等等行业。其解决的问题是将一些大型的3D应用程序放在云端&#xff0c;程序在运行的时候也是在云端&#xff0c;这…

可视化大屏C位图:生产线,状态一目了然。

在可视化大屏中&#xff0c;将生产线作为C位图&#xff08;核心位图&#xff09;具有以下价值&#xff1a; 实时监控 生产线作为C位图可以实时展示生产线上的各个环节和工艺的运行状态。通过C位图&#xff0c;操作员可以直观地了解生产线的整体运行情况&#xff0c;及时发现异…

数仓建模理论 之 维度建模

说起维度建模&#xff0c;你不得不知道以下几个概念&#xff1a;事实表、维度表、星型模型、雪花模型、星座模型 维度建模 Ralph Kimball推崇数据集市的集合为数据仓库&#xff0c;同时也提出了对数据集市的维度建模&#xff0c;将数据仓库中的表划分为事实表、维度表两种类型…

为什么状态机最好要采用独热码

在状态机的编码方式中&#xff0c;我们常用到三种编码方式&#xff0c;分别是二进制编码、格雷码、独热码。 二进制编码&#xff1a;也称连续编码&#xff0c;属于压缩编码方式&#xff0c;可以使用较少的触发器对应更多的状态&#xff1b; 格雷码&#xff1a;属于压缩编码方…