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

发布时间 2023-11-09 20:09:38作者: lxmlmx

一、作业内容

作业①:

熟练掌握 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......

点击查看部分代码
def getUrl(j):
    global count
    for i in range(70):
        js = 'window.scrollTo(0,%s)' % (i * 100)  # js脚本
        driver.execute_script(js)
    lists = driver.find_element(By.XPATH,"//tbody")
    list = lists.find_elements(By.XPATH,"./tr")
    columns = {0: "代码", 1: "名称", 2: "最新价格", 3: "涨跌额", 4: "涨跌幅", 5: "成交量", 6: "成交额", 7: "振幅",
               8: "最高", 9: "最低", 10: "今开", 11: "昨收"}
    print(columns)
    for i in list:
        column = i.find_elements(By.XPATH,"td")
        no = column[0].text    #序号
        code = column[1].text  #代码
        name = column[2].text#名称
        zuixin = column[4].text#最新价格
        er=    column[5].text#涨跌额
        fu=    column[6].text#涨跌幅
        chengjiaoliang=    column[7].text#成交量
        chengjiaoer  =   column[8].text#成交额
        zhenfu =    column[9].text#振幅
        zuigao =   column[10].text#最高
        zuidi  =  column[11].text#最低
        jinkai =  column[12].text#今开
        zuoshou =  column[13].text#昨收
        print("\t"+no+"\t"+code+"\t"+name+"\t"+zuixin+"\t"+er+"\t"+
              fu,end='')        print("\t"+chengjiaoliang+"\t"+chengjiaoer+"\t"+zhenfu+"\t"+zuigao+zuidi+"\t"+jinkai+"\t"+zuoshou)
if __name__ == '__main__':
    driver = webdriver.Chrome()
    key = ["hs", "sh", "sz"]
    for i in range(len(key)):
        keyword = urllib.parse.quote(key[i])
        driver = webdriver.Chrome()  # 创建Chrome浏览器
        url = f"http://quote.eastmoney.com/center/gridlist.html#{keyword}_a_board"
        driver.get(url)
        getUrl(i)

查看数据库代码
class Mysql:
    def process_item(self, item, spider):
        self.mydb = pymysql.connect(
            host="192.168.149.1",
            port=3306,
            user='root',
            password='123456',
            database="stock",
            charset='utf8'
        )
        self.cursor = self.mydb.cursor()
        self.cursor.execute('''CREATE TABLE IF NOT EXISTS stocks(
                                                  stockname VARCHAR(256),
                                                  name VARCHAR(256),
                                                  newprice VARCHAR(256),
                                                  zhangdiefu VARCHAR(256),
                                                  zhangdieer VARCHAR(256),
                                                  chengjiaoliang VARCHAR(256),
                                                  chengjiaoer VARCHAR(256),
                                                  zhenfu VARCHAR(256),
                                                  zuigao VARCHAR(256),
                                                  zuidi VARCHAR(256),
                                                  jinkai VARCHAR(256),
                                                  zuoshou VARCHAR(256)
                                                   )''')

        self.mydb.commit()
        sql = "insert into stocks values (%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s)"
        self.cursor.execute(sql,(item.get("stockname"),item.get("name"),item.get("newprice"), item.get("zhangdiefu"),item.get("zhangdieer"), item.get("chengjiaoliang"), item.get("chengjiaoer"), item.get("zhenfu"), item.get("zuigao"),item.get("zuidi"), item.get("jinkai"),item.get("zuoshou")))

        self.mydb.commit()
        return item
    def close_spider(self, spider):
        self.mydb.close()

码云链接:
https://gitee.com/lxmlmx/crawl_project/blob/master/作业4/stocks.py
结果截图:

image
image

心得体会:进一步掌握使用selenium来爬取数据。

作业②:

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

输出信息:MYSQL数据库存储和输出格式

Gitee文件夹链接
Git文件夹

Id cCourse cCollege cTeacher cTeam cCount cProcess cBrief
1 Python数据分析与展示 北京理工大学 嵩天 嵩天 470 2020年11月17日 ~ 2020年12月29日 “我们正步入一个数据或许比软件更重要的新时代。——Tim O'Reilly” ……
2......

点击查看代码
# _*_ coding : utf-8 _*_
# @Time : 2023/11/2 15:20
# @Author : lvmingxun
# @File : mooc
# @Project : shucai_homework
from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
import time
import random
import pymysql

# 声明一个谷歌驱动器,并设置不加载图片,间接加快访问速度
options = webdriver.ChromeOptions()
options.add_experimental_option('prefs', {'profile.managed_default_content_settings.images': 2})
browser = webdriver.Chrome(options=options)
url = "https://www.icourse163.org/search.htm?search=%E5%A4%A7%E6%95%B0%E6%8D%AE#/"
# 声明一个list,存储dict
data_list = []


def start_spider():
    # 请求url
    browser.get(url)
    # 显示等待商品信息加载完成
    WebDriverWait(browser, 1000).until(
        EC.presence_of_all_elements_located(
            (By.ID, "j-courseCardListBox")
        )
    )
    # 将滚动条拉到最下面的位置,因为往下拉才能将这一页的商品信息全部加载出来
    browser.execute_script('document.documentElement.scrollTop=10000')
    # 随机延迟,等下元素全部刷新
    time.sleep(random.randint(3, 6))
    browser.execute_script('document.documentElement.scrollTop=0')

    # 开始提取信息,找到ul标签下的全部li标签
    count = 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
        # 课程号
        #  course_id = link.find_element_by_xpath('.//div[@class="p-name"]//em').text
        # 课程名称
        course_name = link.find_element(By.XPATH,'.//span[@class=" u-course-name f-thide"]').text
        print("course name ", course_name)
        school_name = link.find_element(By.XPATH,'.//a[@class="t21 f-fc9"]').text
        print("school ", school_name)
        # 主讲教师
        m_teacher = link.find_element(By.XPATH,'.//a[@class="f-fc9"]').text
        print("laoshi:", m_teacher)
        # 团队成员
        try:
            team_member = link.find_element(By.XPATH,'.//span[@class="f-fc9"]').text
        except Exception as err:
            team_member = 'none'
        # print("团队:",team_member)
        # 参加人数
        join = link.find_element(By.XPATH,'.//span[@class="hot"]').text
        join.replace('参加', '')
        print("参加人数", join)
        # 课程进度
        process = link.find_element(By.XPATH,'.//span[@class="txt"]').text
        print('jingdu ', process)
        # 课程简介
        introduction = link.find_element(By.XPATH,'.//span[@class="p5 brief f-ib f-f0 f-cb"]').text
        print(introduction)

        conn = pymysql.connect(host="127.0.0.1", port=3306, user="root", passwd="123456", db="mydb", charset="utf8")
        # 获取游标
        cursor = conn.cursor()
        # 插入数据,注意看有变量的时候格式
        try:
            cursor.execute(
                "INSERT INTO mooc (`id`,`course`,`college`,`teacher`,`team`,`count`,`process`,`brief`) VALUES (%s,%s,%s,%s,%s,%s,%s,%s)",
                (str(count), course_name, school_name, m_teacher, team_member, join, process, introduction))
            # 提交
        except Exception as err:
            print("error is ")
            print(err)
            # 关闭连接
        conn.commit()
        conn.close()

        # 遍历


def main():
    start_spider()


if __name__ == '__main__':
    main()
    # 退出浏览器
    browser.quit()

码云链接:https://gitee.com/lxmlmx/crawl_project/blob/master/作业4/mooc.py

运行结果:
image

心得体会:更加熟练使用selenium框架和mysql来爬取网站信息。

作业③:

要求:
掌握大数据相关服务,熟悉Xshell的使用

完成文档 华为云_大数据实时分析处理实验手册-Flume日志采集实验(部分)v2.docx 中的任务,即为下面5个任务,具体操作见文档。

环境搭建:

任务一:开通MapReduce服务

image

image

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

任务三:配置Kafka
image
image

任务四: 安装Flume客户端
image
image
image
image
image
image
image
image

任务五:配置Flume采集数据
image

image

image
心得体会:学会使用华为云做大数据分析的各种配置