数据采集第四次实验

学号姓名 102202116李迦勒
gitee仓库地址 黑马楼直面爬虫: 2022数据采集与融合技术黑马楼:直面爬虫小组

作业①:

要求:
熟练掌握 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)结果如下

结果如下:
img
img
img

(3)感悟

通过这次实践,我深刻体会到动态网页数据爬取的挑战和解决方法的重要性。借助 Selenium 精准定位 HTML 元素、处理 Ajax 加载、模拟用户操作,可以有效应对复杂网页的数据提取需求。同时,将爬取的数据存储到 MySQL 数据库中,不仅考验了数据结构设计能力,还强化了对数据库操作的理解。在这一过程中,我学会了从问题分析到代码实现的完整流程,提升了代码的鲁棒性和复用性,也对网页爬虫技术与数据库存储有了更深入的认识,为后续的数据分析与开发实践奠定了扎实的基础。

作业②:

要求:
熟练掌握 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)结果如下

(3)感悟

通过本次实践,我深刻认识到 Selenium 在动态网页数据爬取中的强大作用,尤其是在用户模拟登录和处理 Ajax 异步加载方面的应用。中国 MOOC 网的课程信息复杂多样,通过 Selenium 实现 HTML 元素定位、处理页面加载等待,以及提取目标数据,是提升爬虫技术的重要实战。同时,结合 MySQL 数据库对爬取的数据进行存储和管理,锻炼了我在设计表结构、处理数据完整性和提高查询效率方面的能力。整个过程中,我学会了分析复杂网页结构、应对动态加载的挑战,以及如何高效地组织和持久化大规模数据,为后续更复杂的数据采集和分析任务积累了宝贵的经验。

作业③:

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

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

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

任务二:下载安装并配置Kafka
校验下载的客户端文件包

安装Kafka运行环境

安装Kafka客户端

查看topic信息

任务三:安装Flume客户端
校验下载的客户端文件包

安装Flume运行环境

安装Flume客户端

重启Flume服务

任务四:配置Flume采集数据
修改配置文件
创建消费者消费kafka中的数据

感悟

通过本次实验,我深入了解了华为云大数据服务的环境搭建和数据实时分析的基本流程,尤其在 Flume 日志采集与 Kafka 数据流处理中的应用让我受益匪浅。在环境搭建中,掌握了 Xshell 工具的高效使用方法,包括远程连接、命令执行及日志查看等。在具体任务中,完成了 MapReduce 服务的开通、Python 脚本生成测试数据、Kafka 消息队列配置以及 Flume 客户端的安装和数据采集的完整流程,进一步巩固了对分布式数据处理的理解。这次实践让我深刻认识到流式数据处理在大数据实时分析中的重要性,同时强化了我在配置环境、处理错误、优化数据流管道等方面的能力,为日后复杂的大数据项目开发提供了宝贵的经验。

posted @ 2024-11-26 00:10  李迦勒  阅读(10)  评论(0编辑  收藏  举报