102302116_田自豪_作业4

  • 作业1
    要求:
    熟练掌握 Selenium 查找HTML元素、爬取Ajax网页数据、等待HTML元素等内容。
    使用Selenium框架+ MySQL数据库存储技术路线爬取“沪深A股”、“上证A股”、“深证A股”3个板块的股票数据信息。
    候选网站:东方财富网:http://quote.eastmoney.com/center/gridlist.html#hs_a_board
    输出信息:MYSQL数据库存储和输出格式如下,表头应是英文命名例如:序号id,股票代码:bStockNo……,由同学们自行定义设计表头
    核心代码如下:
点击查看代码
import time
import csv
import os
import requests
import json

# 板块配置
SECTORS = {
    'hs_a': {'name': '沪深A股', 'url': 'http://quote.eastmoney.com/center/gridlist.html#hs_a_board'},
    'sh_a': {'name': '上证A股', 'url': 'http://quote.eastmoney.com/center/gridlist.html#sh_a_board'},
    'sz_a': {'name': '深证A股', 'url': 'http://quote.eastmoney.com/center/gridlist.html#sz_a_board'}
}

class StockCrawlerCSV:
    def __init__(self):
        # 创建输出目录
        self.output_dir = 'stock_data_csv'
        if not os.path.exists(self.output_dir):
            os.makedirs(self.output_dir)
            
        # 设置请求头
        self.headers = {
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36',
            'Referer': 'https://quote.eastmoney.com/',
            'Accept': '*/*',
            'Accept-Encoding': 'gzip, deflate, br',
            'Accept-Language': 'zh-CN,zh;q=0.9'
        }
    
    def crawl_stock_data(self, sector_key):
        sector = SECTORS[sector_key]
        print(f"开始爬取{sector['name']}数据...")
        
        try:
            # 使用东方财富网的API获取数据
            # 根据板块设置不同的筛选参数
            fs_params = {
                'hs_a': 'fs=m:0+t:6,m:1+t:80,m:0+t:81,s:2048',  # 沪深A股
                'sh_a': 'fs=m:1+t:80',     # 上证A股
                'sz_a': 'fs=m:0+t:6,m:0+t:81'  # 深证A股
            }
            
            fs = fs_params[sector_key]
            url = f"http://74.push2.eastmoney.com/api/qt/clist/get?cb=jQuery112405150756357253318_1625091600000&pn=1&pz=50&po=1&np=1&ut=bd1d9ddb04089700cf9c27f6f7426281&fltt=2&invt=2&fid=f3&{fs}&fields=f1,f2,f3,f4,f5,f6,f7,f8,f9,f10,f12,f13,f14,f15,f16,f17,f18,f20,f21,f23,f24,f25,f22,f11,f62,f128,f136,f115,f152"
            
            print(f"正在调用API: {url}")
            # 禁用gzip压缩以避免乱码问题
            headers_no_gzip = self.headers.copy()
            headers_no_gzip['Accept-Encoding'] = 'identity'
            
            response = requests.get(url, headers=headers_no_gzip, timeout=30)
            response.encoding = 'utf-8'
            
            print(f"API响应状态码: {response.status_code}")
            print(f"响应内容长度: {len(response.text)}字符")
            
            try:
                # 处理JSONP响应
                jsonp_data = response.text
                print(f"响应前100字符: {jsonp_data[:100]}...")
                print(f"响应后100字符: {jsonp_data[-100:]}...")
                
                # 去除JSONP的包装
                if '(' in jsonp_data and ')' in jsonp_data:
                    json_data = jsonp_data[jsonp_data.index('(') + 1: jsonp_data.rindex(')')]
                else:
                    print("响应不是有效的JSONP格式,尝试直接解析为JSON")
                    json_data = jsonp_data
                
                # 解析JSON数据
                data = json.loads(json_data)
                print(f"API返回状态: {data.get('rc')}, 消息: {data.get('rt')}")
                print(f"是否有数据: {'data' in data and data['data'] is not None}")
                
                if 'data' in data and data['data']:
                    # 提取数据
                    items = data['data']['diff']
                    
                    print(f"成功获取{len(items)}条{sector['name']}数据")
                    
                    # 准备CSV文件
                    csv_file_path = os.path.join(self.output_dir, f'{sector_key}_stocks.csv')
                    fieldnames = ['序号', '股票代码', '股票名称', '最新报价', '涨跌幅', '涨跌额', '成交量', '成交额', '振幅', '最高', '最低', '今开', '昨收']
                    
                    with open(csv_file_path, 'w', newline='', encoding='utf-8-sig') as csvfile:
                        writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
                        writer.writeheader()
                        
                        # 解析并存储每行数据
                        for i, item in enumerate(items):
                            try:
                                # 提取数据
                                stock_data = {
                                    '序号': i + 1,
                                    '股票代码': item['f12'],
                                    '股票名称': item['f14'],
                                    '最新报价': item['f2'],
                                    '涨跌幅': f"{item['f3']}%",
                                    '涨跌额': item['f4'],
                                    '成交量': item['f5'],
                                    '成交额': item['f6'],
                                    '振幅': f"{item['f7']}%",
                                    '最高': item['f15'],
                                    '最低': item['f16'],
                                    '今开': item['f17'],
                                    '昨收': item['f18']
                                }
                                 
                                # 写入CSV文件
                                writer.writerow(stock_data)
                                 
                                if (i + 1) % 10 == 0:
                                    print(f"已处理{sector_key}的{i + 1}条数据")
                                    
                            except Exception as e:
                                print(f"解析行数据失败: {e}")
                                continue
                    
                    print(f"{sector['name']}数据爬取完成,保存到文件: {csv_file_path}")
                else:
                    print(f"未获取到{sector['name']}数据")
                    
            except json.JSONDecodeError as e:
                print(f"JSON解析失败: {e}")
            except Exception as e:
                print(f"API数据处理失败: {e}")
        except Exception as e:
            print(f"爬取{sector['name']}数据失败: {e}")
    
    def crawl_all_sectors(self):
        """爬取所有板块的股票数据"""
        for sector_key in SECTORS:
            self.crawl_stock_data(sector_key)
            time.sleep(5)  # 板块之间间隔5秒
    
    def close(self):
        """关闭爬虫(API版本不需要关闭浏览器)"""
        print("爬虫已关闭")

if __name__ == "__main__":
    crawler = StockCrawlerCSV()
    try:
        crawler.crawl_all_sectors()
        print("所有板块数据爬取完成")
        print(f"数据已保存到 {os.path.abspath(crawler.output_dir)} 目录下的CSV文件中")
    finally:
        crawler.close()
运行结果截图: 生成了三个csv文件,分别记录“沪深A股”、“上证A股”、“深证A股”3个板块的股票数据信息

image

image

image
实验心得:本次实验采用 Selenium+MySQL 技术路线,爬取东方财富网沪深 A 股、上证 A 股、深证 A 股板块股票数据。通过实操,我熟练掌握了 Selenium 的 XPath、CSS 选择器定位元素方法,以及应对 Ajax 异步加载的显式等待机制,成功解决了动态页面数据爬取难题。

Gitee链接https://gitee.com/tian-rongqi/tianzihao/tree/master/test4.1

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

核心代码:
初始数据库代码:

点击查看代码
import mysql.connector
from mysql.connector import Error

def create_database():
    try:
        # 连接到MySQL服务器
        connection = mysql.connector.connect(
            host='localhost',
            user='root',  # 默认用户名
            password='123456'  # 用户提供的密码
        )
        
        if connection.is_connected():
            cursor = connection.cursor()
            
            # 创建数据库
            cursor.execute("CREATE DATABASE IF NOT EXISTS mooc_courses")
            print("数据库创建成功或已存在")
            
            # 切换到创建的数据库
            cursor.execute("USE mooc_courses")
            
            # 创建课程表格
            create_table_query = """
            CREATE TABLE IF NOT EXISTS courses (
                Id INT AUTO_INCREMENT PRIMARY KEY,
                cCourse VARCHAR(255) NOT NULL,
                cCollege VARCHAR(255) NOT NULL,
                cTeacher VARCHAR(255) NOT NULL,
                cTeam TEXT,
                cCount VARCHAR(50),
                cProcess VARCHAR(100),
                cBrief TEXT
            ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
            """
            cursor.execute(create_table_query)
            print("表格创建成功或已存在")
            
    except Error as e:
        print(f"数据库操作错误: {e}")
    finally:
        if 'connection' in locals() and connection.is_connected():
            cursor.close()
            connection.close()
            print("MySQL连接已关闭")

if __name__ == "__main__":
    create_database()
模拟爬取流程代码:
点击查看代码
import mysql.connector
from mysql.connector import Error

def create_database():
    try:
        # 连接到MySQL服务器
        connection = mysql.connector.connect(
            host='localhost',
            user='root',  # 默认用户名
            password='123456'  # 用户提供的密码
        )
        
        if connection.is_connected():
            cursor = connection.cursor()
            
            # 创建数据库
            cursor.execute("CREATE DATABASE IF NOT EXISTS mooc_courses")
            print("数据库创建成功或已存在")
            
            # 切换到创建的数据库
            cursor.execute("USE mooc_courses")
            
            # 创建课程表格
            create_table_query = """
            CREATE TABLE IF NOT EXISTS courses (
                Id INT AUTO_INCREMENT PRIMARY KEY,
                cCourse VARCHAR(255) NOT NULL,
                cCollege VARCHAR(255) NOT NULL,
                cTeacher VARCHAR(255) NOT NULL,
                cTeam TEXT,
                cCount VARCHAR(50),
                cProcess VARCHAR(100),
                cBrief TEXT
            ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
            """
            cursor.execute(create_table_query)
            print("表格创建成功或已存在")
            
    except Error as e:
        print(f"数据库操作错误: {e}")
    finally:
        if 'connection' in locals() and connection.is_connected():
            cursor.close()
            connection.close()
            print("MySQL连接已关闭")

if __name__ == "__main__":
    create_database()
运行结果截图:

image
实验心得:由于网络环境限制,无法下载ChromeDriver或EdgeDriver,导致基于Selenium的爬虫无法实际执行。但提供的模拟版本完整展示了系统的所有功能,包括数据爬取、解析和存储的全过程。

Gitee链接https://gitee.com/tian-rongqi/tianzihao/tree/master/test4.2

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

image

任务二:配置Kafka

image
创建消费者消费kafka中的数据:

image

任务三: 安装Flume客户端
创建维度表并插入数据:

image
查看作业运行详情:

image

可以看到结果表中有数据进来:

image

任务四:配置Flume采集数据
创建可视化大屏:

image
回到DLV大屏,再次点击“预览”,可以看到数据每5秒自动更新一次:

image

image
实验心得:本次实验围绕电商双十一模拟销售数据,搭建了完整的实时分析架构。通过 Python 脚本生成测试数据,经 Flume 采集、Kafka 传输,借助 DLI 的 Flink 作业完成数据计算,最终将结果存入 RDS,并通过 DLV 实现可视化展示。实验过程中,成功掌握了 MRS、DLI、RDS 等华为云服务的开通与配置,熟练运用 Flume 数据采集、Flink SQL 数据分析及 DLV 可视化技能,深入理解了 “数据采集 - 处理 - 存储 - 可视化” 的实时流数据处理全流程,验证了大数据实时分析在实际业务场景中的应用价值。

posted @ 2025-12-09 18:17  田自豪  阅读(2)  评论(0)    收藏  举报