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

ops/2024/10/18 10:25:37/

文章目录

  • 三种抓取方式
  • 数据抓取的流程
  • 获取文章
    • 具体操作
  • 获取用户
  • 获取图片
    • 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
编写测试类

java">@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. 写入一次性任务
java">// 取消@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/),获取示例代码
java">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. 测试代码
java">  //抓取图片@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.ppmy.cn/ops/42029.html

相关文章

Spark SQL

一、简介 Spark SQL 是 Spark 用于结构化数据(structured data)处理的 Spark 模块。 1.特点: ➢ 数据兼容方面 SparkSQL 不但兼容 Hive&#xff0c;还可以从 RDD、parquet 文件、JSON 文件中获取数据&#xff0c;未来版本甚至支持获取 RDBMS 数据以及 cassandra 等 NOSQL 数据…

Docker 中快速构建 Redis Cluster 集群

Docker 中快速构建 Redis Cluster 集群 目录 前言环境准备 所需软件配置网络 构建 Redis Cluster 镜像 创建自定义 Dockerfile构建镜像 启动 Redis 节点容器 启动命令 配置 Redis Cluster 集群 创建 Redis 集群验证集群状态 总结 前言 Redis 是一个高性能的键值对数据库&am…

头歌答案哪里找

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

MotionDiffuse: Text-Driven Human Motion Generation withDiffusion Model # 论文阅读

URL https://arxiv.org/pdf/2208.15001 主页&#xff1a;https://mingyuan-zhang.github.io/projects/MotionDiffuse.html TD;DR 22 年 8 月商汤的文章&#xff0c;引用量 200。基于 SD&#xff0c;任务是输入文本的动作描述&#xff0c;生成对应的动作序列。 已有的 moti…

React 学习-4

1.React 事件处理-传入函数作为事件处理函数 <button onClick{activateLasers}>激活按钮 </button> 注意事项&#xff1a;&#xff08;1&#xff09;阻止默认行为必须使用preventDefault,不能使用return false &#xff08;2&#xff09;ES6 class 语法来定义一个…

RabbitMQ的基本组件有哪些?

RabbitMQ的基本组件有哪些&#xff1f; RabbitMQ介绍、解耦、提速、削峰、分发 详解、RabbitMQ安装 可视化界面讲解 RabbitMQ 不生产消息&#xff0c;他是消息的搬运工。 1. Producer: 消息的发布者。 2. Connection:producer/comsumer 和 Message Broker 之间的 TCP 连接。 3…

Jmeter用jdbc实现对数据库的操作

我们在用Jmeter进行数据库的操作时需要用到配置组件“JDBC Connection Configuration”&#xff0c;通过配置相应的驱动能够让我们通过Jmeter实现对数据库的增删改查&#xff0c;这里我用的mysql数据库一起来看下是怎么实现的吧。 1.驱动包安装 在安装驱动之前我们要先查看当前…

软件工程期末复习(3)软件生命周期

软件生命周期 一般问题的解决过程&#xff1a; 问题的阐述&#xff1a;界定问题&#xff0c;用较宽的范围而不是细节来定义和描述待解问题&#xff1b; 问题的分析&#xff1a;问题定义的提炼&#xff0c;把问题分成可以理解和处理的子问题&#xff0c;进而提供基本细节&…