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

发布时间 2023-11-06 21:28:30作者: 一戴宗师

作业①

(1)实验内容

o要求:熟练掌握 Selenium 查找 HTML 元素、爬取 Ajax 网页数据、等待 HTML 元素等内容。使用 Selenium 框架+ MySQL 数据库存储技术路线爬取“沪深 A 股”、“上证 A 股”、“深证 A 股”3个板块的股票数据信息。

候选网站:

东方财富网:http://quote.eastmoney.com/center/gridlist.html#hs_a_board

o输出信息:

MYSQL 数据库存储和输出格式如下,表头应是英文命名例如:序号id,股票代码:bStockNo……,由同学们自行定义设计表头:

oGitee 文件夹链接:

码云链接

o核心代码

获取各个页面相应数据
driver=webdriver.Chrome(chrome_options)
# 等待页面成功加载
wait = WebDriverWait(driver, 10)
numbers=[]
number1 = eval(input("请输入爬取沪深京A股数量:"))
numbers.append(number1)
number2 = eval(input("请输入爬取上证A股数量:"))
numbers.append(number2)
number3 = eval(input("请输入爬取深证A股数量:"))
numbers.append(number3)

url_strs=["hs","sh","sz"]
datasets=[]

def spider(url_str,number):
    url="https://quote.eastmoney.com/center/gridlist.html#"+url_str+"_a_board"
    driver.get(url)
    time.sleep(2) # 等待页面加载完毕
    datas = []
    if url_str=="hs":
        name="沪深京A股"
    elif url_str=="sh":
        name = "上证A股"
    else:
        name = "深证A股"
    while len(datas) < number:
        stocks = driver.find_elements(By.XPATH, "//div[@class='listview full']//tbody//tr")
        for stock in stocks:
            data = []
            data.append(name)
            Num = stock.find_element(By.XPATH, "./td[1]").text
            data.append(Num)
            Code = stock.find_element(By.XPATH, "./td[2]/a").text
            data.append(Code)
            Name = stock.find_element(By.XPATH, "./td[3]/a").text
            data.append(Name)
            Price = stock.find_element(By.XPATH, "./td[5]/span").text
            data.append(Price)
            Updown = stock.find_element(By.XPATH, "./td[6]/span").text
            data.append(Updown)
            Updownnumber = stock.find_element(By.XPATH, "./td[7]/span").text
            data.append(Updownnumber)
            Trade = stock.find_element(By.XPATH, "./td[8]").text
            data.append(Trade)
            Tradenumber = stock.find_element(By.XPATH, "./td[9]").text
            data.append(Tradenumber)
            Swing = stock.find_element(By.XPATH, "./td[10]").text
            data.append(Swing)
            Highest = stock.find_element(By.XPATH, "./td[11]").text
            data.append(Highest)
            Lowest = stock.find_element(By.XPATH, "./td[12]/span").text
            data.append(Lowest)
            Today = stock.find_element(By.XPATH, "./td[13]/span").text
            data.append(Today)
            Yesterday = stock.find_element(By.XPATH, "./td[14]").text
            data.append(Yesterday)
            datas.append(data)
        nextpage = wait.until(EC.element_to_be_clickable((By.XPATH, '//a[@class="next paginate_button"]'))) #翻页处理,注意翻页不能过快
        nextpage.click()
        time.sleep(1)
    datasets.append(datas)

for i in range(3):
    spider(url_strs[i],numbers[i])

数据库类stocksSQL.py
import pymysql
class stocksSQL:

    def openSQL(self):
        try:
            self.con = pymysql.connect(host='localhost', port=3306, user='root', password='985211', charset='utf8')
            self.cursor = self.con.cursor()
            self.cursor.execute("CREATE DATABASE IF NOT EXISTS stocks")
            self.cursor.execute("USE stocks")
            self.cursor.execute("CREATE TABLE IF NOT EXISTS stocks(Board varchar(10),Num varchar(16), Code varchar(16),names varchar(16),Price varchar(16),Updown varchar(16),Updownnumber varchar(16),Trade varchar(16),Tradenumber varchar(16),Swing varchar(16),Highest varchar(16),Lowest varchar(16),Today varchar(16),Yesterday varchar(16))")
            self.opened = True
            print("opened")
        except Exception as e:
            print(e)
            self.opened = False

    def closeSQL(self):
        if self.opened:
            self.con.commit()
            self.con.close()
            self.opened = False
            print("closed")

    def inserSQL(self,Board,Num,Code,names,Price,Updown,Updownnumber,Trade,Tradenumber,Swing,Highest,Lowest,Today,Yesterday):
        try:
            if self.opened:
                self.cursor.execute("INSERT INTO stocks VALUES (%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s)",
                                    (Board,Num,Code,names,Price,Updown,Updownnumber,
                                     Trade,Tradenumber,Swing,Highest,Lowest,Today,Yesterday))
        except Exception as err:
            print(err)

插入数据
#设置数据库对象并开启数据库
stocks_sql=stocksSQL()
stocks_sql.openSQL()
#向数据库中插入数据
for i in range(3):
    for j in range(numbers[i]):
        stocks_sql.inserSQL(datasets[i][j][0],datasets[i][j][1],datasets[i][j][2],datasets[i][j][3],
                            datasets[i][j][4],datasets[i][j][5],datasets[i][j][6],datasets[i][j][7],
                            datasets[i][j][8],datasets[i][j][9],datasets[i][j][10],datasets[i][j][11],
                            datasets[i][j][12],datasets[i][j][13])
        # 打印台输出查看数据
        print(datasets[i][j])
#关闭数据库
stocks_sql.closeSQL()

o运行结果:

o查看MySQL数据库:

(2)心得体会

此次实验通过使用 Selenium 框架爬取东方财富网3个板块的股票数据信息,再次巩固了 Selenium 基础知识,加深了对 Selenium 框架的理解,同时巩固了Xpath的使用。

作业②

(1)实验内容

o要求:熟练掌握 Selenium 查找 HTML 元素、实现用户模拟登录、爬取 Ajax 网页数据、等待 HTML 元素等内容。使用 Selenium 框架+MySQL 爬取中国 mooc 网课程资源信息(课程号、课程名称、学校名称、主讲教师、团队成员、参加人数、课程进度、课程简介)

候选网站:

中国 mooc 网:https://www.icourse163.org

o输出信息:

MYSQL 数据库存储和输出格式

技巧步骤:

(1)实现登录。进入页面点击登录按钮,由于MOOC网站没有设置验证码,因此找到对应输入框输入手机号和密码后点击登录按钮即可实现登录。注意:多次重复登录后可能会出现滑动验证,影响代码运行结果。
(2)完成搜索。找到搜索输入框,输入所要查找课程类型。
(3)解析爬取。解析网页内容,爬取各个页面相应数据。
(4)插入数据库。

oGitee 文件夹链接:

码云链接

o核心代码

实现登录
# 等待页面成功加载
wait = WebDriverWait(driver, 10)
# 找到登录按钮并点击
loginbutton = driver.find_element(By.XPATH, "//a[@class='f-f0 navLoginBtn']")
loginbutton.click()
# 等待登录页面加载成功
time.sleep(1)
# 定位到iframe
iframe = driver.find_element(By.TAG_NAME, "iframe")
# 句柄切换进iframe
driver.switch_to.frame(iframe)
# 找到手机号输入框并输入内容
user_input = driver.find_element(By.XPATH, "//input[@id='phoneipt']").send_keys("19996859201")
time.sleep(1)
# 找到密码输入框并输入内容
psd_input = driver.find_element(By.XPATH, "//input[@class='j-inputtext dlemail']").send_keys("985211Ss")
time.sleep(1)
# 找到登录按钮并点击
loginbutton = driver.find_element(By.XPATH, "//a[@id='submitBtn']")
loginbutton.click()
# 等待登录成功页面加载完成
time.sleep(1)
# 跳出iframe
driver.switch_to.default_content()

完成搜索
#输入所要查找课程类型及查找数量
course_name=input("请输入查找课程类型:")
numbers = eval(input("请输入爬取课程数量:"))  # 获取爬取数目
# 找到搜索输入框并输入内容
course_input = driver.find_element(By.XPATH, "//input[@class='j-textarea inputtxt']")
course_input.send_keys(course_name)
time.sleep(1)
# 点击搜索按钮
searchbutton = driver.find_element(By.XPATH,"//span[@class='u-icon-search2 j-searchBtn']")
searchbutton.click()
time.sleep(1)

解析爬取
datas=[]
def spider():
    # 获取网页内容
    content = driver.page_source
    selector = Selector(text=content)
    courses = selector.xpath("//div[@class='m-course-list']/div/div")
    for course in courses:
        data = []
        #存在广告课程,而广告课程没有课程进度,通过是否存在课程进度来判断是否为广告课程进而决定是否爬取
        cProcess_str = course.xpath(".//span[@class='txt']//text()").extract()
        cProcess = "".join(cProcess_str)
        if cProcess == "":
            continue
        else:
            #课程号、课程名称、学校名称、主讲教师、团队成员、参加人数、课程进度、课程简介
            course_str = course.xpath(".//span[@class=' u-course-name f-thide']//text()").extract()
            cCourse = "".join(course_str)
            data.append(cCourse)
            cCollege_str = course.xpath(".//a[@class='t21 f-fc9']//text()").extract()
            cCollege = "".join(cCollege_str)
            data.append(cCollege)
            cTeacher_str = course.xpath(".//div[@class='t2 f-fc3 f-nowrp f-f0']/a[@class='f-fc9']//text()").extract()
            cTeacher = "".join(cTeacher_str)
            data.append(cTeacher)
            cTeam_str = course.xpath(".//a[@class='f-fc9']//text()").extract()
            cTeam = ",".join(cTeam_str)  # 将其内容以 , 分隔
            data.append(cTeam)
            cCount_str = course.xpath(".//span[@class='hot']//text()").extract()
            cCount_str = "".join(cCount_str)
            cCount = cCount_str.strip("人参加")#只获取数值
            data.append(cCount)
            data.append(cProcess)
            cBrief_str = course.xpath(".//span[@class='p5 brief f-ib f-f0 f-cb']//text()").extract()
            cBrief = "".join(cBrief_str)
            data.append(cBrief)
        datas.append(data)

插入数据库
#设置数据库对象并开启数据库
courses_sql = coursesSQL()
courses_sql.openSQL()

while len(datas)<numbers:
    spider()
    nextpage = wait.until(EC.element_to_be_clickable((By.XPATH, '//a[@class="th-bk-main-gh"]')))
    nextpage.click()
    time.sleep(1)
#向数据库中插入数据
for i in range(numbers):
    courses_sql.inserSQL(str(i+1),datas[i][0],datas[i][1],datas[i][2],datas[i][3],datas[i][4],datas[i][5],datas[i][6])
#关闭数据库
courses_sql.closeSQL()

o运行结果:

o查看MySQL数据库:

o问题与解决:

(1)登录完成后,会出现如下页面,此协议不影响我们搜索课程,我们可以忽略不管,也可以编写代码点击同意在进行搜索课程。

(2)搜索课程,进入课程详情页面后,观察课程,发现存在类似如下广告课程,不符合我们爬取课程的要求。

通过对比观察,广告课程没有课程进度,可通过是否存在课程进度来判断是否为广告课程进而决定是否爬取

(3)爬取数据,插入数据到数据库时,需注意数据字段长度,尽量设置得比数据字段长度长,否则将报错。

(2)心得体会

此次实验的难点在于如何实现 mooc 的登录(尽管不登录也可以实现爬取信息)。实现登录过程中,尽管代码正确,网络等其他因素可能也会造成程序运行出错,需要特别注意。此次实验巩固了selenium爬取网站的知识,深刻学习了selenium相关操作。

作业③

(1)实验内容

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

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

o环境搭建:

任务一:开通 MapReduce 服务

o实时分析开发实战:

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

(1)编写Python脚本,使用Xshell 7连接服务器

进入/opt/client/目录,用xftp7将本地的autodatapython.py文件上传至服务器/opt/client/目录下即可

(2)创建目录,测试执行执行Python命令,测试生成100条数据,查看结果

任务二:配置 Kafka

(1)设置环境变量,首先设置环境变量,执行source命令,使变量生效。

(2)在kafka中创建topic,查看topic信息

任务三: 安装 Flume 客户端

(1)打开flume服务界面,进入MRS Manager集群管理界面,打开服务管理,点击flume,进入Flume服务,点击下载客户端

(2)解压下载的flume客户端文件,使用Xshell7登录到上步中的弹性服务器上,进入/tmp/MRS-client目录,执行以下命令,解压压缩包获取校验文件与客户端配置包

(3)校验文件包

(4)解压“MRS_Flume_ClientConfig.tar”文件

(5)安装Flume环境变量,执行以下命令,安装客户端运行环境到新的目录“/opt/Flumeenv”,安装时自动生成目录。

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

(6)解压Flume客户端

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

(8)重启Flume服务

任务四:配置 Flume 采集数据

(1)修改配置文件,进入Flume安装目录,在conf目录下编辑文件properties.properties(同样是建议把内容复制到本地文件,修改ip地址后用Xshell上传到服务器,而不是直接vi/vim往里面复制。)

(2)创建消费者消费kafka中的数据(记得改完配置文件要用source命令使其生效),然后执行命令。

(3)执行完毕后,在新开一个Xshell 7窗口执行2.2.1步骤三的Python脚本命令,再生成一份数据,查看Kafka中是否有数据产生。

(4)可以看到,已经出现数据。有数据产生,表明Flume到Kafka目前是打通的。测试完毕可以关闭Kafka的消费者窗口了。

(2)心得体会

通过此次实验,初步了解了华为云服务器,主要介绍如何使用Flume进行实时流前端数据采集,便于之后的数据处理和可视化,是实时流场景数据流通的部分工作。实验结束后及时释放资源避免产生额外费用。