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

发布时间 2023-11-07 20:41:11作者: 无餍

一、作业内容

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

序号

股票代码

股票名称

最新报价

涨跌幅

涨跌额

成交量

成交额

振幅

最高

最低

今开

昨收

1

688093

N世华

28.47

62.22%

10.92

26.13万

7.6亿

22.34

32.0

28.08

30.2

17.55

2......

                       
  • 代码:
    from selenium import webdriver
    from selenium.webdriver.common.by import By
    import time
    import sqlite3
    
    driver = webdriver.Chrome()
    # url = 'http://quote.eastmoney.com/center/gridlist.html#hs_a_board'
    # driver.get(url)
    conn = sqlite3.connect('stocks.db')
    cursor = conn.cursor()
    cursor.execute('''
            CREATE TABLE IF NOT EXISTS stocks (
                所属部分 TEXT,id INTEGER ,代码 TEXT,名称 TEXT,最新价 REAL,涨跌幅 REAL,涨跌额 REAL,成交量 REAL,成交额 REAL,振幅 REAL,最高 REAL,
    最低 REAL,今收 REAL,昨收 REAL
        )
    ''')
    
    
    def spider(name, url):
        driver.get(url)
        time.sleep(2)
        tr_list = driver.find_elements(By.XPATH, "//*[@id='table_wrapper-table']/tbody/tr")
        for tr in tr_list:
            data = tr.text
            data = data.split(" ")
            cursor.execute('''
                        insert into stocks(
                    所属部分, id, 代码 ,名称 ,最新价 ,涨跌幅 ,涨跌额 ,成交量 ,成交额 ,振幅 ,最高 ,最低 ,今收 ,昨收 
                    )
                    VALUES(?,?,?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
                    ''', (
                name, data[0], data[1], data[2], data[6], data[7], data[8], data[9], data[10], data[11], data[12], data[13],
                data[14], data[15]))
    
    
    if __name__ == "__main__":
        typeurl = ['hs_a_board', 'sh_a_board', 'sz_a_board']
        name = ['沪深京A股', '上证A股', '深证A股']
        for i in range(0, 3):
            url = 'http://quote.eastmoney.com/center/gridlist.html#' + typeurl[i]
            spider(name[i], url)
            conn.commit()
  • 运行结果:
  • 心得体会:在编写这段代码的过程中,我理解了几个模块:
    模块化设计:将爬虫功能封装成一个名为spider的函数,使得代码结构更加清晰。同时,将数据库操作部分也封装成了一个独立的模块,便于后续维护和升级。
    异常处理:在网络不稳定或服务器响应慢的情况下,使用time.sleep(2)来等待页面加载完成。虽然这种方法简单易用,但在实际应用中,可能需要更复杂的异常处理机制,如设置超时时间、重试策略等。
    数据清洗:在将爬取到的数据插入到数据库之前,需要对数据进行清洗。例如,可以使用正则表达式或其他方法去除多余的空格和换行符,确保数据的一致性。
    代码可扩展性:通过添加更多的功能模块,使程序更加完善。例如,可以考虑将爬虫部分封装成一个独立的类或模块,便于后续的维护和升级。

 

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

 

 

Id

cCourse

cCollege

cTeacher

cTeam

cCount

cProcess

cBrief

1

Python数据分析与展示

北京理工大学

嵩天

嵩天

470

2020年11月17日 ~ 2020年12月29日

“我们正步入一个数据或许比软件更重要的新时代。——Tim O'Reilly” ……

2......

             
  • 代码:
    from selenium import webdriver
    from selenium.webdriver.common.by import By
    import sqlite3
    import time
    driver = webdriver.Chrome()
    driver.get('https://www.icourse163.org/')
    time.sleep(1)
    button = driver.find_element(By.XPATH, '//*[@id="app"]/div/div/div[1]/div[3]/div[3]/div')
    button.click()
    time.sleep(1)
    frame = driver.find_element(By.XPATH,"//div[@class='ux-login-set-container']//iframe")
    driver.switch_to.frame(frame)
    account = driver.find_element(By.ID, 'phoneipt').send_keys('1111')#这边1111代表输入账号,我就不把真账号弄进去
    password = driver.find_element(By.XPATH, '//input[@placeholder="请输入密码"]').send_keys("1111")
    # 这边1111代表输入密码,我就不把真密码弄进去
    button1 = driver.find_element(By.XPATH, '/html/body/div[2]/div[2]/div[2]/form/div/div[6]/a')
    button1.click()
    time.sleep(1)
    
    url = 'https://www.icourse163.org/search.htm?search=%E5%A4%A7%E6%95%B0%E6%8D%AE#/'
    driver.get(url)
    conn = sqlite3.connect('课程信息.db')
    cursor = conn.cursor()
    cursor.execute('''
        create table course(
            id INTEGER,课程名称 text, 学校名称 text,老师 text,教师团队 text,参加人数 text, 课程进度 text, 课程简介 text
        )
    ''')
    count = 0
    link_list = driver.find_elements(By.XPATH, '//div[@class="u-clist f-bgw f-cb f-pr j-href ga-click"]')
    for link in link_list:
        count += 1
        course_name = link.find_element(By.XPATH, './/span[@class=" u-course-name f-thide"]').text
        school_name = link.find_element(By.XPATH, './/a[@class="t21 f-fc9"]').text
        teacher = link.find_element(By.XPATH, './/a[@class="f-fc9"]').text
        try:
            team_member = link.find_element(By.XPATH, './/span[@class="f-fc9"]/span').text
            team_member = team_member + ' 、' + teacher
        except Exception as err:
            team_member = 'none'
        attendees = link.find_element(By.XPATH, './/span[@class="hot"]').text
        attendees.replace('参加', '')
        process = link.find_element(By.XPATH, './/span[@class="txt"]').text
        introduction = link.find_element(By.XPATH, './/span[@class="p5 brief f-ib f-f0 f-cb"]').text
        cursor.execute('''
                            insert into course(
                        id ,课程名称 , 学校名称 ,老师 ,教师团队 ,参加人数 , 课程进度 , 课程简介
                        )
                        VALUES(?,?,?, ?, ?, ?, ?, ?)
                        ''', (count, course_name, school_name, teacher, team_member, attendees, process, introduction
                              ))
        conn.commit()
    cursor.close()
    conn.close()
  • 运行结果:
  • 心得体会:在这段代码中,我使用了XPath来定位网页上的元素。通过学习XPath语法和示例,我了解到了如何使用XPath来精确地定位到目标元素,从而提高了代码的执行效率。同时遇到了一些可能出现异常的地方,如查找团队成员时可能会找不到对应的元素。为了确保代码的稳定性,我在这些地方添加了异常处理机制,当出现异常时,将团队成员设置为'none'。在编写过程中,不断尝试运行代码并观察结果,以便及时发现问题并进行修正。同时,我也反思了自己的代码实现,思考是否有更优化的方法来提高代码的性能和可读性。

 

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

  • 任务三: 安装Flume客户端

  • 任务四:配置Flume采集数据

  • 心得体会:根据word一步步做,感觉难度不难,注意细节就行。