数据采集与融合技术第四次作业

学号姓名 102202103王文豪
gitee仓库地址 https://gitee.com/wwhpower/project_wwh.git

作业①:

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

(1)代码如下:

#MYSQL数据库连接及创建数据库和表
def create_database_and_table():
    db = mysql.connector.connect(
        host="********",
        user="****",
        password="*****"
    )
    cursor = db.cursor()

    # 创建数据库
    cursor.execute("CREATE DATABASE IF NOT EXISTS stock")
    cursor.execute("USE stock")

    # 创建表
    cursor.execute("""
        CREATE TABLE IF NOT EXISTS stocks_sz (
            id INT AUTO_INCREMENT PRIMARY KEY,
            bStockNo VARCHAR(255),
            bStockName VARCHAR(255),
            latestPrice VARCHAR(255),
            changePercent VARCHAR(255),
            changeAmount VARCHAR(255),
            volume VARCHAR(255),
            amount VARCHAR(255),
            amplitude VARCHAR(255),
            high VARCHAR(255),
            low VARCHAR(255),
            open_price VARCHAR(255),
            previousClose VARCHAR(255)
        )
    """)

    db.commit()
    cursor.close()
    db.close()

爬取“沪深A股”、“上证A股”、“深证A股”

# 爬取股票数据并存储到数据库
def scrape_stock_data():
    # Selenium WebDriver设置
    driver = webdriver.Chrome()
    driver.get("http://quote.eastmoney.com/center/gridlist.html#hs_a_board")

    # 等待页面加载
    time.sleep(5)

    # 爬取数据
    stocks = driver.find_elements(By.XPATH, "//tbody//tr")
    
    # 连接数据库
    db = mysql.connector.connect(
        host="*****",
        user="****",
        password="*******",
        database="stock"
    )
    cursor = db.cursor()

    for stock in stocks:
        bStockNo = stock.find_element(By.XPATH, ".//td[2]").text
        bStockName = stock.find_element(By.XPATH, ".//td[3]").text
        latestPrice = stock.find_element(By.XPATH, ".//td[5]").text
        changePercent = stock.find_element(By.XPATH, ".//td[6]").text
        changeAmount = stock.find_element(By.XPATH, ".//td[7]").text
        volume = stock.find_element(By.XPATH, ".//td[8]").text
        amount = stock.find_element(By.XPATH, ".//td[9]").text
        amplitude = stock.find_element(By.XPATH, ".//td[10]").text
        high = stock.find_element(By.XPATH, ".//td[11]").text
        low = stock.find_element(By.XPATH, ".//td[12]").text
        open_price = stock.find_element(By.XPATH, ".//td[13]").text
        previousClose = stock.find_element(By.XPATH, ".//td[14]").text
        # 数据存储到MySQL
        cursor.execute("""
            INSERT INTO stocks_sz (bStockNo, bStockName, latestPrice, changePercent, changeAmount, volume, amount, amplitude, high, low, open_price, previousClose)
            VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s)
        """, (bStockNo, bStockName, latestPrice, changePercent, changeAmount, volume, amount, amplitude, high, low, open_price, previousClose))

结果如下:


(2)心得体会:通过作业1,我深入学习了Selenium库的使用,包括如何查找HTML元素、处理Ajax请求和等待元素加载。我掌握了如何使用Selenium与MySQL数据库结合,实现数据的爬取和存储。学习了如何设计数据库表结构,以及如何编写SQL语句来创建表和插入数据。在爬取过程中,我遇到了元素定位的问题,通过使用浏览器的开发者工具和XPath选择器,我成功解决了这些问题。

作业②:

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

(1)代码如下:
核心爬取代码

# 爬取一个页面的数据
def spiderOnePage():
    time.sleep(5)  # 等待页面加载完成
    courses = driver.find_elements(By.XPATH, '//*[@id="channel-course-list"]/div/div/div[2]/div[1]/div')
    for course in courses:
        cCourse = course.find_element(By.XPATH, './/h3').text  # 课程名
        cCollege = course.find_element(By.XPATH, './/p[@class="_2lZi3"]').text  # 大学名称
        cTeacher = course.find_element(By.XPATH, './/div[@class="_1Zkj9"]').text  # 主讲老师
        cCount = course.find_element(By.XPATH, './/div[@class="jvxcQ"]/span').text  # 参与该课程的人数
        cProcess = course.find_element(By.XPATH, './/div[@class="jvxcQ"]/div').text  # 课程进展

        course.click()  # 点击进入课程详情页,在新标签页中打开
        Handles = driver.window_handles  # 获取当前浏览器的所有页面的句柄
        driver.switch_to.window(Handles[1])  # 跳转到新标签页
        time.sleep(5)  # 等待页面加载完成

        cBrief = driver.find_element(By.XPATH, '//*[@id="j-rectxt2"]').text
        if not cBrief:
            cBriefs = driver.find_elements(By.XPATH, '//*[@id="content-section"]/div[4]/div//*')
            cBrief = ""
            for c in cBriefs:
                cBrief += c.text

        # 将文本中的引号进行转义处理,防止插入表格时报错
        cBrief = cBrief.replace('"', r'\"').replace("'", r"\'")
        cBrief = cBrief.strip()

        # 爬取老师团队信息
        nameList = []
        cTeachers = driver.find_elements(By.XPATH, '//div[@class="um-list-slider_con_item"]')
        for Teacher in cTeachers:
            name = Teacher.find_element(By.XPATH, './/h3[@class="f-fc3"]').text.strip()
            nameList.append(name)

        nextButton = driver.find_elements(By.XPATH, '//div[@class="um-list-slider_next f-pa"]')
        while len(nextButton) != 0:
            nextButton[0].click()
            time.sleep(3)
            cTeachers = driver.find_elements(By.XPATH, '//div[@class="um-list-slider_con_item"]')
            for Teacher in cTeachers:
                name = Teacher.find_element(By.XPATH, './/h3[@class="f-fc3"]').text.strip()
                nameList.append(name)
            nextButton = driver.find_elements(By.XPATH, '//div[@class="um-list-slider_next f-pa"]')
        cTeam = ','.join(nameList)

        driver.close()  # 关闭新标签页
        driver.switch_to.window(Handles[0])  # 跳转回原始页面
        try:
            cursor.execute('INSERT INTO courseMessage VALUES (%s, %s, %s, %s, %s, %s, %s)', (
                cCourse, cCollege, cTeacher, cTeam, cCount, cProcess, cBrief))
            db.commit()
        except mysql.connector.Error as e:
            print("数据库插入数据失败:", e)

翻页处理

# 翻页操作
next_page_button = driver.find_element(By.XPATH, '//*[@id="channel-course-list"]/div/div/div[2]/div[2]/div/a[10]')
while next_page_button.get_attribute('class') == '_3YiUU ':
    if count >= 3:  # 限制爬取的页数
        break
    next_page_button.click()  # 点击按钮实现翻页
    spiderOnePage()  # 爬取一页的内容
    next_page_button = driver.find_element(By.XPATH, '//*[@id="channel-course-list"]/div/div/div[2]/div[2]/div/a[10]')
    count += 1

结果如下:
课程太多,每个课程爬取时间有点久,暂时先爬取一些课程

(2)心得体会:在作业2中,我进一步加深了对Selenium库的理解,特别是如何处理登录流程和iframe中的元素。可惜的是,在模拟用户交互,包括点击和输入,以及处理弹出的新窗口出现的问题,最后没有能够解决。

作业③:

要求:
掌握大数据相关服务,熟悉Xshell的使用
完成文档 华为云_大数据实时分析处理实验手册-Flume日志采集实验(部分)v2.docx 中的任务,即为下面5个任务,具体操作见文档。
环境搭建:
任务一:开通MapReduce服务
实时分析开发实战:
任务一:Python脚本生成测试数据
任务二:配置Kafka
任务三: 安装Flume客户端
任务四:配置Flume采集数据
输出:实验关键步骤或结果截图。

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

执行脚本测试
使用more命令查看生成的数据

任务二:下载安装并配置Kafka

校验下载的客户端文件包

安装Kafka运行环境

安装Kafka客户端

查看topic信息

任务三:安装Flume客户端

校验下载的客户端文件包

安装Flume运行环境

安装Flume客户端

重启Flume服务

任务四:配置Flume采集数据

修改配置文件
创建消费者消费kafka中的数据

心得体会:我掌握了实时分析的基本流程和技术架构。通过编写的Python脚本模拟生产商品的实时销售数据,然后由Flume+Kafka完成数据采集。

posted @ 2024-11-13 11:26  Wroli  阅读(1)  评论(0编辑  收藏  举报