gbcmakehsht

导航

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

作业①

实验内容

要求

熟练掌握 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 10.92 26.13万 7.6亿 22.34 32.0 28.08 30.20 17.55

Gitee文件夹链接

Gitee仓库

代码

def getdata(url):
    browser = webdriver.Chrome()
    browser.get(url)
    browser.maximize_window()
    for page in range(1, 3):
        if (page == 2):
            browser.find_element(By.XPATH, '//*[@id="main-table_paginate"]/span[1]/a[2]').click()  # 第二页
            time.sleep(3)
        i = 1  # 行数
        element = browser.find_element(By.ID, "table_wrapper-table")
        trlist = element.find_elements(By.TAG_NAME, "tr")  # 获得行
        string1 = '//*[@id="table_wrapper-table"]/tbody/tr['
        string2 = ']/td[3]/a'

        for tr in trlist[i:]:
            tdlist = tr.find_elements(By.TAG_NAME, "td")  # 获得列
            name = tdlist[2].text
            string = string1 + str(i) + string2

            browser.find_element(By.XPATH, string).click()
            current_window = browser.window_handles
            browser.switch_to.window(current_window[1])  # 获取当前页面页柄
            browser.find_element(By.XPATH, '//*[@id="zjl_box"]/div[1]/ul/li[2]/h3/a').click()  # 到达每个公司财务报表
            time.sleep(2)
            current_window = browser.window_handles
            browser.switch_to.window(current_window[2])

            browser.find_element(By.XPATH, '//*[@id="zyzbTab"]/li[2]').click()  # 主要指标按年度
            time.sleep(2)
            table = browser.find_element(By.CLASS_NAME, "needScroll")  # 主要指标
            datalist = []
            trlist = table.find_elements(By.TAG_NAME, "tr")
            for item in trlist:
                tdlist = item.find_elements(By.TAG_NAME, "td")
                if len(tdlist) == 0:
                    tdlist = item.find_elements(By.TAG_NAME, "th")
                cell = []
                for it in tdlist:
                    cell.append(it.text)
                datalist.append(cell)

            browser.find_element(By.XPATH, '/html/body/div[1]/div[2]/div[6]/div[2]/div[1]/ul/li[2]').click()  # 资产负债表按年度
            time.sleep(1)
            table_zcfzb = browser.find_element(By.ID, 'report_zcfzb_table')  # 资产负债表
            datalist_zcfzb = []
            trlist_zcfzb = table_zcfzb.find_elements(By.TAG_NAME, "tr")
            for item in trlist_zcfzb:
                if (item.is_displayed() == False):  # 跳过隐藏标签
                    continue
                tdlist_zcfzb = item.find_elements(By.TAG_NAME, "td")
                if len(tdlist_zcfzb) == 0:
                    tdlist_zcfzb = item.find_elements(By.TAG_NAME, "th")
                cell_zcfzb = []
                for it in tdlist_zcfzb:
                    if (it.text == "审计意见(境内)"):  # 跳过审计意见
                        break
                    cell_zcfzb.append(it.text)
                datalist_zcfzb.append(cell_zcfzb)

            # for item in datalist_zcfzb:
            #    print(item)

            browser.find_element(By.XPATH, '/html/body/div[1]/div[2]/div[7]/div[2]/div[1]/ul/li[2]').click()  # 利润表按年度
            time.sleep(1)
            table_lrb = browser.find_element(By.XPATH, "//*[@id='report_lrb_table']")  # 利润表
            datalist_lrb = []
            trlist_lrb = table_lrb.find_elements(By.TAG_NAME, "tr")
            for item in trlist_lrb:
                   if (item.is_displayed() == False):  # 跳过隐藏标签
                    continue
                tdlist_lrb = item.find_elements(By.TAG_NAME, "td")
                if len(tdlist_lrb) == 0:
                    tdlist_lrb = item.find_elements(By.TAG_NAME, "th")
                cell_lrb = []
                for it in tdlist_lrb:
                    if (it.text == "审计意见(境内)"):  # 跳过审计意见
                        break
                    cell_lrb.append(it.text)
                datalist_lrb.append(cell_lrb)

            browser.find_element(By.XPATH, '/html/body/div[1]/div[2]/div[8]/div[2]/div[1]/ul/li[2]').click()  # 现金流量表按年度
            time.sleep(1)
            table_xjllb = browser.find_element(By.XPATH, "//*[@id='report_xjllb_table']")  # 现金流量表
            datalist_xjllb = []
            trlist_xjllb = table_xjllb.find_elements(By.TAG_NAME, "tr")
            for item in trlist_xjllb:
                if (item.is_displayed() == False):  # 跳过隐藏标签
                    continue
                tdlist_xjllb = item.find_elements(By.TAG_NAME, "td")
                if len(tdlist_xjllb) == 0:
                    tdlist_xjllb = item.find_elements(By.TAG_NAME, "th")
                cell_xjllb = []
                for it in tdlist_xjllb:
                    if (it.text == "审计意见(境内)"):  # 跳过审计意见
                        break
                    cell_xjllb.append(it.text)
                datalist_xjllb.append(cell_xjllb)

            # for item in datalist_zcfzb:
            #     print(item)
            saveData(name, datalist, datalist_zcfzb, datalist_lrb, datalist_xjllb)
            browser.close()
            browser.switch_to.window(current_window[1])
            browser.close()
            browser.switch_to.window((current_window[0]))
            i = i + 1

    browser.close()
def saveData(name, datalist, datalist_zcfzb, datalist_lrb, datalist_xjllb):
    # file_str = './liquor_data/'+name+'_指标'+'.xls'
    workbook = xlwt.Workbook()
    worksheet = workbook.add_sheet('主要指标')
    worksheet_zcfzb = workbook.add_sheet('资产负债表')
    worksheet_lrb = workbook.add_sheet('利润表')
    worksheet_xjllb = workbook.add_sheet('现金流量表')

    n_row = len(datalist)
    n_col = len(datalist[0])
    for l in range(n_row):
        for m in range(n_col):
            worksheet.write(l, m, datalist[l][m])

    n_row_1 = len(datalist_zcfzb)
    n_col_1 = len(datalist_zcfzb[0])
    for l in range(n_row_1 - 1):
        for m in range(n_col_1):
            worksheet_zcfzb.write(l, m, datalist_zcfzb[l][m])

    n_row_2 = len(datalist_lrb)
    for l in range(n_row_2 - 1):
        for m in range(len(datalist_lrb[0])):
            worksheet_lrb.write(l, m, datalist_lrb[l][m])

    n_row_3 = len(datalist_xjllb)
    n_col_3 = len(datalist_xjllb[0])
    for l in range(n_row_3 - 1):
        for m in range(n_col_3):
            worksheet_xjllb.write(l, m, datalist_xjllb[l][m])

    # workbook.save(file_str)
    workbook.save(name + "财报" + ".xls")

结果

实验心得

在使用Selenium来爬取网页数据时,Selenium提供了强大的工具来查找HTML元素,这使得我们可以精确地获取我们想要的数据。此外,通过爬取Ajax网页数据,我们可以获取到动态加载的内容,这对于许多现代网站来说是非常重要的。在使用Selenium时,需要等待HTML元素。很多时候,网页需要一些时间来加载所有元素,特别是那些动态加载的元素。通过使用Selenium的等待功能,我们可以确保在获取元素之前,该元素已经完全加载

作业②

实验内容

要求

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

Gitee文件夹链接

Gitee仓库

代码

if __name__ == '__main__':
    # writer = pd.ExcelWriter("./mooc课程评论.xls")  # 设置保存Excel 路径
    driver = webdriver.Chrome()  # 设置chrome驱动
    url = 'https://www.icourse163.org/course/BIT-268001'  # 设置要爬取的课程链接
    # ["用户","内容","时间","点赞数","第几次课程"] 待爬取的内容

    driver.get(url)
    cont = driver.page_source
    soup = BeautifulSoup(cont, 'html.parser')
    ele = driver.find_element(By.ID, "review-tag-button")  # 点击 课程评价
    ele.click()
    xyy = driver.find_element(By.CLASS_NAME, "ux-pager_btn__next")  # 翻页功能
    connt = driver.page_source
    soup = BeautifulSoup(connt, 'html.parser')  # 得到网页源代码

    all_table = []  # 保存所需数据
    all_table.append(["用户", "内容", "时间", "点赞数", "第几次课程"])

    for i in range(1374):  # 共1373页
        xyy.click()
        connt = driver.page_source
        soup = BeautifulSoup(connt, 'html.parser')
        content = soup.find_all('div', {
            'class': 'ux-mooc-comment-course-comment_comment-list_item_body'})  # 全部评论

        for ctt in content:
            # 获取用户名
            user_name = ctt.find("a", {
                "class": "primary-link ux-mooc-comment-course-comment_comment-list_item_body_user-info_name"})
            user_name = user_name.text
            print(user_name)

            # 发布时间
            publish_time = ctt.find('div', {
                'class': 'ux-mooc-comment-course-comment_comment-list_item_body_comment-info_time'})
            publish_time = publish_time.text
            publish_time = publish_time[4:]
            print(publish_time)

            # 第几次课程
            course_nums = ctt.find('div', {
                'class': 'ux-mooc-comment-course-comment_comment-list_item_body_comment-info_term-sign'})
            course_nums = course_nums.text
            course_nums = course_nums.replace(" ", "")
            course_nums = course_nums.replace("\n", "")
            print(course_nums)

            scontent = []
            aspan = ctt.find_all('span')
            for span in aspan:
                scontent.append(span.string)

            # 点赞数
            like = scontent[5]

            # 课程内容
            scontent = scontent[1]
            print(scontent)

            all_table.append([user_name, scontent, publish_time, like, course_nums])

结果

心得体会

首先,使用Selenium的WebDriver功能来打开中国mooc网的网站,并使用XPath和CSS选择器来查找和定位需要的HTML元素。然后,通过模拟用户登录的过程,实现了对中国mooc网的爬取。这个过程中,使用了Selenium的wait功能来等待网页元素的加载,特别是那些需要Ajax加载的元素。同时,深入理解了如何通过Selenium来模拟用户的行为,如点击按钮、输入文本等。

作业③

实验内容

要求

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

输出信息

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

结果




心得体会

第一次接触到华为云相关的资源,学习了华为云集群的部署和Flume1日志的使用。

posted on 2023-11-07 18:09  柚子湖  阅读(35)  评论(0编辑  收藏  举报