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

发布时间 2023-11-02 23:24:20作者: EI-Shaddoll-Midrash

作业①

要求:

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

代码如下:

import pymysql
from selenium import webdriver
from lxml import etree
import time
edge_options = webdriver.EdgeOptions()
edge_options.add_argument('--headless')
edge_options.add_argument('--disable-gpu')
driver = webdriver.Chrome(options=edge_options)

def Spider(url):
    driver.get(url)
    time.sleep(1)  # 等待页面加载完毕
    html = etree.HTML(driver.page_source)  # 获取网页HTML内容
    # print(html)
    # 获得元素信息
    lis = html.xpath('//*[@id="table_wrapper-table"]/tbody/tr')
    for link in lis:
        stock_id = link.xpath('./td[2]/a/text()')[0]
        stock_name = link.xpath('./td[3]/a/text()')[0]
        newest_price = link.xpath('./td[5]/span/text()')[0]
        up_down_extent = link.xpath('./td[6]/span/text()')[0]
        up_down_value = link.xpath('./td[7]/span/text()')[0]
        deal_value = link.xpath('./td[8]/text()')[0]
        freq = link.xpath('./td[10]/text()')[0]
        highest = link.xpath('./td[11]/span/text()')[0]
        lowest = link.xpath('./td[12]/span/text()')[0]
        opening = link.xpath('./td[13]/span/text()')[0]
        zt = link.xpath('./td[14]/text()')[0]
        try:
            # 打开数据库
            mydb = pymysql.connect(host="127.0.0.1", port=3306, user="root", passwd="123456", db="mydb", charset="utf8")
            # 创建游标
            mycursor = mydb.cursor()
            # sql语言
            sql = "INSERT INTO demo2 (stock_id, stock_name, newest_price, up_down_extent, up_down_value,deal_value, " \
                  "freq, highest, lowest, opening, zt) VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s)"
            val = (
            stock_id,stock_name,newest_price,up_down_extent,up_down_value,deal_value,freq,highest,lowest,opening,zt)
            # 执行语句
            mycursor.execute(sql, val)
            # 确认更新
            mydb.commit()
        except Exception as err:
            print(err)

def main():
    url1 = 'https://quote.eastmoney.com/center/gridlist.html#hs_a_board'  # 要爬取的网页URL
    url2 = 'https://quote.eastmoney.com/center/gridlist.html#sh_a_board'  # 要爬取的网页URL
    url3 = 'https://quote.eastmoney.com/center/gridlist.html#sz_a_board'  # 要爬取的网页URL
    #进行爬取工作
    Spider(url1)
    Spider(url2)
    Spider(url3)

if __name__ == '__main__':
    main()

效果展示



心得体会

这个实验和上个实验的内容接近,没有什么要过多注意的地方

作业②

要求:

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

代码如下:

import pymysql
from bs4 import BeautifulSoup
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
import time

rows = []


def findElement(html):
    soup = BeautifulSoup(html, 'html.parser')
    global rows
    try:
        # 尽量精确查找
        row = ''
        div_elements = soup.select('div[class="m-course-list"]>div>div')
        # 在div_element中获取需要的元素
        for div_element in div_elements:
            cCourse = cCollege = cTeacher = cTeam = cCount = cProcess = cBrief = ""
            #获取课程名字
            course_name = div_element.select_one('span[class="u-course-name f-thide"]')
            if course_name is not None:
                cCourse = course_name.text.strip()
            else:
                continue
            #获取学校名字
            college_name = div_element.select_one('a[class="t21 f-fc9"]')
            if college_name is not None:
                cCollege = college_name.text.strip()
            else:
                continue
            #获取老师名字
            teacher_name = div_element.select_one('a[class="f-fc9"]')
            if teacher_name is not None:
                cTeacher = teacher_name.text.strip()
            else:
                continue
            #获取团队名字
            team_name = div_element.select_one('span[class="f-fc9"]')
            if team_name is not None:
                cTeam = team_name.text.replace('、', ' ').strip()
            else:
                continue
            #获取人数
            count_num = div_element.select_one('span[class="hot"]')
            if count_num is not None:
                cCount = count_num.text.replace('人参加', '')
            else:
                continue
            #获取课程进度
            process_info = div_element.select_one('span[class="txt"]')
            if process_info is not None:
                cProcess = process_info.text
            else:
                continue
            #获取课程简介
            brief_info = div_element.select_one('span[class="p5 brief f-ib f-f0 f-cb"]')
            if brief_info is not None:
                cBrief = brief_info.text
            else:
                continue
            # 对获取到的元素进行拼接
            row = cCourse + "-" + cCollege + "-" + cTeacher + "-" + cTeam + "-" + str(
                cCount) + "-" + cProcess + "-" + cBrief
            rows.append(row)
    
    
    except Exception as err:
        print(err)
    return rows


def saveData():
    global rows
    # 进入数据库
    mydb = pymysql.connect(host="127.0.0.1", port=3306, user="root", passwd="123456", db="mydb",
                           charset="utf8")
    # 创建游标
    cursor = mydb.cursor()
    # 删除已有表
    cursor.execute("drop table mooc")
    # 新建表
    cursor.execute('''
                CREATE TABLE mooc (
              Id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
              cCourse VARCHAR(45),
              cCollege VARCHAR(45),
              cTeacher VARCHAR(45),
              cTeam VARCHAR(255),
              cCount VARCHAR(45),
              cProcess VARCHAR(45),
              cBrief VARCHAR(255)
            );

    ''')
    # 向表中插入数据
    for row in rows:
        print(row)
        data = row.split('-')
        cursor.execute(
            "INSERT INTO mooc (cCourse,cCollege,cTeacher,cTeam,cCount,cProcess,cBrief) VALUES (%s, %s, %s, %s, %s, %s, %s)",
            (data[0], data[1], data[2], data[3], data[4], data[5], data[6])
        )
    mydb.commit()

# 创建对象
edge_options = webdriver.EdgeOptions()
# edge_options.add_argument('--headless')
# edge_options.add_argument('--disable-gpu')
browser = webdriver.Chrome(options=edge_options)

url = 'https://www.icourse163.org/'
browser.get(url)  # 获取网页
time.sleep(1)  # 等待网页加载
browser.maximize_window()#放大网页至全屏
# 获取登录按键
loginbutton = browser.find_element(By.XPATH, '//div[@class="_1Y4Ni"]/div')
# 点击按键
loginbutton.click()
time.sleep(3)
# 转换到iframe
frame = browser.find_element(By.XPATH,
                             '/html/body/div[13]/div[2]/div/div/div/div/div/div[1]/div/div[1]/div[2]/div[2]/div[1]/div/iframe')
browser.switch_to.frame(frame)
# 输入账号
account = browser.find_element(By.ID, 'phoneipt').send_keys('13055261873*')
# 输入密码
password = browser.find_element(By.XPATH, '/html/body/div[2]/div[2]/div[2]/form/div/div[4]/div[2]/input[2]').send_keys(
    "**************")
# 获取登录按钮
logbutton = browser.find_element(By.XPATH, '/html/body/div[2]/div[2]/div[2]/form/div/div[6]/a')
# 点击按钮
logbutton.click()

# 等待登录成功页面加载完成
time.sleep(5)
# 跳出iframe
browser.switch_to.default_content()

# 等待页面成功加载
wait = WebDriverWait(browser, 10)
element = wait.until(EC.visibility_of_element_located((By.CSS_SELECTOR, ".inputtxt")))

# 找到输入框并输入内容
phone_input = browser.find_element(By.CSS_SELECTOR, ".inputtxt")
phone_input.send_keys("计算机")
# 点击搜索按钮
searchbutton = browser.find_element(By.CSS_SELECTOR, ".j-searchBtn")
searchbutton.click()

time.sleep(2)

for i in range(10):
    # 等待页面成功加载
    wait = WebDriverWait(browser, 10)  # 设置显式等待时间为10秒
    element = wait.until(
        EC.visibility_of_element_located((By.CSS_SELECTOR, ".th-bk-main-gh")))  # 等待元素可见
    html = browser.page_source
    findElement(html)
    # 实现翻页
    time.sleep(1)
    nextbutton = browser.find_element(By.CSS_SELECTOR, ".th-bk-main-gh")
    nextbutton.click()
# 保存到数据库
saveData()

# 关闭浏览器
print('over')
browser.quit()

效果展示:

心得体会:

这个实验的难点在于如何实现mooc的登录。(虽然不登录也可以实现爬取信息)。第一次发现找不到输入账号密码的框,然后发现这个登录界面是弹窗,最后发现这个输入框在iframe的document中,需要用iframe进行转换,然后才能实现输入。

作业③

要求:

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

进入/opt/client/目录,使用vi命令编写Python脚本:vi autodatapython.py

创建目录
使用mkdir命令在/tmp下创建目录flume_spooldir,我们把Python脚本模拟生成的数据放到此目录下,后面Flume就监控这个文件下的目录,以读取数据。


测试执行
执行Python命令,测试生成100条数据
查看数据

·任务二:配置 Kafka
设置环境变量
首先设置环境变量,执行source命令,使变量生效

在kafka中创建topic
执行如下命令创建topic,替换实际Zookeeper的IP

查看topic信息

·任务三: 安装 Flume 客户端
打开flume服务界面
进入MRS Manager集群管理界面,打开服务管理,点击flume,进入Flume服务
点击下载客户端
点击确定,等待下载

解压下载的flume客户端文件
使用Xshell7登录到上步中的弹性服务器上,进入/tmp/MRS-client目录

执行以下命令,解压压缩包获取校验文件与客户端配置包

校验文件包

解压“MRS_Flume_ClientConfig.tar”文件

安装Flume环境变量
执行以下命令,安装客户端运行环境到新的目录“/opt/Flumeenv”,安装时自动生成目录。
查看安装输出信息,如有以下结果表示客户端运行环境安装成功:

配置环境变量,执行命令:

解压Flume客户端
执行命令

安装Flume客户端
安装Flume到新目录”/opt/FlumeClient”,安装时自动生成目录。

重启Flume服务
执行一下命令

·任务四:配置 Flume 采集数据
修改配置文件
在conf目录下编辑文件properties.properties

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

执行完毕后,在新开一个Xshell 7窗口(右键相应会话-->在右选项卡组中打开),执行2.2.1步骤三的Python脚本命令,再生成一份数据,查看Kafka中是否有数据产生,可以看到,已经消费出数据了:

有数据产生,表明Flume到Kafka目前是打通的。测试完毕可以关闭Kafka的消费者窗口了。
输出:实验关键步骤或结果截图。

心得体会:

这个实验简单,就是按照word文档的步骤一步一步来就行了。