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

这个作业属于哪个课程 <首页 - 2024数据采集与融合技术实践 - 福州大学 - 班级博客 - 博客园 (cnblogs.com)>
这个作业要求在哪里 <作业4 - 作业 - 2024数据采集与融合技术实践 - 班级博客 - 博客园 (cnblogs.com)>
学号 <102202101>

一、作业内容

作业①

  • 要求:

  • 熟练掌握 Selenium 查找HTML元素、爬取Ajax网页数据、等待HTML元素等内容。

  • 使用Selenium框架+ MySQL数据库存储技术路线爬取“沪深A股”、“上证A股”、“深证A股”3个板块的股票数据信息

  • 代码如下

点击查看代码
# 爬取一个页面的数据
def spiderOnePage():
    time.sleep(3)
    trs = driver.find_elements(By.XPATH,'//table[@id="table_wrapper-table"]//tr[@class]')
    for tr in trs:
        tds = tr.find_elements(By.XPATH,'.//td')
        num = tds[0].text
        id = tds[1].text
        name = tds[2].text
        Latest_quotation = tds[6].text
        Chg = tds[7].text
        up_down_amount = tds[8].text
        turnover = tds[9].text
        transaction_volume = tds[10].text
        amplitude = tds[11].text
        highest = tds[12].text
        lowest = tds[13].text
        today = tds[14].text
        yesterday = tds[15].text
        cursor.execute('INSERT INTO stockT VALUES ("%s","%s","%s","%s","%s","%s","%s","%s","%s","%s","%s","%s","%s")' % (num,id,name,Latest_quotation,
                                                Chg,up_down_amount,turnover,transaction_volume,amplitude,highest,lowest,today,yesterday))
        db.commit()

  • 输出信息:



  • Gitee文件夹链接:https://gitee.com/ma-xin1/data-acquisition/blob/master/作业4/task1.py

  • 心得体会:

    1. 使用 Selenium 控制浏览器进行爬取
      浏览器配置:通过 ChromeOptions 设置浏览器选项,禁用 GPU 加速,并通过 binary_location 指定 Chrome 浏览器的路径。通过 ChromeService 和指定 chromedriver.exe 来初始化浏览器驱动。
      自动化操作:代码模拟了用户的浏览器操作,访问不同的网页链接(如行情中心、沪深京A股等),并通过 WebDriverWait 等待页面加载完成后继续操作。这种方式使得爬虫能够动态加载页面内容(如股票数据),适应现代网站的 Ajax 加载模式。
      分页爬取:通过点击下一页按钮,循环爬取多页数据,并在每次爬取后等待页面加载完成。
    1. 数据库操作
      连接 MySQL:通过 pymysql 连接到本地 MySQL 数据库,创建一个名为 stockT 的表来存储股票数据。如果表已存在,先删除再重新创建。
      插入数据:每爬取一页股票数据,就将提取到的数据逐条插入到 MySQL 数据库中。使用 SQL 语句进行插入,并在每次插入后通过 db.commit() 提交事务,确保数据持久化。
    1. 网页解析
      XPath 定位:通过 XPath 定位页面元素,如通过 find_elements(By.XPATH, '//table[@id="table_wrapper-table"]//tr[@class]') 找到所有表格行,从中提取股票信息。
      数据提取:从每一行表格中提取多个数据字段(如股票编号、名称、最新报价等),并进行存储。需要注意,数据提取过程中可能遇到一些无效或格式不正确的数据,因此可以加入异常处理或数据清洗步骤。
    1. 多次访问不同页面
      代码通过 driver.get() 方法分别访问不同的网页,比如沪深A股、上证A股、深证A股等,爬取不同页面的股票数据。每爬取完一页数据后,会通过 driver.back() 返回到上一页面,然后继续爬取其他页面数据。这种结构使得爬虫能够获取多种股票板块的数据。
    1. 潜在的改进和问题
      错误处理:在数据库连接和操作时,应该加上更多的错误处理。例如,数据库连接失败、表创建失败或数据插入失败时的异常处理。
      数据清洗:在插入数据前,可以对爬取的数据进行更严格的检查和清洗,避免无效数据或空值被存入数据库。
      延时优化:虽然代码通过 time.sleep() 做了延时处理,但在爬取大量页面时,固定时间的等待可能会导致效率低下。可以考虑使用 WebDriverWait 来等待页面元素加载完成,而非简单地等待固定时间。
      可扩展性:目前的代码只爬取了几页数据,如果需要爬取大量数据,可能需要增加分页控制,处理不同网站结构或反爬虫机制的情况。

    作业②

  • 要求

  • 熟练掌握 Selenium 查找HTML元素、实现用户模拟登录、爬取Ajax网页数据、等待HTML元素等内容。

  • 使用Selenium框架+MySQL爬取中国mooc网课程资源信息(课程号、课程名称、学校名称、主讲教师、团队成员、参加人数、课程进度、课程简介)

  • 代码如下

点击查看代码
# 爬取一个页面的数据
def spiderOnePage():
    time.sleep(5)  # 等待页面加载完成
    courses = driver.find_elements(By.XPATH, '//*[@id="channel-course-list"]/div/div/div[2]/div[1]/div')
    current_window_handle = driver.current_window_handle
    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 = WebDriverWait(driver,10,0.48).until(EC.presence_of_element_located((By.ID,'j-rectxt2'))).text
        cBrief = driver.find_element(By.XPATH, '//*[@id="j-rectxt2"]').text
        if len(cBrief) == 0:
            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(current_window_handle)  # 跳转回原始页面
        try:
            cursor.execute('INSERT INTO courseMessage VALUES ("%s","%s","%s","%s","%s","%s","%s")' % (
            cCourse, cCollege, cTeacher, cTeam, cCount, cProcess, cBrief))
            db.commit()
        except Exception as e:
            print(e)

  • 输出信息:

  • Gitee文件夹链接:https://gitee.com/ma-xin1/data-acquisition/blob/master/作业4/task2.py

  • 心得体会:

  • 1.使用 Selenium 库的合理性:
    借助selenium库来自动化操作浏览器,能够很好地应对需要与动态网页交互的场景。例如在点击课程进入详情页、处理页面加载等待以及翻页等操作上,selenium提供的诸如WebDriverWait等待机制(通过expected_conditions模块)、元素定位方法(By类结合XPATH等定位方式)等功能,使得代码可以灵活地应对网页不同状态下的元素获取和交互需求,有效模拟了用户在浏览器中的操作行为,增强了爬虫的通用性和稳定性。

  • 2.数据库交互部分:
    代码中使用pymysql库连接 MySQL 数据库,并且在开始时对数据表进行了合理的创建(如果不存在则创建)以及先删除旧表的处理,逻辑严谨。后续将爬取到的数据插入到数据库的操作也比较常规和清晰,通过构建合适的INSERT语句,把从网页获取到的各类课程信息准确地存储起来,方便后续的数据查询、分析和应用。

  • 3.数据处理细节:
    在处理爬取到的课程简介文本时,考虑到了可能存在的特殊字符(如引号)会影响插入数据库的情况,进行了转义处理,这种对数据细节的把控能有效避免因数据格式问题导致的插入报错,提高了数据存储的成功率和准确性。另外,在爬取教师团队信息时,对于存在分页展示教师的情况,通过循环点击 “下一页” 按钮并持续收集教师名字的方式,较为全面地获取了完整的教师团队信息,保证了数据的完整性。

  • 4.代码可改进之处
    代码结构与可读性:
    整体代码结构稍显混杂,虽然功能实现了,但把页面访问、数据爬取、数据库操作以及翻页逻辑等都放在一个大的脚本中,没有很好地进行模块化划分。例如,可以将不同功能的代码块提取成独立的函数,像把数据库连接和关闭操作封装成专门的函数、将翻页相关的逻辑独立出来等,这样能让代码结构更清晰,更易于理解和维护,后续如果需要扩展功能或者修改某一部分逻辑也更方便定位代码。

    作业③

  • 要求:

  • 掌握大数据相关服务,熟悉Xshell的使用

  • 完成文档 华为云_大数据实时分析处理实验手册-Flume日志采集实验(部分)v2.docx 中的任务,即为下面5个任务,具体操作见文档。

  • 环境搭建:
    任务一:开通MapReduce服务

  • 实时分析开发实战:
    任务一:Python脚本生成测试数据
    任务二:配置Kafka
    任务三: 安装Flume客户端
    任务四:配置Flume采集数据

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


任务二:配置Kafka



任务三: 安装Flume客户端


任务四:配置Flume采集数据

释放资源:

**心得体会:

  • 通过这次华为云大数据实时分析处理实验,收获颇丰。
    开通 MapReduce 服务,体会到云服务操作的规范便捷,为后续打基础。用 Python 脚本生成测试数据,感受到其在构造数据上的强大,也明白了数据质量等对分析的重要性。
    配置 Kafka,认识到它在数据流转中的关键作用,参数配置需谨慎。安装 Flume 客户端,提升了解决依赖、网络等问题的能力。配置 Flume 采集数据,深知细节决定成败。
    全程使用 Xshell 远程操作,深感其便利性与重要性。总之,此次实验提升了技能,加深了对大数据架构的理解,很有价值。
posted @ 2024-11-17 23:03  Endorphins  阅读(13)  评论(0编辑  收藏  举报