数据采集与融合技术实践作业四
作业1:Selenium 爬取数据任务
1. 作业思路与步骤
Gitee文件夹链接:https://gitee.com/nongchenc/crawl_project/blob/master/作业四/4.1.py
本次作业的任务是使用 Selenium 框架爬取 “沪深A股”、“上证A股” 和 “深证A股” 三个板块的股票数据,并存储到 MySQL 数据库中。以下为具体实现步骤:
(1)功能实现
- URL与板块设置:为每个股票板块指定其 URL。
- Selenium 页面加载与等待:
- 通过 WebDriverWait等待页面数据加载完成。
- 确保股票列表表格元素可见。
- 数据提取:
- 使用 CSS 选择器定位表格行和各列,逐行读取数据。
- 提取的字段包括:股票代码、名称、最新报价、涨跌幅等。
- 数据存储:
- 将爬取的股票数据插入到 MySQL 数据库表 stocks 中,避免重复插入。
- 翻页处理:
- 模拟点击下一页按钮,爬取每个板块的前 4 页数据。
- 遇到无下一页的情况,自动停止。
(2)关键点与优化
- 异常处理:处理页面加载超时、元素找不到等情况。
- 数据转换:处理带单位的数字(如“万”“亿”)及特殊字符。
- 延时策略:在翻页和滚动操作间加入随机延时,避免被封。
(3)运行结果
成功爬取了三个板块的股票数据并存储到数据库中。
2. 部分代码展示与运行截图
以下为部分关键代码及运行截图:
(1)定义转换函数
def convert_to_float(value):
try:
if isinstance(value, str):
value = value.strip()
if value in ['-', '']: # 处理 `-` 或空值
return None
if '万' in value:
return float(value.replace('万', '').replace(',', '').strip()) * 10000
if '亿' in value:
return float(value.replace('亿', '').replace(',', '').strip()) * 100000000
if '%' in value:
return float(value.replace('%', '').strip()) / 100
return float(value) if value else None
except (ValueError, TypeError):
return None
(2)数据提取代码
# 爬取前 4 页的数据
page = 1
while page <= 4:
print(f"正在加载 {board_name} 板块第 {page} 页数据...")
# 遍历每行股票数据
rows = driver.find_elements(By.CSS_SELECTOR, "#table_wrapper-table > tbody > tr")
for row in rows:
try:
data = {
'sequence': convert_to_float(row.find_element(By.CSS_SELECTOR, "td:nth-child(1)").text), # 获取序号
'bStockNo': row.find_element(By.CSS_SELECTOR, "td:nth-child(2) a").text,
'name': row.find_element(By.CSS_SELECTOR, "td:nth-child(3) a").text,
#其他数据省略
}
print(data)
save_to_database(data)
(3)运行结果截图
-
控制台输出:
-
数据库数据:
3. 作业心得
通过此次作业,学会了使用 Selenium 爬取动态数据,体会到以下几点:
- 爬取前分析网站结构非常重要:了解表格 HTML 结构和动态加载方式是关键。
- 异常处理与优化:通过处理超时、滚动加载等问题,提升了代码的稳定性。
- 结合数据库存储:不仅实现了数据抓取,还巩固了数据库的操作技能。
作业2:中国MOOC网课程信息爬取
1. 作业思路与步骤
Gitee文件夹链接:https://gitee.com/nongchenc/crawl_project/blob/master/作业四/4.2.py
任务目标是爬取中国MOOC网的课程信息,包括课程名称、学校名称、主讲教师、课程简介等,并存储到 MySQL 数据库。
(1)主要步骤
- 网站分析:
- 使用浏览器开发者工具,分析课程列表的 HTML 结构。
- 确定动态数据加载方式,使用 Selenium 模拟用户操作。
- 数据提取与处理:
- 对无法直接获取的字段(如团队成员),添加条件处理。
- 数据库设计:
- 建立 mooc 数据表,字段包括:课程名称、学校名称、主讲教师、团队成员、参加人数等。
- 翻页逻辑:
- 模拟翻页,爬取多个页面的数据。
- 异常与优化:
- 加入滚动加载、随机延时,模拟真实用户行为,避免触发反爬机制。
(2)运行结果
爬取了指定页数的课程信息,并成功存入数据库。
2. 部分代码展示与运行截图
(1)课程数据提取代码
for link in browser.find_elements(By.XPATH, '//div[@class="u-clist f-bgw f-cb f-pr j-href ga-click"]'):
try:
course_name = link.find_element(By.XPATH, './/span[@class=" u-course-name f-thide"]').text
school_name = link.find_element(By.XPATH, './/a[@class="t21 f-fc9"]').text
m_teacher = link.find_element(By.XPATH, './/a[@class="f-fc9"]').text
process = link.find_element(By.XPATH, './/span[@class="txt"]').text
introduction = link.find_element(By.XPATH, './/span[@class="p5 brief f-ib f-f0 f-cb"]').text
save_to_database(course_name, school_name, m_teacher, process, introduction)
except Exception as e:
print("数据提取出错:", e)
(2)数据库存储代码
def save_to_database(course_name, school_name, m_teacher, process, introduction):
conn = pymysql.connect(**db_config)
cursor = conn.cursor()
cursor.execute(
"INSERT INTO mooc (`course`, `college`, `teacher`, `process`, `brief`) "![](https://img2024.cnblogs.com/blog/3512114/202411/3512114-20241119212559537-1673402019.png)
![](https://img2024.cnblogs.com/blog/3512114/202411/3512114-20241119212613950-534024220.png)
"VALUES (%s, %s, %s, %s, %s)",
(course_name, school_name, m_teacher, process, introduction)
)
conn.commit()
conn.close()
(3)运行结果截图
-
控制台输出:
-
数据库数据:
3. 作业心得
完成中国MOOC网的爬取任务,收获如下:
- 爬取动态内容的技巧:掌握了通过 Selenium 处理滚动加载和翻页的策略。
- 爬取多字段数据的精细化处理:针对每个字段,使用不同的解析方式,保证数据准确性。
- 优化与防反爬:通过延时、禁用图片等方式,减少了被封的风险。
作业3:大数据实验总结
1. 实验内容回顾
本次实验在华为云上完成了以下任务:
登录MRS的master节点服务器
编写Python脚本
创建存放测试数据的目录
执行脚本测试
校验下载的客户端文件包
安装Kafka运行环境
安装Kafka客户端
在kafka中创建topic
安装Flume运行环境
配置Flume采集数据
有数据产生
2. 实验心得
通过实验,深刻理解了大数据日志采集的流程,尤其是 Flume 与 Kafka 的交互。在实践中增强了对实时数据处理架构的理解,同时熟悉了华为云的环境配置流程。