数据采集与融合技术实践4

news/2025/12/9 23:32:58/文章来源:https://www.cnblogs.com/hhz07734/p/19273627

数据采集与融合技术实践4

任务一

任务要求

使用Selenium框架+ MySQL数据库存储技术路线爬取“沪深A股”、“上证A股”、“深证A股”3个板块的股票数据信息。
候选网站:东方财富网:http://quote.eastmoney.com/center/gridlist.html#hs_a_board

实验思路

我采用 Selenium 爬取东方财富网的“沪深A股、上证A股、深证A股”三个板块数据,并使用 MySQL 进行存储。程序通过 ChromeDriver 打开网页,利用隐式等待与 WebDriverWait 显式等待确保 Ajax 加载的股票表格完全显示。随后用 CSS 选择器定位 <table><tbody><tr>,逐行提取股票代码、名称、最新价、涨跌幅等字段,并对带逗号、百分号的数值做格式清洗。最终,使用 pymysql 将数据按英文表头批量插入数据库,实现从网页动态数据获取到结构化存储的完整流程。

flowchart LRB([初始化环境Selenium + MySQL])B --> C{遍历板块沪深A / 上证A / 深证A}C --> D[打开板块页面等待并解析表格数据]D --> E[清洗、转换数据并写入 t_stock]E --> H{还有未处理的行?}H -->|是| EH -->|否| I{还有未处理的板块?}I -->|是| CI -->|否| J([关闭浏览器关闭数据库连接])%% 样式定义classDef process fill:#E9F0FF,stroke:#4C6FFF,color:#1A2753;classDef decision fill:#FFE9B3,stroke:#D79B00,color:#5A3B00;%% 应用样式class B,D,E,J process;class C,H,I decision;

代码和图片

首先,在sql中创建好数据表,随后编写程序,通过 Selenium 启动 Chrome 浏览器并设置隐式等待

    #建立与数据库的链接conn = pymysql.connect(host="127.0.0.1",port=3306,user="root",password="07734",database="stockdb",charset="utf8mb4")#选择好driveroptions = webdriver.ChromeOptions()options.add_argument("--start-maximized")driver = webdriver.Chrome(options=options)driver.implicitly_wait(10)#设置隐式等待wait = WebDriverWait(driver, 20)time.sleep(2)rows = wait.until(EC.presence_of_all_elements_located((By.CSS_SELECTOR, "table tbody tr")))

一开始,进入网页时,会有一个弹窗,不过测试以后发现并不影响
image

通过观察可以发现,我们要的数据保存在table下的tbody中的tr块之中
image
所以我使用css选择器,找到所有<table><tbody><tr>下的数据做成列表,并逐一取出

    rows = wait.until(EC.presence_of_all_elements_located((By.CSS_SELECTOR, "table tbody tr")#选出所有\<table\>\<tbody\>\<tr\>下的数据))for row in rows:tds = row.find_elements(By.TAG_NAME, "td")if len(tds) < 14:continuestock_no = tds[1].text.strip()#序号stock_name = tds[2].text.strip()#名字,同时3里面的数据不是我们要的,所有就不取了def to_float(x: str):x = x.replace(',', '').replace('%', '').strip()return float(x) if x not in ("", "--") else Nonelatest = to_float(tds[4].text)#最新价change_pct= to_float(tds[5].text)#涨跌幅change_amt = to_float(tds[6].text)#涨跌额volume = tds[7].text.strip()#成交量turnover = tds[8].text.strip()#成交额amplitude= to_float(tds[9].text)#振幅high_price = to_float(tds[10].text)#最高low_price = to_float(tds[11].text)#最低open_price = to_float(tds[12].text)#今开pre_close= to_float(tds[13].text)#昨收

最后,将这些数据存到数据库里建好的表之中

    sql = """INSERT INTO t_stock(board, bStockNo, bStockName, latestPrice,changePct, changeAmt, volume, turnover,amplitude, highPrice, lowPrice, openPrice, preClose)VALUES(%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s)"""#用来后续存数据的语句data = (board_code,stock_no, stock_name, latest,change_pct, change_amt, volume, turnover,amplitude, high_price, low_price, open_price, pre_close)#这里的这些数据已经在前文中被取好cur.execute(sql, data)#执行语句

接下来,运行程序,并在sql中查看结果,这里就先展示十条。
mysql:
2707f600aba82d172c999414bcc9c9a7

实验心得

通过这次实验,我对 Selenium 自动化爬虫和 MySQL 数据库存储有了真正的实践认识。之前只知道网页数据能被爬取,但动手做之后才发现动态加载、元素等待、数据清洗这些步骤都非常关键。像东方财富这种 Ajax 页面,表格内容不是马上出现的,一开始总是抓不到 行,后来通过 WebDriverWait 配合显式等待才成功解决。爬取过程中也遇到过 HTML 行列不齐、 不够导致越界的问题,我通过判断列数跳过异常行,保证数据准确。另外,许多数字带逗号、百分号或显示为“--”,无法直接转成 float,我就写了 to_float() 来统一清洗数据。数据库部分也因为字段类型不匹配报过错,检查表结构并改成合适的类型后才正常插入。

任务二

任务要求

熟练掌握 Selenium 查找HTML元素、实现用户模拟登录、爬取Ajax网页数据、等待HTML元素等内容。
使用Selenium框架+MySQL爬取中国mooc网课程资源信息(课程号、课程名称、学校名称、主讲教师、团队成员、参加人数、课程进度、课程简介)
候选网站:中国mooc网:https://www.icourse163.org
输出信息:MYSQL数据库存储和输出格式

实验思路

首先便是我认为这个实验里面最难的部分————登录机制。首先,该网站的登录表单是嵌在一个动态加载的 iframe 里,必须先切换到 iframe 才能找到手机号和密码输入框,否则 Selenium 一直定位不到元素。同时,登录页面整体是 Ajax 异步加载的,元素不是一次性渲染出来的,如果不配合显式等待,很容易出现“找不到元素”或元素尚未可点击的异常。如果选择手动登录再自动爬取的话,那这些就都不用考虑了,但是这样会使得爬取还需要手动操作,总感觉少点味。所以我最后还是决定尝试用代码自动爬取。
登录部分的流程大致是这样:程序先通过 Selenium 启动 Chrome 浏览器,打开慕课的登录页面,简单等待几秒。接着,登录表单其实是嵌在一个 iframe 里的,所以我先用 WebDriverWait 等待 iframe 加载好,并切换到这个 iframe 中,再在里面用 ID 和 CSS 选择器分别定位到手机号输入框(id="phoneipt")和密码输入框。找到输入框之后,先清空原有内容,再依次输入手机号和密码,然后在密码框中发送回车键提交表单。最后程序等待几秒,让服务器完成验证,并切回到主页面,同时打印当前页面标题和 URL,用来确认登录是否成功。
后面的步骤就比较经典了,登录成功后,构造包含关键词(如“大数据”)的搜索 URL(因为主页面的课程信息比较凌乱,不好爬取,所以选择搜索一个关进啊词来爬取),进入搜索结果页,等待异步加载完成,再按课程卡片的外层 div 依次找到每一门课程。对每个课程卡片,通过 CSS 选择器提取课程名称、学校名称、主讲教师、教师团队、参加人数、课程进度和课程简介等字段,把它们存下来。最后使用 pymysql 连接本地 MySQL,将这些课程信息批量插入到事先建好的 mooc_course 表中,本实验就完成了。

graph LRA([开始]) --> B[启动浏览器]B --> C[自动登录 MOOC]C --> D[打开搜索页(关键词“大数据”)]D --> E[等待课程卡片加载]E --> F[解析课程信息列表]F --> G[批量写入 MySQL]G --> H([结束])%% 样式定义classDef startEnd fill:#4C6FFF,stroke:#2740FF,color:#ffffff,stroke-width:2px;classDef step fill:#E0F2FF,stroke:#4C6FFF,color:#111827,stroke-width:1px;classDef highlight fill:#FDE68A,stroke:#F59E0B,color:#78350F,stroke-width:1px;%% 节点应用样式class A,H startEnd;class B,D,E,F,G step;class C highlight;

代码和图片

首先是登录界面
image
红框的部分就是密码区域,可以看到页面同时存在两个 input type="password":上面那个带有 style="display: none",是隐藏的假输入框,真正可输入密码的是下面那个带 class="j-inputtext dlemail" 的元素,所以在 Selenium 中必须用 input.j-inputtext.dlemail[type='password'] 这样的 CSS 选择器去定位。不然就会掉到假输入框的坑里。
相关代码:

    name_input = wait.until(EC.element_to_be_clickable((By.ID, "phoneipt")))pass_input = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, "input.j-inputtext.dlemail[type='password']")))

找到以后,就输入密码,并且发送回车提交

    name_input.clear()name_input.send_keys(phone)time.sleep(0.3)pass_input.clear()pass_input.send_keys(password)time.sleep(0.3)pass_input.send_keys(Keys.RETURN)

这样才能登录上去。
登录以后就好办了,先把关键词(我这里用的是“大数据”)用 quote 做 URL 编码,拼成搜索地址并用 Selenium 打开搜索结果页。由于课程列表是 Ajax 异步加载的,所以先用 WebDriverWait 等待页面中出现若干个 div._3NYsM 这种课程卡片外层元素,再稍微 sleep 一下保证内容渲染完成。接着通过 find_elements 拿到所有课程卡片,在卡片内部用 CSS 选择器依次提取课程名称、学校名称、主讲教师、教师团队、课程简介、课程进度等字段,对“xxx人参加”这一栏用正则把人数的数字提出来。后面存入数据库。
这是我们要的数据保存的地方,可以发现由于网页显示字体里面,有些颜色不一样(比如“大数据”三个字),导致一段字被存在了不同的span块中,不过我用safe_text(By.CSS_SELECTOR, "div.m7l9I div._1vfZ-")这样的语句能直接提取并拼接出来。
image
这里是课程进度和参加人数,可以用同样的方式爬取下来。
image

相关代码:

    encoded_kw = quote(keyword)search_url = f"https://www.icourse163.org/search.htm?search={encoded_kw}#/"driver.get(search_url)#等课程卡片加载出来WebDriverWait(driver, 15).until(lambda d: len(d.find_elements(By.CSS_SELECTOR, "div._3NYsM")) > 0)time.sleep(2)#再等一会儿,防止内容没渲染完cards = driver.find_elements(By.CSS_SELECTOR, "div._3NYsM")print("找到课程数量:", len(cards))data_list = []seen = set() #这个是去重用的for card in cards:if len(data_list) >= max_num:breakinfo = parse_course_card(card)name = info["cCourse"]college = info["cCollege"]if not name:continuekey = (name, college)if key in seen:continueseen.add(key)data_list.append(info)

后面把拿到的data_list存到数据库就行

结果展示

自动登录的过程录像录像

过程全自动,包括登录部分,这里我用的是我自己的账号,我将账号和密码写在代码里,当出现登录窗口后便会自动输入,具体效果如下面的动图中所示
屏幕录制 2025-12-05 224710

sql数据

image
这里由于课程简介很长,所以就不全展示出来,而选择只展示前25个字符。

实验心得

这次的实验中,自动登录这一步让我卡了很久,最后我通过查阅博客园,csdn等网站,我才明白了有的网站会有多个输入框,而真正有效果的输入框只有一个。我的问题就是每次都会把账号密码输入到虚假的输入框里,在检查了网页结构后,我成功解决了这个问题,这次的实验让我受益匪浅。

任务三

任务要求

掌握大数据相关服务,熟悉Xshell的使用
完成文档 华为云_大数据实时分析处理实验手册-Flume日志采集实验(部分)v2.docx 中的任务,即为下面5个任务,具体操作见文档。
环境搭建:
任务一:开通MapReduce服务
实时分析开发实战:
任务一:Python脚本生成测试数据
任务二:配置Kafka
任务三: 安装Flume客户端
任务四:配置Flume采集数据

实验思路

首先,在云平台上购买并开通弹性公网IP、MapReduce服务、云数据库 RDS、数据湖探索等大数据相关服务,同时完成跨源激活,为后续组件之间的数据打通做好准备;随后开通数据可视化DLV 服务,用于后面的结果展示。环境就绪后,使用PuTTY远程登录到集群的master节点,进入/opt/client/目录,通过vi编写并运行Python脚本,用于自动生成一批测试数据。接着配置并安装 Kafka与Flume客户端:先解压安装包、完成客户端安装,再编写 Flume 配置,让 Flume 作为采集端把生成的测试数据采集并发送到Kafka中。最后创建Kafka消费者,实时消费并查看 Kafka 中的数据,同时再运行一次Python脚本生成新数据,验证从“数据生成 → Flume 采集 → Kafka 消费”的整条链路是通的

代码与图片

首先,购买弹性公网ip,MapReduce服务,云数据库服务RDS,数据湖探索服务等产品,同时进行跨源激活。
image
接着,开通数据可视化服务
进入DLV控制台,可以看到已开通完成
image

接着启动putty,准备开始实验
Python脚本生成测试数据,首先,登录master节点
image
进入/opt/client/目录,使用vi命令编写Python脚本
image

执行脚本,并查看生成数据
image

接着,配置Kafka,并安装Flume客户端
解压压缩包获取校验文件与客户端配置包
image

客户端安装成功界面:
image

接着配置Flume采集数据,创建消费者消费kafka中的数据,新开一个窗口,进入Python脚本所在目录,执行python脚本,再生成一份数据。返回原窗口,查看。
image

实验心得

一开始在控制台里开通弹性公网IP、MapReduce、RDS、数据湖探索、DLV等一堆云服务,其实挺懵的,但一步步把环境搭起来之后,再用PuTTY登录master节点、自己写Python脚本造测试数据,就能明显感受到“数据是怎么从产生到流动”的。后面配置Kafka和Flume时一开始总是连不通、消费不到数据,只能对着日志一点点排查,后面发现是kafka的路径不对。最后看到消费者窗口里成功打印出自己刚生成的那批数据,还是挺有成就感的。这次实验让我更直观地理解了数据采集、消息队列、实时消费这些概念。

github链接

https://gitee.com/hhz07734/parse/tree/master/practice_4

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

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

相关文章

12月9日日记

1.今天学习英语 2.明天马哲 3.Flter 配置的优先级?是否遗漏了 @WebFilter 注解(注解方式配置时)?

2025.12.9总结

今天把大数据的作业写完。基础层 (实验1-2): 环境与存储 技能获取: 熟练使用 Linux Shell 和 Hadoop HDFS Shell 进行系统与分布式文件管理。 核心认知: 理解分布式文件系统(HDFS)的核心思想——数据分块、多副本存储…

2025 最新路面胶粘剂厂家 TOP5 评测!路面胶粘剂优质国产品牌年度榜单,绿色环保 + 性能实证权威榜单发布,技术赋能重构路面工程生态 - 全局中转站

随着基础设施建设与城市更新的加速,路面胶粘剂作为保障道路安全、美观与耐久性的核心材料,市场需求持续攀升。本榜单基于环保性能、技术创新力、工程适配性、服务体系四大维度,结合行业权威数据与实际工程案例反馈,…

2025年国内十大检定器生产厂家实力排行榜,贯入式砂浆强度检测仪/回弹仪检定器/裂缝测深仪/裂缝测宽仪/数显碳化深度尺检定器供应厂家找哪家 - 品牌推荐师

在建筑工程质量检测、工业分析及科研实验等领域,检定器作为确保测量仪器准确性的关键设备,其重要性日益凸显。随着国内制造业向高端化、智能化迈进,一批拥有核心技术、注重品质与创新的检定器生产企业脱颖而出,构成…

2025 最新桥梁防腐涂料厂家 TOP5 评测!环保高性能 + 技术创新权威榜单发布,守护基础设施安全与耐久 - 全局中转站

随着基础设施建设的持续推进,桥梁作为交通命脉,其防腐保护需求日益凸显。桥梁防腐涂料作为延长桥梁使用寿命、保障结构安全的关键材料,市场对其性能、环保和耐久性要求不断提升。本榜单基于技术创新力、产品性能、行…

2025年权威推荐!水处理设备企业综合实力TOP4 - 极欧测评

在水处理设备采购中,企业用户往往面临“资质难辨、适配性差、售后无保障”等痛点,尤其是医疗、电子、食品等对水质要求严苛的行业,设备选择直接影响生产安全与效率。笔者结合近3年行业实测数据、120+企业案例反馈及…

Seata原理与简单示例 - 指南

Seata原理与简单示例 - 指南2025-12-09 23:15 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important;…

12/9

今日无事,下午上了一节英语,就没课了,快期末了

2025年最新盘点:本地最值得信赖的检定器供应商,高强回弹仪检定器/钢砧/云回弹仪/高强回弹仪/涂层测厚仪/楼板测厚仪检定器生产厂家电话 - 品牌推荐师

在建筑工程质量检测与科研分析领域,检定器的精度与可靠性直接关系到数据的权威性与工程的安全性。随着市场对检测设备智能化、数字化需求的不断提升,一批具备深厚技术积淀与稳定产品力的本土企业正脱颖而出。本文基于…

Alpha 阶段第二周 - OUC

12.04-12.10_第二周周报 基本情况 团队 ID:09 组长博客: 小组地址: https://github.com/LaurentZC/MarineFloatingDebrisDetectionSystem 小组成员:LaurentZC、morning-glory-qu、Locusclaer 冲刺概况汇报 小组任务…

成长?都是被逼出来的罢了

小时总把变得有能力,能够独立解决问题当成是梦寐以求的事情,殊不知货的能力并不是一件容易的事情。玄学的观点是万事万物都遵循着能量守恒定律,一方面的能力提升,必定使得另一方面的能力退化,鱼和熊掌不可兼得。 …

东方智慧的现代生成:论岐金兰AI元人文构想的思想本源、理论建构与文明意义

东方智慧的现代生成:论岐金兰AI元人文构想的思想本源、理论建构与文明意义 摘要:本文系统阐述岐金兰AI元人文构想,指出其并非对西方AI伦理理论的区域性应用或注脚,而是一套根植于中国传统文化深层智慧、并直面“人…

US$1209.35 Original Alientech KESS V3 KESS3 Master 12MonthsSubscription

The Challenge of Modern Vehicle Diagnostics and Tuning in Europe and America In today’s automotive landscape, European and American vehicles are increasingly complex, with advanced ECUs, adaptive syst…

JVM内存与GC机制全景深度剖析:从对象诞生到垃圾回收的完整生命周期

本文将从对象完整生命周期的视角,系统性地阐述JVM内存管理和垃圾回收机制。你将看到对象如何出生、如何存活、如何晋升,以及最终如何被回收的完整过程。 核心叙事线:一个对象的"人生旅程"出生:在堆内存中…

2025 最新桥梁防腐涂料厂家 TOP5推荐!绿色防腐 + 工程实证权威榜单发布,技术赋能守护基建安全 - 全局中转站

随着基础设施建设的持续推进,桥梁作为交通网络的关键节点,其防腐保护需求日益凸显。桥梁防腐涂料不仅需要具备卓越的耐候性、抗腐蚀能力,还需满足环保、安全等多重标准。本榜单基于产品性能、工程案例、环保认证、服…

数据采集实践第四次作业—102302131陈宇新

gitee:https://gitee.com/chenyuxin0328/data-collection/tree/master/作业4 作业1 熟练掌握 Selenium 查找 HTML 元素、爬取 Ajax 网页数据、等待 HTML 元素等内容。 使用 Selenium 框架+ MySQL 数据库存储技术路线爬…

Nginx日志切割

自己部署的个人服务器,主要使用Nginx服务器来做转发和展示很多的静态页面内容,因此每天的日志还是比较多。 日志多了之后,不可能所有的日志都放在同一个文件中,这时候,就需要考虑日志切割,自己是准备按照天保存。…

6502 算术逻辑单元(ALU)

算术逻辑单元(ALU)是 CPU 的核心部件,负责 CPU 内的各种算术运算。现代 CPU 的 ALU 无疑相当复杂,想要从晶体管或逻辑门级别对它的工作原理进行说明几乎不现实。但是 6502 CPU 是一款颇具知名度但又相对简单的 8 位…

make出错立即终止

make出错立即终止Make编译时错误处理与日志输出解决方案 在使用 make -j4 编译 u-Boot(或其他项目)时,实现“错误触发所有线程终止”和“错误日志单独输出”,可通过 make 自身参数 + 脚本辅助实现,以下是两种核心…

Testing Reprised之关于基米

Testing Reprised之关于基米2025.11.10 奇迹就是小有遗憾 你不要有情绪,有情绪就去唱雨中曲(注:今年11月以后我没有什么创作了,就是没有诗和小说,但是会写一些小东西,汇集起来叫做忒思廷大重奏,不知道什么时候有…