102302133陈佳昕作业4

作业①:

要求:
熟练掌握 Selenium 查找HTML元素、爬取Ajax网页数据、等待HTML元素等内容。
使用Selenium框架+ MySQL数据库存储技术路线爬取“沪深A股”、“上证A股”、“深证A股”3个板块的股票数据信息。
候选网站:东方财富网:http://quote.eastmoney.com/center/gridlist.html#hs_a_board
输出信息:MYSQL数据库存储和输出格式如下,表头应是英文命名例如:序号id,股票代码:bStockNo……,由同学们自行定义设计表头:
Gitee文件夹链接:https://gitee.com/chen-jiaxin_fzu/2025_crawl_project/blob/master/作业4/1.py
(1)代码

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.edge.options import Options
import time
import sqlite3
#配置Edge浏览器
edge_options = Options()
edge_options.add_argument('--headless')
edge_options.add_argument('--disable-gpu')
edge_options.add_argument(
    '--user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36')
driver = webdriver.Edge(options=edge_options)

def stock_db():
    conn = sqlite3.connect('stocks.db')
    conn.execute('''
                 CREATE TABLE IF NOT EXISTS stock_info 
                (
                    module_name VARCHAR(20),
                    id INTEGER PRIMARY KEY AUTOINCREMENT,
                    code VARCHAR(20) NOT NULL,
                    name VARCHAR(20) NOT NULL,
                    new_price DECIMAL(10,2), 
                    change_percent DECIMAL(8,2),
                    change_amount DECIMAL(10,2),
                    volume DECIMAL(10,2),
                    amplitude DECIMAL(8,2),
                    highest_price DECIMAL(10,2),
                    lowest_price DECIMAL(10,2),
                    open DECIMAL(10,2),
                    previous_close DECIMAL(10,2)
                )
            ''')
    conn.commit()
    conn.close()

#保存数据
def save_to_db(data):
    conn = sqlite3.connect('stocks.db')
    conn.execute(
        'INSERT INTO stock_info (module_name, code, name, new_price, change_percent, change_amount, volume, amplitude, highest_price, lowest_price, open, previous_close) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)',
        data)
    conn.commit()
    conn.close()

#显示数据
def show_db_data():
    conn = sqlite3.connect('stocks.db')
    cursor = conn.cursor()
    cursor.execute('SELECT module_name, id, code, name, new_price, change_percent, change_amount, volume, amplitude, highest_price , lowest_price, open, previous_close FROM stock_info')
    rows = cursor.fetchall()

    print("\n数据库中的股票数据:")
    print("模块\t序号\t代码\t名称\t最新价\t涨跌幅\t涨跌额\t成交量\t振幅\t最高\t最低\t今开\t昨收")
    print("-" * 80)
    for row in rows:
        print(f"{row[0]}\t{row[1]}\t{row[2]}\t{row[3]}\t{row[4]}\t{row[5]}\t{row[6]}\t{row[7]}\t{row[8]}\t{row[9]}\t{row[10]}\t{row[11]}\t{row[12]}")
    conn.close()

stock_db()

urls = [
    ('https://quote.eastmoney.com/center/gridlist.html#hs_a_board','沪深京A股'),
    ('https://quote.eastmoney.com/center/gridlist.html#sh_a_board','上证A股'),
    ('https://quote.eastmoney.com/center/gridlist.html#sz_a_board','深证A股')
]
def spider():
    for url, module_name in urls:
        try:
            driver.get(url)
            time.sleep(3)
            stocks = driver.find_elements(By.XPATH,"//div[@class='quotetable']/table/tbody/tr")
            for stock in stocks:
                code = stock.find_elements(By.XPATH,".//td")[1].text             #股票代码
                name = stock.find_elements(By.XPATH,".//td")[2].text             #股票名称
                new_price = stock.find_elements(By.XPATH,".//td")[4].text        #最新价
                change_percent = stock.find_elements(By.XPATH,".//td")[5].text   #涨跌幅
                change_amount = stock.find_elements(By.XPATH,".//td")[6].text    #涨跌额
                volume = stock.find_elements(By.XPATH,".//td")[7].text           #成交量
                amplitude = stock.find_elements(By.XPATH,".//td")[9].text        #振幅
                highest_price = stock.find_elements(By.XPATH,".//td")[10].text   #最高
                lowest_price = stock.find_elements(By.XPATH,".//td")[11].text    #最低
                open = stock.find_elements(By.XPATH,".//td")[12].text            #今开
                previous_close = stock.find_elements(By.XPATH,".//td")[13].text  #昨收
                save_data = (module_name, code, name, new_price, change_percent, change_amount, volume, amplitude, highest_price, lowest_price, open, previous_close)
                save_to_db(save_data)
        except Exception as err:
            print(err)

spider()
driver.quit()
show_db_data()

(2)结果
部分结果展示

5239e883-33e8-40e1-b669-b4d664dff64b

d9a647ac-694e-4190-a72c-8912e33fb3aa

(3)心得体会
在本次股票数据爬取项目中,Selenium 作为核心工具让我深刻体会到自动化爬虫在动态网页处理中的独特价值与应用技巧。相较于静态爬虫库,Selenium 能够模拟真实浏览器的渲染过程,完美解决了东方财富网动态加载股票表格数据的问题。

作业②:

要求:
熟练掌握 Selenium 查找HTML元素、实现用户模拟登录、爬取Ajax网页数据、等待HTML元素等内容。
使用Selenium框架+MySQL爬取中国mooc网课程资源信息(课程号、课程名称、学校名称、主讲教师、团队成员、参加人数、课程进度、课程简介)
候选网站:中国mooc网:https://www.icourse163.org
输出信息:MYSQL数据库存储和输出格式
Gitee文件夹链接:https://gitee.com/chen-jiaxin_fzu/2025_crawl_project/blob/master/作业4/2.py
(1)代码

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

def course_db():
    conn = sqlite3.connect('course.db')
    conn.execute('''
                 CREATE TABLE IF NOT EXISTS course_info
                 (
                     id INTEGER PRIMARY KEY AUTOINCREMENT,
                     课程名称 VARCHAR(100) NOT NULL,
                     学校名称 VARCHAR(100),
                     主讲老师 VARCHAR(50),
                     团队成员 TEXT,
                     参加人数 VARCHAR(20),
                     课程进度 VARCHAR(50),
                     课程简介 TEXT
                     )
                 ''')
    conn.commit()
    conn.close()

#保存数据
def save_to_db(data):
    conn = sqlite3.connect('course.db')
    conn.execute(
        'INSERT INTO course_info (课程名称, 学校名称, 主讲老师, 团队成员, 参加人数, 课程进度, 课程简介) VALUES (?, ?, ?, ?, ?, ?, ?)',
        data)
    conn.commit()
    conn.close()

#显示数据
def show_db_data():
    conn = sqlite3.connect('course.db')
    cursor = conn.cursor()
    cursor.execute(
        'SELECT id, 课程名称, 学校名称, 主讲老师, 团队成员, 参加人数, 课程进度, 课程简介 FROM course_info')
    rows = cursor.fetchall()

    print("\n数据库中的课程数据:")
    print("序号\t课程名称\t学校名称\t主讲老师\t团队成员\t参加人数\t课程进度\t课程简介摘要")
    print("-" * 100)
    for row in rows:
        #截取课程简介前30个字符,避免输出过长
        intro_summary = row[7][:30] + "..." if len(row[7]) > 30 else row[7]
        print(f"{row[0]}\t{row[1]}\t{row[2]}\t{row[3]}\t{row[4]}\t{row[5]}\t{row[6]}\t{intro_summary}")
    conn.close()

course_db()

#打开浏览器
driver = webdriver.Edge()
driver.get('https://www.icourse163.org/')
time.sleep(2)

button = driver.find_element(By.CLASS_NAME, '_3uWA6')
button.click()
time.sleep(2)

frame = driver.find_element(By.XPATH, "//div[@class='ux-login-set-container']//iframe")
driver.switch_to.frame(frame)

#账号密码输入
account = driver.find_element(By.ID, 'phoneipt').send_keys('***')
password = driver.find_element(By.XPATH, "//input[@placeholder='请输入密码']").send_keys("***")

#登录
login = driver.find_element(By.ID, 'submitBtn')
login.click()
time.sleep(2)
driver.switch_to.default_content()

url = 'https://www.icourse163.org/search.htm?search=%E8%AE%A1%E7%AE%97%E6%9C%BA#/'
driver.get(url)

#选中国家精品课
mycourse = driver.find_element(By.XPATH, "//input[@class='ant-checkbox-input']")
mycourse.click()
time.sleep(2)
driver.switch_to.default_content()

courses = driver.find_elements(By.XPATH, '//div[@class="_3NYsM"]')
for course in courses:
    try:
        course_name = course.find_element(By.XPATH, './/div[@class="_1vfZ-"]').text
        school_name = course.find_element(By.XPATH, './/a[@class="_3vJDG"]').text
        try:
            #查找教师及教师团队
            teachers = course.find_elements(By.XPATH, './/a[@class="_3t_C8"]')
            if teachers:
                main_teacher = teachers[0].text
                team_members = [teacher.text for teacher in teachers]
                team_member_str = "、".join(team_members)
            else:
                main_teacher = "未知"
                team_member_str = "未知"
        except:
            main_teacher = "未知"
            team_member_str = "未知"
        attend = course.find_element(By.XPATH, './/div[@class="_CWjg"]').text
        #课程可能正在进行,也可能已经结束
        process = course.find_element(By.XPATH, './/div[@class="_2qY7l"]//div[contains(@class, "NOdDs")]').text
        introduction = course.find_element(By.XPATH, './/div[@class="_3JEMz"]').text
        #保存课程数据到数据库
        save_data = (course_name, school_name, main_teacher, team_member_str, attend, process, introduction)
        save_to_db(save_data)
        print(f"成功保存课程: {course_name}")
    except Exception as err:
        print(err)
        continue

driver.quit()
#显示数据库中的数据
show_db_data()

(2)结果

2ab31d588b5906f0179c68fed2677d9a
50fc60592392114c8fcf3b26ab2c8c47

(3)心得体会
本次实验围绕网页登录环节的 Selenium 实操让我对动态登录场景的爬虫开发有了深度认知。MOOC 平台的登录模块嵌套在 iframe 中,最初直接定位账号输入框时反复提示元素不存在,排查后才发现需通过driver.switch_to.frame()切换到登录 iframe 上下文,才能精准定位到phoneipt账号输入框和密码输入框。同时,针对课程列表不同元素的层级特点,我对元素定位方法的掌握得到了进一步提升。

作业③:

要求:
掌握大数据相关服务,熟悉Xshell的使用
完成文档 华为云_大数据实时分析处理实验手册-Flume日志采集实验(部分)v2.docx 中的任务,即为下面5个任务,具体操作见文档。
环境搭建:

任务一:开通MapReduce服务

1.购买MRS集群
aac59bf8-e79d-45a3-8ea2-4ad7116eb9c2

2.配置安全组规则
45bf29a9-920c-41ed-9fc2-6d2884036858

实时分析开发实战:

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

部分生成的数据
0f043ab8-6aac-45e0-8146-d61740adb1a4

任务二:配置Kafka

1.安装Kafka
90311a0d-a191-4518-8c52-af8a1c203fb2

2.创建topic并查看topic信息
59660a39-51b7-4c72-a7e1-87ed74b2344f

任务三: 安装Flume客户端

1.安装Flume运行环境
2c068602-f75f-44ca-ad2c-44afc037d0a5

2.安装Flume客户端
7ecd92aa-8a74-441f-9a15-f5df4fb3d6d7

3.重启Flume服务
ddf92e11-0905-4b74-89d2-a3dd0e9e9982

任务四:配置Flume采集数据

1.修改配置文件
2130ba29-d799-4817-acbc-7e5a8df1c2cc

2.创建消费Kafka的数据
728154a9-e667-4995-926e-db8eb00a7767

输出:实验关键步骤或结果截图。

心得体会

实时数据采集的关键作用在实验中得到充分体现。Flume作为大数据生态中的数据采集组件,承担着将业务系统产生的实时日志数据高效、可靠地传输到Kafka消息队列的重要任务,这种架构设计确保了数据分析的时效性,为后续的实时处理和分析奠定了坚实基础。

posted @ 2025-12-09 20:21  cjx2133  阅读(7)  评论(0)    收藏  举报