第四次作业

作业①

1.东方财富网股票数据爬取实验

实验要求
熟练掌握 Selenium 查找 HTML 元素、爬取 Ajax 网页数据、等待 HTML 元素等内容。使用 Selenium 框架+ MySQL 数据库存储技术路线爬取“沪深 A 股”、“上证 A 股”、“深证 A 股”3 个板块的股票数据信息。
候选网站:东方财富网(http://quote.eastmoney.com/center/gridlist.html#hs_a_board)
输出信息:MYSQL 数据库存储,表头包含序号、股票代码、股票名称、最新报价、涨跌幅、涨跌额、成交量、成交额、振幅、最高、最低、今开、昨收等信息。

核心代码
本实验的核心在于使用 Selenium 模拟用户操作,实现自动切换“沪深 A 股”、“上证 A 股”、“深证 A 股”三个板块,并分页抓取表格数据。
我去网页找了板块的Xpath:
1
为了实现翻页功能,我又去找了按钮的Xpath
2
在寻找完Xpath后,我定义了三个板块与按钮的 XPath 列表,通过循环点击切换板块。在每个板块下,程序遍历前两页,解析表格行(tr)并提取单元格(td)文本,最后将清洗后的数据持久化存储。

from selenium import webdriver
from selenium.webdriver.common.by import By
import time

# 初始化浏览器
op = webdriver.ChromeOptions()
dr = webdriver.Chrome(options=op)
dr.get('[https://quote.eastmoney.com/center/gridlist.html#hs_a_board](https://quote.eastmoney.com/center/gridlist.html#hs_a_board)')

# 定义三个板块的XPath,用于循环切换
bs = [
    '//*[@id="mainc"]/div/div/div[2]/ul/li[1]/a', 
    '//*[@id="mainc"]/div/div/div[2]/ul/li[2]/a', 
    '//*[@id="mainc"]/div/div/div[2]/ul/li[3]/a'
]

for b in bs:
    # 模拟点击切换板块
    btn = dr.find_element(By.XPATH, b)
    dr.execute_script("arguments[0].click();", btn)
    time.sleep(3) # 等待页面Ajax数据加载完成

    for p in range(2): # 遍历爬取前2页数据
        # 定位当前页表格中的所有行
        rs = dr.find_elements(By.XPATH, '//*[@id="mainc"]/div/div/div[4]/table/tbody/tr')

        for r in rs:
            tds = r.find_elements(By.TAG_NAME, 'td')
            if len(tds) < 14: continue # 跳过非数据行

            # 提取页面数据
            v1 = tds[1].text  # 股票代码
            v2 = tds[2].text  # 股票名称
            v3 = tds[4].text 
            # ... (提取最新报价、涨跌幅等其余10项数据)
            v12 = tds[13].text # 昨收

            # 执行SQL插入操作
            sql = "insert into stocks (stock_code, stock_name, ...) values (%s, %s, ...)"
            cur.execute(sql, (v1, v2, ... , v12))
        
        # 翻页逻辑:点击“下一页”
        if p < 1:
            nxt = dr.find_element(By.XPATH, '/html/body/div[1]/div[7]/div[2]/div/div/div[4]/div/a[2]')
            dr.execute_script("arguments[0].click();", nxt)
            time.sleep(2)

此外,我在本机创建了数据库
3
实验结果
4

2.心得体会

在本次实验中,通过使用 Selenium 爬取东方财富网的股票数据,我不仅巩固了动态网页爬取的技术,还解决了一些实际遇到的问题。首先,在访问目标网页时,我发现页面加载后会弹出广告窗口,遮挡页面并阻碍了后续的元素定位和操作。为了解决这个问题,我在代码中巧妙地加入了 input("去掉广告后回车") 语句。这使得程序在打开网页后暂停执行,给我留出时间手动关闭广告,确认页面干净后再回车继续运行,从而确保了自动化的稳定性。
其次,在分析表格数据结构时,我注意到 tr 标签下的 td 列表中,索引为 3 的元素(tds[3])实际上是一个包含图片的字段(通常表示“加自选”等图标),并非我所需要的文本数据。因此,在提取数据时,我特意跳过了 tds[3],代码中直接从 tds[2](股票名称)获取数据后,下一个字段直接取 tds[4](最新报价),从而保证了提取到的数据字段与数据库表结构的一一对应,提高了数据的准确性。

代码地址:https://gitee.com/changqianqi/2025_crawl-project/blob/master/4/1.py

作业②

1.中国MOOC网课程数据爬取实验

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

核心代码
本实验需要登录后获取个人课程信息,并深入每个课程的详情页抓取数据。
由于如果不登录到个人主页,就没有跳转课程详情的Xpath,我采用了“手动登录+自动爬取”的策略。程序启动后会暂停等待,登录完成后跳转至个人课程页。随后,程序提取所有课程详情页链接,利用 window.open 逐个打开新窗口,抓取课程名称、教师团队、进度及简介等详细字段。
5
课程详细信息的Xpath:
6
7
8
9
在代码中使用我找到的Xpath:

# 1. 打开首页并等待登录
dr.get("[https://www.icourse163.org/](https://www.icourse163.org/)")
input("登录完成后按回车键") 
dr.get("[https://www.icourse163.org/home.htm?userId=1476512181#/home/course](https://www.icourse163.org/home.htm?userId=1476512181#/home/course)")
time.sleep(5)

# ... (滚动页面并提取所有“查看课程介绍”链接到 urls 列表)

for u in urls:
    # 使用JS打开新窗口,避免覆盖当前列表页
    dr.execute_script(f"window.open('{u}');")
    dr.switch_to.window(dr.window_handles[-1]) # 切换句柄到新窗口
    time.sleep(3) 

    # 提取详情页数据
    n = dr.find_element(By.XPATH, '//span[contains(@class,"course-title")]').text
    
    # 处理复杂的教师团队字段
    ts = dr.find_elements(By.XPATH, '//*[@id="j-teacher"]//h3')
    t1 = ts[0].text # 主讲教师
    
    c_ele = dr.find_element(By.XPATH, '//*[@id="course-enroll-info"]/div/div[1]/div[4]/span[2]')
    cnt = c_ele.text.replace("已有", "").replace("人参加", "").strip()

    # 入库
    sql = "insert into course_info (cCourse, cCollege, cTeacher, cTeam, cCount, cProcess, cBrief) values (%s, %s, %s, %s, %s, %s, %s)"
    cur.execute(sql, (n, s, t1, t2, cnt, proc, info))
    
    # 关闭当前详情页,切回主窗口
    dr.close()
    dr.switch_to.window(dr.window_handles[0])

此外,类似的,我在mysql中创建对应的数据库
10
实验结果
11

2.心得体会

在进行中国 MOOC 网的爬取实验时,我主要攻克了模拟登录和多窗口管理两个难点。
首先,我发现如果不登录课程信息太多找不到隐藏的url,爬取难度极大,索性登录后发现显示出了自己的课程url,只需Xpath解析跳转即可。
其次,课程详情页的爬取需要在不丢失主列表页上下文的前提下进行。我利用 Selenium 的 window_handles 属性,配合 dr.switch_to.window() 方法,实现了在“课程列表页”与“课程详情页”之间的灵活切换。每爬取完一个详情页,我都会及时 dr.close() 并切回主句柄,这有效避免了浏览器开启过多标签页导致的资源耗尽问题。

代码地址:https://gitee.com/changqianqi/2025_crawl-project/blob/master/4/2.py

作业③

1.大数据实时分析处理实验

实验要求
掌握大数据相关服务,熟悉 Xshell 的使用。
完成华为云_大数据实时分析处理实验手册中的 Flume 日志采集任务

实验结果
环境搭建:开通 MapReduce 服务。

image
image

实时分析开发实战:编写 Python 脚本生成测试数据。
ssh远程连接
image
生成数据
image
配置 Kafka。
image
image

安装 Flume 客户端。
image
image
image

配置 Flume 采集数据。
image

2.心得体会

本次实验让我对大数据实时处理流程有了更直观的认识。在实验过程中,我首先通过 Xshell 连接到华为云 MRS 节点,体验了真实的云端开发环境。最开始在配置 Flume 时,由于对配置文件参数(IP 地址)填写错误,用了client的ip,导致 Flume 启动后无法连接 Kafka,报错 "Failed to deliver event"。通过查阅手册解决问题。

代码地址:https://gitee.com/changqianqi/2025_crawl-project/tree/master/4

posted @ 2025-11-26 21:16  changqianqi  阅读(0)  评论(0)    收藏  举报