数据采集与融合技术实验课程作业四

数据采集与融合技术实验课程作业四

作业所属课程 https://edu.cnblogs.com/campus/fzu/2024DataCollectionandFusiontechnology
作业链接 https://edu.cnblogs.com/campus/fzu/2024DataCollectionandFusiontechnology/homework/13288
gitee码云代码位置 https://gitee.com/wang-qiangsy/crawl_project/tree/master/作业四
学号 102202106

任务①:

主要代码

try:
    db = connect_db()
    cursor = db.cursor()
    cursor.execute('DROP TABLE IF EXISTS stockT')
    sql = '''CREATE TABLE stockT(
        num varchar(32),
        id varchar(12),
        name varchar(32),
        Latest_quotation varchar(32),
        Chg varchar(12),
        up_down_amount varchar(12),
        turnover varchar(16),
        transaction_volume varchar(16),
        amplitude varchar(16),
        highest varchar(32),
        lowest varchar(32),
        today varchar(32),
        yesterday varchar(32)
    )'''
    cursor.execute(sql)
except Exception as e:
    print(e)

def spider(page_num):
    cnt = 0
    while cnt < page_num:
        spiderOnePage()
        driver.find_element(By.XPATH, '//a[@class="next paginate_button"]').click()
        cnt += 1
    time.sleep(2)

# 爬取一个页面的数据
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')
        if len(tds) >= 16:  # 确保数据格式正确,检查列数是否符合
            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()

# 访问东方财富网
driver.get('https://www.eastmoney.com/')
# 访问行情中心
driver.get(WebDriverWait(driver, 15, 0.48).until(EC.presence_of_element_located((By.XPATH, '/html/body/div[6]/div/div[2]/div[1]/div[1]/a'))).get_attribute('href'))
# 访问沪深京A股
driver.get(WebDriverWait(driver, 15, 0.48).until(EC.presence_of_element_located((By.ID, 'menu_hs_a_board'))).get_attribute('href'))
# 爬取两页的数据
spider(2)
driver.back()

# 访问上证A股
driver.get(WebDriverWait(driver, 15, 0.48).until(EC.presence_of_element_located((By.ID, 'menu_sh_a_board'))).get_attribute('href'))
spider(2)
driver.back()

# 访问深证A股
driver.get(WebDriverWait(driver, 15, 0.48).until(EC.presence_of_element_located((By.ID, 'menu_sz_a_board'))).get_attribute('href'))
spider(2)

运行后

查看数据库

作业心得

分析

  • 功能实现
    1.使用了Selenium自动化测试工具进行网页数据爬取,通过定位网页元素实现页面的导航和数据提取。
    2.提取到的数据包括股票编号、名称、最新报价、涨跌幅、成交量等,覆盖股票信息的多个方面。
    3.数据被存储到MySQL数据库中,表结构合理,适合存储多维度的股票信息。

  • 关键技术点
    1.使用了WebDriverWait等待网页加载完成,避免了因页面加载速度不同导致的元素未找到错误。
    2.Selenium的XPath定位结合页面结构动态获取链接并跳转,实现了较高的通用性。
    3.数据库操作部分使用了pymysql库,事务提交设计避免了数据丢失。

  • 不足与改进空间
    1.错误处理不足:部分功能缺乏异常捕获,可能在网页结构变化或网络波动时导致程序中断。
    2.效率与性能:在单页爬取时逐行插入数据库,效率偏低。可以使用批量插入提高性能。
    3.浏览器模拟识别:使用了禁用AutomationControlled的选项,但仍可能被网站检测为爬虫,建议进一步伪装用户行为。

心得

  • 学习和实践价值
    这份代码展示了如何使用Selenium与MySQL结合完成数据抓取和存储,对学习爬虫技术和数据库操作有很大的借鉴意义。
    提供了一个完整的抓取管道,从网页交互到数据库存储的过程一目了然。

任务②:

主要代码

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 = 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)

# 访问中国大学慕课
driver.get('https://www.icourse163.org/')

# 访问国家精品课程
driver.get(WebDriverWait(driver, 15, 0.48).until(EC.presence_of_element_located((By.XPATH, '//*[@id="app"]/div/div/div[1]/div[1]/div[1]/span[1]/a'))).get_attribute('href'))
spiderOnePage()  # 爬取第一页的内容

count = 1
'''翻页操作'''
# 下一页的按钮
next_page = driver.find_element(By.XPATH, '//*[@id="channel-course-list"]/div/div/div[2]/div[2]/div/a[10]')
# 如果还有下一页,那么该标签的class属性为_3YiUU
while next_page.get_attribute('class') == '_3YiUU ':
    if count == 5:
        break
    count += 1
    next_page.click()  # 点击按钮实现翻页
    spiderOnePage()  # 爬取一页的内容
    next_page = driver.find_element(By.XPATH, '//*[@id="channel-course-list"]/div/div/div[2]/div[2]/div/a[10]')

运行后

查看数据库

作业心得

分析

  • 功能实现
    数据爬取
    利用Selenium模拟浏览器操作,通过点击、翻页等方式抓取多页课程数据。
    提取的数据包括课程名称、大学名称、主讲老师、参与人数、课程进度、课程简介以及授课团队等,数据维度较为全面。
    数据存储
    使用了MySQL数据库存储爬取结果,表结构设计合理。
    技术点
    动态页面处理:通过点击和切换标签页抓取动态加载的数据,如课程简介和团队信息。
    异常处理:在数据库插入部分加入了基本的异常捕获,避免爬虫因单条数据错误中断。
  • 不足与改进
    性能问题
    爬取速度较慢,如单个课程需要频繁等待页面加载,建议结合多线程或异步操作优化。
    错误处理不足
    课程爬取过程中异常捕获不完善,如页面加载失败或元素定位失败时可能导致中断。

心得

  • 技术收获
    学习了如何使用Selenium实现动态网站的数据抓取,特别是对多页和动态加载内容的处理。
    数据存储部分对可能存在的问题进行了处理(如特殊字符转义),体现了实际应用场景中对细节的关注。
  • 改进方向
    加强异常处理机制,确保爬虫的稳定性。
    使用Scrapy等框架代替Selenium,提高爬取效率。
    增加日志记录功能,便于调试和分析爬取过程中的问题。

任务③:

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

  • 创建并进入/opt/client/目录,使用vi命令编写Python脚本:autodatagen.py
  • 执行Python命令,测试生成100条数据
  • 使用more命令查看生成的数据

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

  • 使用PuTTY登录到master节点服务器上,进入/tmp/FusionInsight-Client/目录。
  • 安装Kafka运行环境,解压“MRS_Flume_ClientConfig.tar”文件。

  • 安装客户端运行环境到目录“/opt/Kafka_env”(安装时自动生成目录)。
    sh FusionInsight_Cluster_1_Kafka_ClientConfig/install.sh /opt/Kafka_env

  • 查看topic信息

任务三:安装Flume客户端

  • 解压“MRS_Flume_ClientConfig.tar”文件

  • 安装Flume客户端

任务四:配置Flume采集数据

  • check

作业心得

  • 大数据平台环境搭建
    了解了如何在华为云上开通大数据服务(MRS),包括虚拟私有云(VPC)的创建、弹性IP的绑定、安全组规则配置等。通过这些操作,掌握了云环境的基本搭建步骤。
  • Flume 日志采集
    掌握了 Flume 的核心配置项(Source、Channel、Sink)及其在实时流数据采集中的应用。
    实验中模拟了一个数据采集管道,通过 Python 脚本生成测试数据,并通过 Flume 将数据传输到 Kafka。这一流程体现了 Flume 在数据采集中的高效性和灵活性。
  • Kafka 配置与使用
    学习了 Kafka 在大数据架构中作为消息中间件的作用,了解了 Topic 的创建、数据传输以及与 Flume 的集成方法。
    实验中详细展示了 Kafka 客户端的安装与配置过程,为后续的流式计算打下了基础。
  • 实时数据分析准备
    Flume 数据采集的最终目的是为实时分析提供数据支持。实验手册中的设计为后续数据分析(如通过 DLV 数据可视化工具)提供了清晰的技术路径。
posted @ 2024-11-21 19:24  KaiInssy  阅读(18)  评论(0编辑  收藏  举报