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

发布时间 2023-11-16 02:45:15作者: lichouben

一、作业内容

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

序号

股票代码

股票名称

最新报价

涨跌幅

涨跌额

成交量

成交额

振幅

最高

最低

今开

昨收

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.chrome.options import Options
from selenium.webdriver.common.by import By
from selenium.webdriver.common.action_chains import ActionChains
import time
import pymysql

# 连接自己的数据库,根据自己情况修改
conn = pymysql.connect(host="127.0.0.1", port=3306, user='root', passwd='yy2039070', charset='utf8',db='a1')
cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)

# 必须先删除原有数据
cursor.execute("delete from stocks")
# 创建一个表来存储股票信息
cursor.execute('''CREATE TABLE IF NOT EXISTS stocks
                (id INTEGER PRIMARY KEY,
                code TEXT,
                name TEXT,
                latest_price TEXT,
                change_percent TEXT,
                change_amount TEXT,
                volume TEXT,
                turnover TEXT,
                amplitude TEXT,
                highest TEXT,
                lowest TEXT,
                open_price TEXT,
                close_price TEXT)''')

driver = webdriver.Chrome()

print("请输入需要查找的股票,沪深京:1,上证:2,深证:3")
while True:
    num = input("请输入:")
    if num == '1': 
        # 沪深京A股
        driver.get("https://quote.eastmoney.com/center/gridlist.html#hs_a_board")
        break
    elif num == '2':
        #上证A股
        driver.get("https://quote.eastmoney.com/center/gridlist.html#sh_a_board")
        break
    elif num == '3':
        # 深证A股
        driver.get("https://quote.eastmoney.com/center/gridlist.html#sz_a_board")
        break





n = input("请输入需要查找的页码:")
n = int(n)
# 爬取前n页股票信息
for page in range(1, n+1): #爬取n页
    print(f"正在爬取第 {page} 页股票信息")
    
    # 定位所有股票信息的元素
    stocks_list = driver.find_elements(By.XPATH,"//div[@class='listview full']//tbody//tr")  

    # 打印股票信息
    for stock in stocks_list:
        stock_id = stock.find_element(By.XPATH,'.//td[1]').text
        stock_code = stock.find_element(By.XPATH,'.//td[2]/a').text
        stock_name= stock.find_element(By.XPATH,'.//td[3]/a').text
        stock_latest_price= stock.find_element(By.XPATH,'.//td[5]//span').text
        stock_change_percent= stock.find_element(By.XPATH,'.//td[6]//span').text
        stock_change_amount= stock.find_element(By.XPATH,'.//td[7]//span').text
        stock_volume= stock.find_element(By.XPATH,'.//td[8]').text
        stock_turnover= stock.find_element(By.XPATH,'.//td[9]').text
        stock_amplitude= stock.find_element(By.XPATH,'.//td[10]').text
        stock_highest= stock.find_element(By.XPATH,'.//td[11]//span').text
        stock_lowest= stock.find_element(By.XPATH,'.//td[12]//span').text
        stock_open_price= stock.find_element(By.XPATH,'.//td[13]//span').text
        stock_close_price= stock.find_element(By.XPATH,'.//td[14]').text
        print(f"序号: {stock_id}")
        print(f"股票代码: {stock_code}")
        print(f"股票名称: {stock_name}")
        print(f"最新报价: {stock_latest_price}")
        print(f"涨跌幅: {stock_change_percent}")
        print(f"涨跌额: {stock_change_amount}")
        print(f"成交量: {stock_volume}")
        print(f"成交额: {stock_turnover}")
        print(f"振幅: {stock_amplitude}")
        print(f"最高: {stock_highest}")
        print(f"最低: {stock_lowest}")
        print(f"今开: {stock_open_price}")
        print(f"昨收: {stock_close_price}")
        print("-" * 60)
 
        sql ="INSERT INTO stocks (id,code, name, latest_price, change_percent, change_amount, volume, turnover, amplitude, highest, lowest, open_price, close_price) VALUES (%s, %s,%s, %s, %s,%s, %s, %s, %s, %s, %s, %s, %s)"
        cursor.execute(sql,[stock_id,stock_code, stock_name, stock_latest_price, stock_change_percent, stock_change_amount, stock_volume, stock_turnover, stock_amplitude, stock_highest, stock_lowest, stock_open_price, stock_close_price])
    conn.commit()
    print("数据已存入数据库")

    # 点击下一页按钮
    next_page_button = driver.find_element(By.XPATH, '//*[@id="main-table_paginate"]/a[2]')
    action = ActionChains(driver)
    time.sleep(5)
    action.move_to_element(next_page_button).perform()
    next_page_button.click()

    time.sleep(5)  
conn.close()
# 关闭浏览器
driver.quit()

为了方便演示,选择以(1,1),(2,2),(3,3)方式输入:

 (1,1):

输入及部分终端输出如下:

 

数据库输出如下:

 

 

 

(2,2):

 部分终端输出如下:

 数据库输出如下:

 

(3,3):

部分终端输出:

 

 

数据库输出:

 

 

 

 心得体会:这个作业还是比较轻松的,帮我回忆了一下selenium的命令,只需要稍加修改代码即可完成。再就是必须先删除原有数据,否则会报错,也不知道为什么

 

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

 

 

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
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.keys import Keys
import time
import random
import pymysql
from selenium.common.exceptions import NoSuchElementException
conn = pymysql.connect(host="127.0.0.1", port=3306, user='root', passwd='yy2039070', charset='utf8',db='a1')
cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
cursor.execute("delete from mooc")
cursor.execute('''CREATE TABLE IF NOT EXISTS mooc (
               id INTEGER PRIMARY KEY,
               course TEXT,
               college TEXT,
               teacher TEXT,
               team TEXT,
               count INTEGER,
               process TEXT,
               brief TEXT)''')
driver = webdriver.Chrome()
#最大化浏览器
driver.maximize_window()
driver.get("https://www.icourse163.org/")
time.sleep(3)
#点击登录按钮
login_button = driver.find_element(By.XPATH,'//*[@id="app"]/div/div/div[1]/div[3]/div[3]/div')  
login_button.click()
time.sleep(3)
#反爬
driver.switch_to.default_content()
driver.switch_to.frame(driver.find_elements(By.TAG_NAME,'iframe')[0])
time.sleep(2)
#输入用户名
username=driver.find_element(By.XPATH,'/html/body/div[2]/div[2]/div[2]/form/div/div[2]/div[2]/input')
username.clear()
username.send_keys("18950090367")
time.sleep(2)
#输入密码 
password=driver.find_element(By.XPATH,'/html/body/div[2]/div[2]/div[2]/form/div/div[4]/div[2]/input[2]')
password.send_keys("Yy2039070@")
 
time.sleep(2)

login=driver.find_element(By.ID,"submitBtn")
login.click()
time.sleep(2)
driver.switch_to.default_content()
time.sleep(5)

#搜索框
search_box = driver.find_element(By.XPATH,'/html/body/div[4]/div[1]/div/div/div/div/div[7]/div[1]/div/div/div[1]/div/div/div/div/div/div/input')
search_box.send_keys("python", Keys.RETURN)
# 声明一个list,存储dict
data_list = []


def start_spider():
    WebDriverWait(driver, 10).until(EC.presence_of_all_elements_located((By.XPATH, '//div[@class="m-course-list"]/div/div')))
    # 将滚动条拉到最下面的位置,因为往下拉才能将这一页的商品信息全部加载出来
    driver.execute_script('document.documentElement.scrollTop=10000')
    # 随机延迟,等下元素全部刷新
    time.sleep(random.randint(3, 6))
    driver.execute_script('document.documentElement.scrollTop=0')

    # 开始提取信息,找到ul标签下的全部li标签
    num = 0
    for link in driver.find_elements(By.XPATH, '//div[@class="m-course-list"]/div/div'):
        num += 1
        course_name = link.find_element(By.XPATH, './/span[@class=" u-course-name f-thide"]').text
        try:
            school_name = link.find_element(By.XPATH, './/a[@class="t21 f-fc9"]').text
        except NoSuchElementException:
            school_name = ''  
        try:
            teacher = link.find_element(By.XPATH, './/a[@class="t21 f-fc9"]').text
        except NoSuchElementException:
            teacher = ''
        try:
            team_member = link.find_element(By.XPATH, './/a[@class="t21 f-fc9"]').text
        except NoSuchElementException:
            team_member = ''
        try:
            count = link.find_element(By.XPATH, './/span[@class="hot"]').text.replace('人参加', '')
        except NoSuchElementException:
            count = ''
        try:
            process = link.find_element(By.XPATH, './/span[@class="txt"]').text
        except NoSuchElementException:
            process = ''
        try:
            introduction = link.find_element(By.XPATH, './/span[@class="p5 brief f-ib f-f0 f-cb"]').text
        except NoSuchElementException:
            introduction = ''
        try:
            cursor.execute("INSERT INTO mooc (id, course,college,teacher,team,count,process,brief) VALUES (%s, %s,%s, %s, %s, %s, %s, %s)",
                           [num, str(course_name), str(school_name), str(teacher), str(team_member), str(count), str(process), str(introduction)])
        except Exception as err:
            print("出现错误:", err)
        conn.commit()
        print("数据已存入数据库")

def main():

    start_spider()
if __name__ == '__main__':

    main()
    # 退出浏览器
    driver.quit()
conn.close()

数据库输出:

 

心得体会:

这次作业难度提高了一些,不过还是可以完成的,其中count的数据如果有中文就会报错,只能用replace替换掉,其他的再操作中没遇到什么困难。


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

    •  

  • 任务二:配置Kafka
  •  

  • 任务三: 安装Flume客户端
  •  

  • 解压Flume客户端

  • 安装Flume客户端成功 

     

     

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

 

 可以看到数据已经发生变化

 

输出:实验关键步骤或结果截图。

二、编码要求

  • 本作业采用python作为编程语言
  • 符合python编程和命名规范
  • 对相关函数变量作出相应的注释

三、博客撰写要求

  1. 博客分为俩大标题,每个标题中分为俩个小标题
  2. 第一个小标题中内容包含作业代码和图片,第二个小标题中内容为作业心得
  3. 博客园中代码需要按代码块的形式添加
  4. 推荐使用markdown语法进行博客撰写,也可以使用博客园自带文档编辑器
  5. 可适当对标题内容进行拓展

四、作业评分项和规则