【工作记录】基于可视化爬虫spiderflow实战天气数据爬取@20230618

news2024/11/18 10:40:48

前言

之前写过一篇关于可视化爬虫spiderflow的文章,介绍了基本语法并实战了某校园新闻数据的爬取。

还有一篇文章介绍了基于docker-compose快速部署spiderflow的过程,需要部署的话可参考该文章。

文章链接如下:

  • 可视化爬虫框架spiderflow入门及实战
  • 【工作记录】基于docker-compose快速部署springboot应用的实践

本文继续记录一下天气数据爬取的过程,供实现参考。

原始需求

近期接到运营中心一个业务需求,希望能获取到指定区域的天气数据,用于大屏展示,需要的参数包含:

  1. 该区域实时天气, 如气温、风向、AQI指数等
  2. 该区域3天及7天预报
  3. 该区域过去最近24小时气温、降水、相对湿度、空气质量等数据
  4. 该区域将来24小时预报,以3小时为间隔
  5. 气象台发布的该区域的预警信息

需求拆解

分析原始需求可分为三部分数据:

  1. 区域管理
  2. 天气数据
  3. 预警信息

具体说明如下:

  1. 区域管理中根据指定字段(比如enabled字段为1)来确定爬取数据的范围。
  2. 天气数据用于页面展示,包含需求里天气相关的数据
  3. 预警数据用于页面展示预警信息,需要预警来源、预警日期、预警内容、预警标题、图标

数据来源网站

1、关于天气数据的获取我们取中央气象台的数据,网址为: 西安-天气预报 (nmc.cn)

​ 上面网址是在页面上搜索框输入了西安后查询的数据页面,页面展示内容如下:
实时数据及七天预报数据
24小时整点实况数据

可以看到官方这个页面上包含了我们需求提到的天气相关的所有数据。

2、预警数据我们使用的网页为: 中央气象台官方网站-预警信号 (nmc.cn)

列表里可以选择省份以获取指定省份的预警数据,这里我们以陕西省为例,页面展示如下:

预警数据列表展示

预警详情页

详情页我们需要获取到预警内容用于展示。

开始设计

前期准备

  • 部署好spiderflow爬虫,可正常访问

​ 部署过程可参考【工作记录】基于docker-compose快速部署springboot应用的实践

  • 准备一个数据库用于存放对应数据

    要求能通过spiderflow服务器访问到该数据库即可

  • 通过spiderflow的页面,添加上面准备好的数据源,用于后续爬虫中的数据保存

页面数据来源分析

进入西安天气预报页面,网址为西安-天气预报 (nmc.cn)

打开开发者工具,找到网络-Fetch/XHR,可以看到如下界面:

区域数据来源分析1

可以看到区域数据是通过接口请求到的,在标头和负载可以看到具体的请求地址可参数。

在区域数据下面还有另外一个接口数据,如下:

天气数据来源分析

具体结构如下:

实时天气数据结构分析

七天内预报数据

过去24小时数据分析

至此天气相关数据就基本涵盖全了,只需要获取到相关数据并保存入库即可。

继续打开预警列表页面,选择陕西省,打开开发者工具,找到网络-Fetch/XHR

预警列表数据

预警内容数据

这样就找到了预警列表和预警内容的数据,同样需要获取到然后入库保存即可。

设计爬虫-区域数据获取与保存

  1. 打开爬虫web界面,进入爬虫列表,点击添加爬虫,命名为天气区域数据获取

  2. 拖入需要的组件并连接起来,分别是爬虫组件、循环组件和SQL组件,配置如下:

爬虫流程设计

说明如下:

  • 配置的地址即上面提到的获取区域数据的地址,爬虫完成后会得到一个resp的变量,也就是返回的json数据,我们可以通过${resp.json}获取到变量的数据。

  • 循环组件配置循环或集合参数为${rs.json}, 添加循环后可以得到item和index两个变量分别对应循环中的每一项和循环中的索引。

  • 执行SQL组件需要配置链接的数据源及需要执行的SQL脚本,脚本中可使用流程中的变量,这里我们用到的就是item

执行SQL组件配置如下图:

执行SQL组件配置

说明如下:

  • 脚本很简单跟正常的sql差不多,只不过里面的变量是通过#${XXx}#来写的。

  • 这里示例的是mysql数据库,其他数据库如有必要根据语法做相应修改即可。

  • 表结构也比较简单,就截图中的字段加上一个ID自增主键和create_time创建时间,建表语句就不在这里贴了。

  1. 设计完成后点击工具栏的保存,可以点击工具栏旁边的侧三角按钮运行,然后观察数据库的数据即可,正常情况下不报错数据就可以正常入库了。

区域数据爬虫结果

至此区域数据爬取并保存完成。

设计爬虫-天气数据获取与保存

前面我们提到区域表中存在一个字段enabled,如果为1的话我们才爬取它的数据,所以在爬虫中应该是这样一个流程:

  • 先查询出enabled值为1的所有区域数据,
  • 循环获取天气数据
  • 保存入库

具体配置过程如下:

  1. 回到爬虫列表继续添加爬虫,命名为天气数据获取

  2. 拖入相关组件并配置
    所有组件展示

​ 说明如下:

​ 1. 第一个执行SQL组件是为了筛选出所有enabled为1的区域数据,配置的sql也很简单,

select * from `mapdesign`.weather_zone where enabled = 1;

执行完成后会得到一个rs的变量,可以通过rs.json将数据转换成json结构方便后续使用, 通过${rs.json}来取值。

​ 2. 循环的集合配置的就是上面sql的结果: ${rs.json}

​ 循环流程后会得到item和index两个流程变量,分别对应每一条数据和集合中的索引。

​ 3. 爬虫组件配置如下:

爬虫配置

主要配置的就是个URL,可以根据页面上的接口地址看出拼接规律,item.code就是区域数据中的code值。

爬虫完成后会得到一个resp的变量, 可以通过resp.json转换成json结构,通过${resp.json}来取值使用。

​ 4. 定义变量

​ 为方便sql中变量的使用,我们可以使用定义变量组件提前定义好一些变量及其取值规则。

​ 具体配置如下:

获取变量配置

结合上面分析的天气数据的数据结构,相对来说比较好理解,不做赘述。

​ 5. 执行SQL

​ 前面已经定义好了变量,sql中便可以通过#${变量名}#来使用了。

​ 脚本配置如下:

insert into mapdesign.weather_data(`date`, city_code, `real`, `predict`, `last`, update_time, publish_time)
values(date(now()), #${item.code}#, #${real}#, #${predict}#, #${last}#, now(), #${pt}#)
on duplicate key update `real`=#${real}#, `predict`=#${predict}#, `last`=#${last}#, update_time=now(), publish_time=#${pt}#

​ weather_data表设计比较简单,所有数据都是以json结构存储的,除脚本中涉及到的字段外还有个ID自增主键。

​ 这里的数据保存设计就比较随意了,各位可以根据自己的喜好自行设计保存即可。

  1. 完成后点击工具栏的保存按钮,然后可以点击保存按钮右侧的侧三角来运行,观察数据库数据即可。

    正常情况不保错的话就可以正常入库了。

    结果数据如下:

    天气数据结果展示

至此天气数据的获取与保存就完成了。

设计爬虫-预警数据获取与保存

预警数据涉及到列表数据和详情数据的获取,需要两个爬虫和一个循环,设计如下流程:

告警数据获取流程设计

说明如下:

  1. 第一个爬虫获取的是列表,还是以陕西省为例,配置如下:

告警列表爬虫配置

  1. 定义变量

    在预警列表页面随便点击一个预警进入详情,可以看到详情页面的地址拼接方式为 "http://www.nmc.cn/publish/alarm/"+ ${item.id}.html , 这里定义的变量就是为了取到所有的列表数据json

    变量名为datalist, 变量值为${resp.json.jsonpath("data").jsonpath("page").get("list")}

  2. 循环

    循环组件不过多解释,循环的即可就是上面定义好的datalist, 即${datalist}

  3. 爬虫

    这个爬虫就是为了获取详情页面数据的,url配置为: http://www.nmc.cn/publish/alarm/${item.id}.html

    需要注意的是这里获取到的是一个html页面,我们需要通过路径匹配来取到页面中我们需要的数据。

  4. 定义变量

    这里主要是为了取到详情页面中的预警内容数据。

    配置变量名为alarmContent,变量值为${resp.html.selector("#alarmtext>p").text()}

    这个表达式的含义就是说取html中的id为alarmtext下面的p标签的文本内容

  5. 执行SQL

    除了alarmContent之外其余的数据都可以通过列表取到,如id, publish_time, title, icon等,在sql中使用#${item.xxx}#即可取到。

    最终配置的sql脚本如下:

    insert into `mapdesign`.alarm_data(alarm_id, title, icon, url, publish_time, update_time, alarm_content)
    values(#${item.alertid}#, #${item.title}#, #${item.pic}#, #${item.url}#, #${item.issuetime}#, now(), #${alarmContent}#)
    on duplicate key update title = #${item.title}#, alarm_content=#${alarmContent}#
    

    库名、表名、字段名及语法均可根据实际情况进行修改。

设计完成后保存运行,没有报错的话数据就可以正常入库了。

最终获取到的预警数据如下:

告警数据展示

至此预警数据获取与保存就完成了。

结语

本文记录了从分析到实践到测试完成天气数据爬取的过程,记录的比较细致。

作为一种实现思路,希望能对大家完成相关业务有所帮助。

对以上内容有任何疑问或者建议欢迎留言评论,看到后会及时回复~~~

创作不易,欢迎一键三连~~~

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

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

相关文章

基于SpringBoot+Vue+微信小程序的电影平台

✌全网粉丝20W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取项目下载方式🍅 一、项目背景介绍: 研究背景:…

【通过Data Studio连接openGauss---快速入门】

【通过Data Studio连接openGauss---快速入门】 🔻 一、访问openGauss🔰 1.1 确认连接信息(单节点)🔰 1.2 使用gsql访问openGauss(本地连接数据库)🔰 1.3 使用gsql访问openGauss&…

多道程序设计(操作系统)

目录 1 单道程序设计的缺点 2 多道程序设计的提出 3 多道程序设计的问题 多道程序设计目标: 多道程序设计是操作系统所采用最基本、最重要的技术,其根本目标是提高整个计算机系统的效率。衡量系统效率有一个尺度,那就是吞吐量。 提高系统…

clDice-一种新的分割标准-能够促进管状结构分割的连接性

clDice-a Novel Topology-Preserving Loss Function for Tubular StructureSegmentation论文总结 论文:clDice-A Novel Topology-Preserving Loss Function for Tubular Structure 源码:GitHub - jocpae/clDice 目录 一、论文背景和出发点 二、创新点 …

动态规划III (买股票-121、122、123、188、309)

CP121 买股票的最佳时机 题目描述: 给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。你只能选择 某一天 买入这只股票,并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利…

Advanced-C.04.函数

函数 函数的定义 包括两个部分,“函数头"和"函数体” 返回值类型 函数名(形参1,形参2,...)//函数头{}//函数体 函数类型决定返回值类型,执行函数需要调用 函数的返回值和参数可以是任何类型,包括空类型!!函…

Android adb shell命令捕获systemtrace

Android adb shell命令捕获systemtrace (1)抓取trace文件: adb shell perfetto -o /data/misc/perfetto-traces/trace_file.perfetto-trace -t 20s sched freq idle am wm gfx view binder_driver hal dalvik camera input res memory -t 时长,20s&a…

Java学习笔记23——集合进阶

集合进阶 集合进阶CollectionCollection集合常用方法Collection集合的遍历Iterator中的常用方法集合的使用步骤 List集合概述和特点List集合的特点List集合的特有方法并发修改异常ListIterator 列表迭代器常用方法增强for循环 数据结构栈队列数组链表 Set集合Set特点实现类Hash…

Presto(Trino)的逻辑执行计划和Fragment生成过程

文章目录 1. 前言2. 从SQL提交到Fragment计划生成全过程2.1 Statement生成2.2 对结构化的Statement进行分析2.3 生成未优化的逻辑执行计划2.4 基于Visitor模型对逻辑执行计划进行优化2.4.1 Visitor模型介绍2.4.2 Presto中常见的逻辑执行计划优化器常规OptimizerIterativeOptimi…

阿里月薪23k软件测试工程师:必备的6大技能(建议收藏)

随着软件开发行业的日益发展,岗位需求量和行业薪资都不断增长,想要入行的人也是越来越多,但不知道从哪里下手,今天,就给大家分享一下,软件测试行业都有哪些必会的方法和技术知识点,作为小白该从…

EmGU(4.7) 和C#中特征检测算法详解集合

C#联合Emgu实现计算机视觉任务(特征提取篇) 文章目录 C#联合Emgu实现计算机视觉任务(特征提取篇)前言一、Emgu库中特征提取有哪些类函数?二、特征提取函数1.AgastFeatureDetector类2.AKAZE 类3.FastFeatureDetector类4…

Docker部署(2)——实现两个容器互相访问并运行项目

一、拉取MySQL镜像,并启动镜像对应的容器 由于上一篇文章实现了拉取jdk8的环境,同时将jar包打成了一个镜像。但是要想真正的把项目运行起来(此处仅以单体项目为例)还需要MySQL的容器提供数据支持(当然这里面方法有多种…

深蓝学院C++基础与深度解析笔记 第 4 章 表达式

第 4 章 表达式 一、表达式基础 A、表达式: 由一到多个操作数组成&#xff0c;可以求值并 ( 通常会 ) 返回求值结果: #include <iostream> int main(){int x;x 3; }最基本的表达式&#xff1a;变量、字面值通常来说&#xff0c;表达式会包含操作符&#xff08;运算符…

Vue3项目中引入ElementUI使用详解

目录 Vue3项目中引入 ElementUI1.安装2.引入2.1 全局引入2.2 按需引入viteWebpack 3.使用 Vue3项目中引入 ElementUI ElementUI是一个强大的PC端UI组件框架&#xff0c;它不依赖于vue&#xff0c;但是却是当前和vue配合做项目开发的一个比较好的ui框架&#xff0c;其包含了布局…

TensorFlow详细配置(Python版本)

文章目录 TensorFlow详细配置(Python版本)安装Python环境&#xff08;Python全家桶 Anaconda3&#xff09;环境配置TensorFlow官网对照表CUDA安装cuDNN 安装TensorFlow安装Jupyter Notebook使用方法其他问题 TensorFlow详细配置(Python版本) 安装Python环境&#xff08;Python…

51 最佳实践-安全最佳实践-qemu-ga

文章目录 51 最佳实践-安全最佳实践-qemu-ga51.1 概述51.2 操作方法 51 最佳实践-安全最佳实践-qemu-ga 51.1 概述 qemu-ga&#xff08;Qemu Guest Agent&#xff09;它是运行在虚拟机内部的守护进程&#xff0c;它允许用户在host OS上通过QEMU提供带外通道实现对guest OS的多…

【面试】线上Java程序占用 CPU 过高请说一下排查方法?

文章目录 前言模拟一个高 CPU 场景排查步骤第一步&#xff0c;使用 top 找到占用 CPU 最高的 Java 进程第二步&#xff0c;用 top -Hp 命令查看占用 CPU 最高的线程第三步&#xff0c;保存线程栈信息第四步&#xff0c;在线程栈中查找最贵祸首的线程 前言 这个问题可以说是 Ja…

【java】JDK21 要来了

文章目录 前言更丝滑的并发编程模式虚拟线程&#xff08;Virtual Threads&#xff09;结构化并发&#xff08;Structured Concurrency&#xff09;作用域值&#xff08;Scoped Values&#xff09; 试验一下虚拟线程的例子结构化编程的例子Scoped Values 的例子 前言 不过多久&…

算法与数据结构——递归算法+回溯算法——八皇后问题

八皇后问题 八皇后问题是一个经典的回溯算法问题&#xff0c;目的是在88的国际象棋棋盘上放置八个皇后&#xff0c;使得没有皇后可以互相攻击&#xff08;即没有两个皇后在同一行、同一列或同一对角线上&#xff09;。 回溯算法是一种解决问题的算法&#xff0c;它通过尝试所有…

软件质量保障QA

软件质量保障 目录概述需求&#xff1a; 设计思路实现思路分析1.alibaba guileline2.ckeckstyle3.findBugs4.PMD5.SourceMononiot 参考资料和推荐阅读 Survive by day and develop by night. talk for import biz , show your perfect code,full busy&#xff0c;skip hardness…