数据采集与融合技术作业4

作业4

我的Gitee仓库链接 https://gitee.com/LLLzt-III/crawl_project
作业4代码链接 https://gitee.com/LLLzt-III/crawl_project/tree/master/作业4

一、作业①:爬取股票数据

1.1 要求与目标

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

1.2 作业代码与实现

rows = driver.find_elements(By.XPATH, "//table/tbody/tr")
for row in rows:
    cells = row.find_elements(By.TAG_NAME, "td")
    if cells:
        # 提取并存储数据到数据库
        stock_data = {
            'bStockNo': cells[1].text,
            'sStockName': cells[2].text,
            'fLastPrice': cells[4].text,
            'fChangePercent': cells[5].text.replace('%', '').strip(),
            'fChangeAmount': cells[6].text,
            'nVolume': cells[7].text.replace('万', '').strip(),  # 移除 '万' 并去除空格
            'fTurnover': cells[8].text,
            'fAmplitude': cells[9].text.replace('%', '').strip(),
            'fHighPrice': cells[10].text,
            'fLowPrice': cells[11].text,
            'fOpenPrice': cells[12].text,
            'fPrevClosePrice': cells[13].text
        }
        
        # 转换为适当的数据类型
        try:
            stock_data['fChangePercent'] = float(stock_data['fChangePercent']) / 100
            stock_data['fAmplitude'] = float(stock_data['fAmplitude']) / 100

            # 处理成交量,将万转换为实际数值
            stock_data['nVolume'] = float(stock_data['nVolume']) * 10000

            # 处理成交额,将亿或万转换为实际数值
            if '亿' in stock_data['fTurnover']:
                stock_data['fTurnover'] = float(stock_data['fTurnover'].replace('亿', '').strip()) * 100000000
            elif '万' in stock_data['fTurnover']:
                stock_data['fTurnover'] = float(stock_data['fTurnover'].replace('万', '').strip()) * 10000
            else:
                stock_data['fTurnover'] = float(stock_data['fTurnover'])

        except ValueError as e:
            print(f"数据转换错误: {stock_data}, 错误: {e}")
            continue

1.3 运行结果



1.4 代码解析

  1. 数据库连接:使用 mysql.connector 连接MySQL数据库,并创建一个表来存储股票数据。
  2. Selenium爬取:使用Selenium打开目标网页,并等待页面加载完成。
  3. 数据提取:通过Selenium查找表格元素,并提取每一行的数据。
  4. 数据存储:将提取的数据插入到MySQL数据库中。

1.5 作业心得

通过这个作业,我学会了如何使用Selenium进行网页自动化操作,以及如何将爬取的数据存储到MySQL数据库中。这个过程涉及到了网页的动态加载、元素的查找和等待,以及数据库的操作,非常锻炼我的编程能力和问题解决能力。


二、作业②:爬取中国MOOC网课程资源信息

2.1 要求与目标

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

2.2 作业代码与实现

(登录及爬取页面)

class moocDB:
    def __init__(self):
        self.con = mysql.connector.connect(
            host="localhost",
            user="lzt",
            password="Lzt270823",  
            database="MOOCData"
        )
        self.cursor = self.con.cursor()

    def closeDB(self):
        self.con.commit()
        self.con.close()

    def insert(self, cCourse, cCollege, cTeacher, cTeam, cCount, cProcess, cBrief):
        print(f"Inserting record: Name={cCourse}, School={cCollege}, Teacher={cTeacher}, Team={cTeam}, Person={cCount}, Jindu={cProcess}, Jianjie={cBrief}")
        self.cursor.execute("INSERT INTO CourseInfo (cCourse, cCollege, cTeacher, cTeam, cCount, cProcess, cBrief) VALUES (%s, %s, %s, %s, %s, %s, %s)",
                            (cCourse, cCollege, cTeacher, cTeam, cCount, cProcess, cBrief))

def login():
    login_button = browser.find_element(By.XPATH, '//a[@class="f-f0 navLoginBtn"]')
    login_button.click()
    frame = browser.find_element(By.XPATH, '//div[@class="ux-login-set-container"]/iframe')
    browser.switch_to.frame(frame)
    inputUserName = browser.find_element(By.XPATH, '//div[@class="u-input box"][1]/input')
    inputUserName.send_keys("19190948081")  
    inputPasswd = browser.find_element(By.XPATH, '//div[@class="inputbox"]/div[2]/input[2]')
    inputPasswd.send_keys("Lzt270823") 
    login_button = browser.find_element(By.XPATH, '//*[@id="submitBtn"]')
    login_button.click()
    time.sleep(5)

def next_page():
    next_button = browser.find_element(By.XPATH, '//li[@class="ux-pager_btn ux-pager_btn__next"]/a')
    next_button.click()

def start_spider(moocdb):
    browser.get(url)
    count = 0
    for i in range(2):
        WebDriverWait(browser, 1000).until(EC.presence_of_all_elements_located((By.ID, "j-courseCardListBox")))
        time.sleep(random.randint(3, 6))
        browser.execute_script('document.documentElement.scrollTop=0')
        
        for link in browser.find_elements(By.XPATH, '//div[@class="u-clist f-bgw f-cb f-pr j-href ga-click"]'):
            count += 1
            try:
                name = link.find_element(By.XPATH, './/span[@class=" u-course-name f-thide"]').text
            except:
                name = 'none'
            try:
                school = link.find_element(By.XPATH, './/a[@class="t21 f-fc9"]').text
            except:
                school = 'none'
            try:
                teacher = link.find_element(By.XPATH, './/a[@class="f-fc9"]').text
            except:
                teacher = 'none'
            try:
                team = link.find_element(By.XPATH, './/span[@class="f-fc9"]').text
            except:
                team = 'none'
            try:
                person = link.find_element(By.XPATH, './/span[@class="hot"]').text
                if person:
                    person = int(''.join(filter(str.isdigit, person)))  # 提取数字并转换为整数
                else:
                    person = 0
            except:
                person = 0
            try:
                jindu = link.find_element(By.XPATH, './/span[@class="txt"]').text
            except:
                jindu = 'none'
            try:
                jianjie = link.find_element(By.XPATH, './/span[@class="p5 brief f-ib f-f0 f-cb"]').text
            except:
                jianjie = 'none'
            
            moocdb.insert(name, school, teacher, team, person, jindu, jianjie)
        
        next_page()
    login()

def main():
    moocdb = moocDB()
    start_spider(moocdb)
    moocdb.closeDB()

if __name__ == '__main__':
    main()
    browser.quit()

2.3 运行结果



2.4 代码解析

  1. 数据库连接:使用 mysql.connector 连接MySQL数据库,并创建一个表来存储课程数据。
  2. Selenium爬取:使用Selenium打开目标网页,并进行用户登录。
  3. 数据提取:通过Selenium查找课程列表元素,并提取每一门课程的数据。
  4. 数据存储:将提取的数据插入到MySQL数据库中。

2.5 作业心得

这个作业让我学会了如何使用Selenium进行用户登录和爬取Ajax网页数据。通过这个作业,我了解到了网页的动态加载和元素的等待,以及如何将爬取的数据存储到数据库中。这个过程非常锻炼我的编程能力和问题解决能力。


三、作业③:大数据实时分析处理实验

3.1 要求与目标

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

3.2 关键步骤及结果截图

实验环境搭建

1.1 进入华为云控制台
  1. 登录华为云(网址:华为云
  2. 进入控制台
  3. 登录成功后点击“控制台”,进入到华为云控制台,选择区域为“北京四”。
1.2 任务一:开通MapReduce服务

1.打开MRS服务
2.申请集群
3.集群配置:软件配置
4.集群配置:硬件配置
5.配置弹性公网IP
6.集群架构、节点及密码配置
7.集群配置:高级配置
8.确认配置
9.绑定节点弹性IP

10.修改安全组

2.1 任务一:Python脚本生成测试数据
  1. 编写Python脚本


  2. 创建存放测试数据的目录

  3. 测试执行

2.2 任务二:下载安装并配置Kafka
  1. 进入MRS Manager集群管理

  2. 下载Kafka客户端

  3. 校验下载的客户端文件包

  4. 安装Kafka运行环境

  5. 安装Kafka客户端

  6. 设置环境变量

  7. 在kafka中创建topic

  8. 查看topic信息

2.3 任务三:安装Flume客户端
  1. 进入MRS Manager集群管理(同任务2中的步骤1)

  2. 下载Flume客户端

  3. 校验下载的客户端文件包

  4. 安装Flume运行环境

  5. 安装Flume客户端

  6. 重启Flume服务

2.4 任务四:配置Flume采集数据
  1. 修改配置文件

  2. 创建消费者消费kafka中的数据

3.5 作业心得

这个作业让我学会了如何使用大数据相关服务,包括Kafka和Flume。通过这个作业,我了解到了大数据的实时分析处理流程,包括数据的生成、采集和处理。这个过程非常锻炼我的编程能力和问题解决能力。


总结

通过本次作业,我深入了解了Python爬虫的基本使用方法,包括如何使用Selenium进行网页自动化操作,如何将爬取的数据存储到MySQL数据库中,以及如何使用大数据相关服务进行实时分析处理。这些作业不仅提高了我的编程能力,也增强了我解决实际问题的信心,为未来的学习奠定了良好的基础。

posted @ 2024-11-23 17:04  III527  阅读(46)  评论(0)    收藏  举报