数据采集实践4

news/2024/11/19 12:41:03/文章来源:https://www.cnblogs.com/xiaowang254/p/18554616
课程链接 https://edu.cnblogs.com/campus/fzu/2024DataCollectionandFusiontechnology
作业链接 https://edu.cnblogs.com/campus/fzu/2024DataCollectionandFusiontechnology/homework/13288
gitee仓库链接 https://gitee.com/wd_b/party-soldier-data-collection/tree/master/数据采集实践4

作业一

  • 数据采集实验

gitee链接:https://gitee.com/wd_b/party-soldier-data-collection/tree/master/数据采集实践4/作业1
实验要求:熟练掌握 Selenium 查找HTML元素爬取Ajax网页数据等待HTML元素等内容。
使用 Selenium 框架+ MySQL 数据库存储技术路线爬取沪深 A 股、上证 A 股、深证A股3个板块的股票数据信息。
候选网站:东方财富网:http://quote.eastmoney.com/center/gridlist.html#hs_a_board
源码链接:https://gitee.com/wd_b/party-soldier-data-collection/blob/master/数据采集实践4/作业1/作业1.py
作业运行代码

点击查看代码
import sqlite3
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import time
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.chrome.options import Options
import os
def main():# 配置Chrome选项chrome_options = Options()chrome_options.add_argument('--disable-gpu')chrome_options.add_argument('--no-sandbox')chrome_options.add_argument('--disable-dev-shm-usage')chrome_options.add_argument('--window-size=1920,1080')# 使用Python38的Scripts目录chromedriver_path = r'C:\Python38\Scripts\chromedriver.exe'service = Service(chromedriver_path)driver = webdriver.Chrome(service=service, options=chrome_options)# SQLite数据库文件路径db_path = 'stock.db'try:# 创建数据库和表create_database_and_tables(db_path)# 爬取三个板块的数据urls = {'hs_a_stock': 'http://quote.eastmoney.com/center/gridlist.html#hs_a_board','sh_a_stock': 'http://quote.eastmoney.com/center/gridlist.html#sh_a_board','sz_a_stock': 'http://quote.eastmoney.com/center/gridlist.html#sz_a_board'}for table_name, url in urls.items():print(f"正在爬取{table_name}数据...")stock_data = get_stock_data(driver, url)if stock_data:save_to_sqlite(stock_data, table_name, db_path)time.sleep(3)except Exception as e:print(f"程序运行出错:{str(e)}")finally:driver.quit()
def create_database_and_tables(db_path):"""创建SQLite数据库和表"""conn = sqlite3.connect(db_path)cursor = conn.cursor()try:# 创建三个表tables = {'hs_a_stock': '沪深A股','sh_a_stock': '上证A股','sz_a_stock': '深证A股'}for table_name, description in tables.items():create_table_sql = f"""CREATE TABLE IF NOT EXISTS {table_name} (id INTEGER PRIMARY KEY AUTOINCREMENT,stock_code TEXT,stock_name TEXT,latest_price REAL,change_percent REAL,change_amount REAL,volume REAL,turnover REAL,amplitude REAL,high_price REAL,low_price REAL,open_price REAL,prev_close REAL,update_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP);"""cursor.execute(create_table_sql)print(f"表 {table_name} 创建成功")conn.commit()finally:cursor.close()conn.close()
def get_stock_data(driver, url):"""获取股票数据"""try:driver.get(url)time.sleep(5)  # 等待页面加载# 等待表格元素出现wait = WebDriverWait(driver, 10)table = wait.until(EC.presence_of_element_located((By.CLASS_NAME, 'table_wrapper-table')))# 获取所有行rows = table.find_elements(By.TAG_NAME, 'tr')stock_data = []for row in rows[1:]:  # 跳过表头cols = row.find_elements(By.TAG_NAME, 'td')if len(cols) >= 13:stock = {'stock_code': cols[1].text,'stock_name': cols[2].text,'latest_price': convert_to_float(cols[3].text),'change_percent': convert_to_float(cols[4].text.strip('%')),'change_amount': convert_to_float(cols[5].text),'volume': convert_volume(cols[6].text),'turnover': convert_volume(cols[7].text),'amplitude': convert_to_float(cols[8].text.strip('%')),'high_price': convert_to_float(cols[9].text),'low_price': convert_to_float(cols[10].text),'open_price': convert_to_float(cols[11].text),'prev_close': convert_to_float(cols[12].text)}stock_data.append(stock)return stock_dataexcept Exception as e:print(f"获取股票数据时出错:{str(e)}")return []
def save_to_sqlite(stock_data, table_name, db_path):"""保存数据到SQLite"""if not stock_data:returnconn = sqlite3.connect(db_path)cursor = conn.cursor()try:# 清空原有数据cursor.execute(f"DELETE FROM {table_name}")# 插入新数据insert_sql = f"""INSERT INTO {table_name} (stock_code, stock_name, latest_price, change_percent,change_amount, volume, turnover, amplitude,high_price, low_price, open_price, prev_close) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"""values = [(stock['stock_code'], stock['stock_name'], stock['latest_price'],stock['change_percent'], stock['change_amount'], stock['volume'],stock['turnover'], stock['amplitude'], stock['high_price'],stock['low_price'], stock['open_price'], stock['prev_close']) for stock in stock_data]cursor.executemany(insert_sql, values)conn.commit()print(f"成功保存 {len(stock_data)} 条数据到 {table_name}")except Exception as e:conn.rollback()print(f"保存数据时出错:{str(e)}")finally:cursor.close()conn.close()
def convert_to_float(value):"""转换字符串为浮点数"""try:return float(value)except (ValueError, TypeError):return 0.0def convert_volume(value):"""转换成交量/成交额"""try:if '万' in value:return float(value.replace('万', '')) * 10000elif '亿' in value:return float(value.replace('亿', '')) * 100000000return float(value)except (ValueError, TypeError):return 0.0
if __name__ == "__main__":main()

数据库gitee链接:https://gitee.com/wd_b/party-soldier-data-collection/blob/master/数据采集实践4/作业1/stock.db
数据库显示数据截图



  • 心得体会

学习了如何用selenium模拟网站访问相对应的网页,对selenium库丰富的方法和功能有初步了解

作业二

  • 数据采集实验

gitee链接:https://gitee.com/wd_b/party-soldier-data-collection/tree/master/数据采集实践4/作业2
作业要求:等待HTML元素等内容。使用Selenium框架+MySQL爬取中国 mooc网课程资源信息(课程号、课程名
称、学校名称、主讲教师、团队成员、参加人数、课程进度、课程简介)
候选网站:中国 mooc 网:https://www.icourse163.org
输出信息:MYSQL 数据库存储和输出格式
爬取大数据相关课程
源码链接:https://gitee.com/wd_b/party-soldier-data-collection/blob/master/数据采集实践4/作业2/作业2.py
作业运行代码

点击查看代码
from selenium import webdriver
from selenium.webdriver.common.by import By
import sqlite3
import time
driver = webdriver.Chrome()
driver.get('https://www.icourse163.org/')
time.sleep(1)
button = driver.find_element(By.XPATH, '//*[@id="app"]/div/div/div[1]/div[3]/div[3]/div')
# 对查找到的登录按钮元素执行点击操作,模拟用户点击登录按钮的行为
button.click()
time.sleep(1)
frame = driver.find_element(By.XPATH, "//div[@class='ux-login-set-container']//iframe")
# 将浏览器的操作焦点切换到查找到的iframe元素内,后续在该iframe内查找和操作登录表单相关的元素
driver.switch_to.frame(frame)
account = driver.find_element(By.ID, 'phoneipt').send_keys('13995109082')
password = driver.find_element(By.XPATH, '//input[@placeholder="请输入密码"]').send_keys("Wang1007")
button1 = driver.find_element(By.XPATH, '/html/body/div[2]/div[2]/div[2]/form/div/div[6]/a')
button1.click()
time.sleep(1)
url = 'https://www.icourse163.org/search.htm?search=%E5%A4%A7%E6%95%B0%E6%8D%AE#/'
driver.get(url)
# 连接到名为'courses.db'的SQLite数据库,如果数据库不存在则会创建一个新的数据库文件
conn = sqlite3.connect('courses.db')
cursor = conn.cursor()
cursor.execute('''create table ceb(id INTEGER,课程名称 text, 学校名称 text,老师 text,教师团队 text,参加人数 text, 课程进度 text, 课程简介 text)
''')
count = 0
link_list = driver.find_elements(By.XPATH, '//div[@class="u-clist f-bgw f-cb f-pr j-href ga-click"]')
# 遍历查找到的所有课程链接元素列表
for link in link_list:count += 1# 在当前课程链接元素内,通过XPATH定位方式查找课程名称元素,并获取其文本内容,即该课程的名称course_name = link.find_element(By.XPATH, './/span[@class=" u-course-name f-thide"]').text# 在当前课程链接元素内,通过XPATH定位方式查找学校名称元素,并获取其文本内容,即开设该课程的学校名称school_name = link.find_element(By.XPATH, './/a[@class="t21 f-fc9"]').text# 在当前课程链接元素内,通过XPATH定位方式查找主讲老师元素,并获取其文本内容,即主讲该课程的老师姓名teacher = link.find_element(By.XPATH, './/a[@class="f-fc9"]').texttry:# 在当前课程链接元素内,通过XPATH定位方式查找教师团队成员元素(可能是除主讲老师外的其他团队成员),并获取其文本内容team_member = link.find_element(By.XPATH, './/span[@class="f-fc9"]/span').text# 将获取到的教师团队成员姓名和主讲老师姓名拼接起来,用'、'隔开,形成完整的教师团队信息team_member = team_member + ' 、' + teacherexcept Exception as err:# 如果在获取教师团队成员信息时出现异常(比如没有找到相关元素),则将教师团队信息设置为'none'team_member = 'none'# 在当前课程链接元素内,通过XPATH定位方式查找参加人数元素,并获取其文本内容,然后去除其中的'参加'字样,只保留人数相关信息attendees = link.find_element(By.XPATH, './/span[@class="hot"]').textattendees.replace('参加', '')# 在当前课程链接元素内,通过XPATH定位方式查找课程进度元素,并获取其文本内容,即该课程的教学进度相关信息process = link.find_element(By.XPATH, './/span[@class="txt"]').text# 在当前课程链接元素内,通过XPATH定位方式查找课程简介元素,并获取其文本内容,即该课程的简要介绍内容introduction = link.find_element(By.XPATH, './/span[@class="p5 brief f-ib f-f0 f-cb"]').textcursor.execute('''insert into ceb(id,课程名称, 学校名称,老师,教师团队,参加人数, 课程进度, 课程简介)VALUES(?,?,?,?,?,?,?,?)''', (count, course_name, school_name, teacher, team_member, attendees, process, introduction))conn.commit()
cursor.close()
conn.close()

数据库gitee链接:https://gitee.com/wd_b/party-soldier-data-collection/blob/master/数据采集实践4/作业2/courses.db
数据库显示数据截图

  • 心得体会

使用 Selenium 自动化操作网页,从登录网易云课堂到获取课程搜索结果,经过自己的不断尝试,最终实现。通过 XPath 精准提取课程名称、学校、教师等多种信息,处理异常情况得当。利用 SQLite 数据库存储数据,结构清晰,代码整体展示出高效获取和存储网页数据的能力,让我体会到利用合适工具和方法实现复杂功能的魅力。

作业三

  • 数据采集实验

gitee文档链接:https://gitee.com/wd_b/party-soldier-data-collection/tree/master/数据采集实践4/作业3
实验要求:掌握大数据相关服务,熟悉 Xshell 的使用,完成文档华为云_大数据实时分析处理实验手册-Flume日志采集实验(部分)v2.docx 中的任务,即为下面 5 个任务
环境搭建

  • 任务一:开通 MapReduce 服务,截图如下


实时分析开发实战

  • 任务一:Python 脚本生成测试数据

Python脚本生成测试数据

使用more命令查看生成的数据

  • 任务二:配置 Kafka

下载Kafka客户端

安装Kafka客户端

配置Kafka

  • 任务三: 安装 Flume 客户端

安装Flume客户端

客户端运行环境安装成功

  • 任务四:配置 Flume 采集数据,截图如下

  • 心得体会

1.申请服务器时要认真配置服务器,尽快做实验并及时释放资源避免产生过多额外费用
2,实验内容是跟着实验书一步一步做的,还算顺利,了解了Python脚本生成测试数据、配置Kafka、安装Flume客户端、配置Flume采集数据这四个过程。

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

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

相关文章

违规生产检测视频分析服务器安全帽安全服检测批量操作功能教程

在工业自动化和智能化的浪潮中,视频监控系统正经历着从传统监控向智能监控的转变。视频分析服务器,作为这一转变的核心,正以其独特的优势在安全管理领域扮演着越来越重要的角色。本文将详细介绍视频分析服务器的技术特点、优势以及如何通过批量操作来提高监控效率和安全性。…

使用WebRTC技术搭建小型的视频聊天页面

目录目录 参考资料 什么是WebRTC? 能做什么? 架构图 个人理解(类比)核心知识点 核心知识点类比ICE框架 STUN(协议) NAT(网络地址转换) TURN SDP(会话描述协议) WebRTC的核心API现在开始做饭 准备阶段环境准备 服务器搭建 Coturn TURN server(开源服务) 部署 Signal Server信令…

HarmonyOS-Chat聊天室|纯血鸿蒙Next5 api12聊天app|ArkUI仿微信

自研原生鸿蒙NEXT5.0 API12 ArkTS仿微信app聊天模板HarmonyOSChat。 harmony-wechat原创重磅实战纯血鸿蒙OS ArkUI+ArkTs仿微信App聊天实例。包括聊天、通讯录、我、朋友圈等模块,实现类似微信消息UI布局、编辑器光标处输入文字+emo表情图片/GIF动图、图片预览、红包、语音/位…

Apache Dolphinscheduler数据质量源码分析

Apache DolphinScheduler 是一个分布式、易扩展的可视化数据工作流任务调度系统,广泛应用于数据调度和处理领域。 在大规模数据工程项目中,数据质量的管理至关重要,而 DolphinScheduler 也提供了数据质量检查的计算能力。本文将对 Apache DolphinScheduler 的数据质量模块进…

通过域名访问内网服务器

cloudflare优选ip访问家用服务器 前言 由于一直有使用markdown写笔记的需求,但是每次处理图片的时候总是很头疼。突然,我瞥见了还在角落里面吃灰小主机,因此萌生了废物利用想法,搭建一个外网可访问的图床。图床直接使用lsky-pro就可以,关键还是在外网访问上。 于是在网上看…

【算法】KMP 与 Z 函数

1. KMP 1.1 算法简介 可以做到线性匹配的快速匹配字符串的算法,并可以维护字符串最长公共前后缀,扩展出计算字符串周期。 在 OI 界 KMP 算法是字符串板块中很经典的算法,可以扩展出很多巧妙的解题技巧。 1.2 算法流程 1.2.1 字符串匹配 考虑 \(O(n^2)\) 暴力的匹配,瓶颈在于…

apifox使用小记

1.copy as cURL(cmd)之后在apifox里直接import cURL 2.调用时发生301错误 通常情况下是因为有session校验存在(用户校验)。解决方案: F12里将cookie里的session取到,在apifox里全局配置 这里踩了一个坑 第一次我是import了一个get请求,发送后发生301,所以我去设置了co…

毕业实习总结报告

毕业实习总结报告这既是毕业实习要求的总结报告,也是我对AutoSAR的一点理解,更是个人对未来生活的一点思考。我不希望把这份报告草草水过,而是希望把现在的感受记录下来,给以后的自己看一看,好记性不如记下来。涉及到工作细节和隐私的部分不在此展示了。时间像一头野驴呀,…

IDEA 2024 最新激活码,激活至2099(附有效idea激活码+激活工具)

IDEA 2024最新激活码,激活至2099(附有效idea激活码+激活工具)若提示We could not validate your license ff83b7bd51f5460ca43aabd7a96863a0.信息,idea激活时提示激活码失效解决方法: IDEA 2024 解决 We could not validate your license ff83b7bd51f5460ca43aabd7a96863a…

大学物理上册

质点作曲线运动时,质点在某一点的速度方向就是沿该点曲线的切线方向。

KingbaseES V8R6备份恢复案例之---sys_backup.sh init错误

KingbaseES 、sys_rman案例说明: KingbaseES V8R6数据库单实例环境,执行sys_backup.sh init时,出现“ repo_ip [127.0.0.1] must be located in local”错误,初始化失败。 适用版本:KingbaseES V8R6 一、问题现象 如下所示,执行sys_backup.sh init时出现以下故障:二、问…

鱼厂实习,光速转正了!

从最初那一份懵懂,到如今独立承担项目,回想这一路在鱼厂的成长,每一步都像是在重塑一个新的自己。今天要分享的这篇文章,比较特殊,是我们团队一位同事写的。主要分享了他从 0 开始学编程,再到加入鱼厂光速转正的故事。长达 6000 多字,诉说了自己四年多的经历,满满的真情…