数据采集与融合技术第四次作业

数据采集与融合技术第四次作业

学号 102202124
姓名 阿依娜孜·赛日克
本次作业gitee链接 https://gitee.com/ayinazi/crawl_project/tree/master/作业4

作业背景与目标

本次作业聚焦于数据采集与融合技术领域,通过三项任务深入考察对相关技术的掌握程度,旨在全面提升我们在 Selenium 框架运用、数据库交互以及数据采集流程等方面的专业技能,为后续深入学习数据处理与分析奠定坚实基础。

一、Selenium 数据爬取实战

(一)股票数据爬取

在本次作业中,首先使用 Selenium 框架对东方财富网的股票数据进行爬取。以下是主要代码:

# 定义板块对应的URL和名称列表
board_urls = [
    ("http://quote.eastmoney.com/center/gridlist.html#hs_a_board", "沪深A股"),
    ("http://quote.eastmoney.com/center/gridlist.html#sh_a_board", "上证A股"),
    ("http://quote.eastmoney.com/center/gridlist.html#sz_a_board", "深证A股")
]

# 循环爬取各个板块数据
for board_url, board_name in board_urls:
    driver.get(board_url)
    # 等待页面加载
    try:
        WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, "//table")))
    except TimeoutException:
        print(f"{board_name} 页面加载超时")
        continue

    # 提取数据
    rows = driver.find_elements(By.XPATH, "//table/tbody/tr")
    for row in rows:
        cells = row.find_elements(By.TAG_NAME, "td")
        if cells:
            # 提取并存储数据到数据库
            stock_data = {
                'code': cells[1].text,
                'name': cells[2].text,
                'latest_price': cells[4].text,
                'change_degree': cells[5].text.replace('%', '').strip(),
                'change_amount': cells[6].text,
                'count': cells[7].text.replace('万', '').strip(),
                'money': cells[8].text,
                'zfcount': cells[9].text.replace('%', '').strip(),
                'highest': cells[10].text,
                'lowest': cells[11].text,
                'today': cells[12].text,
                'yestoday': cells[13].text
            }

            # 转换为适当的数据类型
            try:
                stock_data['change_degree'] = float(stock_data['change_degree']) / 100
                stock_data['zfcount'] = float(stock_data['zfcount']) / 100

                # 处理成交量,将万转换为实际数值
                stock_data['count'] = float(stock_data['count']) * 10000

                # 处理成交额,将亿或万转换为实际数值
                if '亿' in stock_data['money']:
                    stock_data['money'] = float(stock_data['money'].replace('亿', '').strip()) * 100000000
                elif '万' in stock_data['money']:
                    stock_data['money'] = float(stock_data['money'].replace('万', '').strip()) * 10000
                else:
                    stock_data['money'] = float(stock_data['money'])

            except ValueError as e:
                print(f"{board_name} 数据转换错误: {stock_data}, 错误: {e}")
                continue

            # 插入数据到MySQL
            insert_query = """
            INSERT INTO stocks (code, name, latest_price, change_degree, change_amount, count, money, zfcount, highest, lowest, today, yestoday)
            VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s)
            """
            try:
                mycursor.execute(insert_query, (
                    stock_data['code'], stock_data['name'], stock_data['latest_price'],
                    stock_data['change_degree'],
                    stock_data['change_amount'], stock_data['count'],
                    stock_data['money'], stock_data['zfcount'],
                    stock_data['highest'], stock_data['lowest'],
                    stock_data['today'], stock_data['yestoday']
                ))
                mydb.commit()
            except mysql.connector.Error as err:
                print(f"{board_name} 插入数据时出错: {err}")
                mydb.rollback()

运行结果

(二)MOOC 课程资源爬取

同样使用 Selenium 对中国 mooc 网课程资源进行爬取。代码如下:

class moocDB:
    def openDB(self):
        self.con = sqlite3.connect("mooc.db")
        self.cursor = self.con.cursor()
        try:
            self.cursor.execute("CREATE TABLE mooc (Num VARCHAR(16), Name VARCHAR(16), School VARCHAR(16), Teacher VARCHAR(16), Team VARCHAR(16), Person VARCHAR(16), Jindu VARCHAR(16),")
        except sqlite3.OperationalError:
            self.cursor.execute("DELETE FROM mooc")

    def closeDB(self):
        self.con.commit()
        self.con.close()

    def insert(self, count, name, school, teacher, team, person, jindu, jianjie):
        print(f"Inserting record {count}: Name={name}, School={school}, Teacher={teacher}, Team={team}, Person={person}, Jindu={jindu}, Jianjie={jianjie}")
        self.cursor.execute("INSERT INTO mooc (Num, Name, School, Teacher, Team, Person, Jindu, Jianjie) VALUES (?,?,?,?,?,?,?,?)",
                            (count, name, school, teacher, team, person, jindu, jianjie))

    def export_to_csv(self, csv_path):
        # 导出数据库数据到 CSV 文件
        self.cursor.execute("SELECT * FROM mooc")
        rows = self.cursor.fetchall()
        # 写入 CSV 文件
        with open(csv_path, mode='w', newline='', encoding='utf-8') as file:
            writer = csv.writer(file)
            writer.writerow(['Num', 'Name', 'School', 'Teacher', 'Team', 'Person', 'Jindu', 'Jianjie'])  # Header
            writer.writerows(rows)
        print(f"Data exported to {csv_path}")

def login():
    login_button = browser.find_element(By.XPATH, '//a[@class="f-f0 navLoginBtn"]')
    login_button.click()
    frame = browser.find_element(By.XPATH, '//div[@class="ux-login-set-container"]/iframe')
    browser.switch_to.frame(frame)
    inputUserName = browser.find_element(By.XPATH, '//div[@class="u-input box"][1]/input')
    inputUserName.send_keys("15909018227")
    inputPasswd = browser.find_element(By.XPATH, '//div[@class="inputbox"]/div[2]/input[2]")
    inputPasswd.send_keys("20020925Aa.")
    login_button = browser.find_element(By.XPATH, '//*[@id="submitBtn"]')
    login_button.click()
    time.sleep(5)

def next_page():
    next_button = browser.find_element(By.XPATH, '//li[@class="ux-pager_btn ux-pager_btn__next"]/a')
    next_button.click()

def start_spider(moocdb):
    browser.get(url)
    count = 0
    for i in range(2):
        WebDriverWait(browser, 1000).until(EC.presence_of_all_elements_located((By.ID, "j-courseCardListBox")))
        time.sleep(random.randint(3, 6))
        browser.execute_script('document.documentElement.scrollTop=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
            try:
                name = link.find_element(By.XPATH, './/span[@class=" u-course-name f-thide"]').text
            except:
                name = 'none'
            try:
                school = link.find_element(By.XPATH, './/a[@class="t21 f-fc9"]').text
            except:
                school = 'none'
            try:
                teacher = link.find_element(By.XPATH, './/a[@class="f-fc9"]').text
            except:
                teacher = 'none'
            try:
                team = link.find_element(By.XPATH, './/span[@class="f-fc9"]').text
            except:
                team = 'none'
            try:
                person = link.find_element(By.XPATH, './/span[@class="hot"]').text
            except:
                person = 'none'
            try:
                jindu = link.find_element(By.XPATH, './/span[@class="txt"]').text
            except:
                jindu = 'none'
            try:
                jianjie = link.find_element(By.XPATH, './/span[@class="p5 brief f-ib f-f0 f-cb"]').text
            except:
                jianjie = 'none'
            
            moocdb.insert(count, name, school, teacher, team, person, jindu, jianjie)
        
        next_page()
    login()

运行结果:保存为 csv 文件

二、大数据实验探索

(一)华为云大数据实验关键步骤

在华为云大数据实时分析处理实验中,按照实验手册完成了一系列任务。

  • 环境搭建:成功开通了 MapReduce 服务,这为后续的大数据处理提供了基础环境支持。


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

  • 任务二:配置 Kafka:对 Kafka 进行了配置,设置了相关的主题、生产者和消费者参数,确保数据能够在不同组件之间高效地传输和处理。


  • 任务三:安装 Flume 客户端:在相应的环境中安装了 Flume 客户端,为数据采集做好准备。


  • 任务四:配置 Flume 采集数据:根据实验要求,配置了 Flume 的数据源、通道和接收器,使得 Flume 能够准确地采集 Python 脚本生成的测试数据,并将其传输到指定的目的地,如 Kafka 主题。

在整个实验过程中,每一个步骤都紧密相连,从数据生成到最终的采集,构建了一个完整的数据处理流程的前端部分。

(二)作业心得

通过本次作业,我对 Selenium 框架有了更深入的理解和掌握。在爬取股票数据和 MOOC 课程资源时,深刻体会到了 Selenium 查找 HTML 元素的强大功能,尤其是在处理动态网页和 Ajax 数据时,它能够有效地获取到完整的数据信息。同时,在与 MySQL 数据库结合使用过程中,也进一步熟悉了数据库的操作流程,包括表的创建、数据的插入和事务的处理等。

在大数据实验方面,从环境搭建到各个任务的完成,让我对大数据处理的流程有了初步的认识。了解到数据在不同组件之间的流转和处理方式,明白了每个环节的重要性。例如,Python 脚本生成测试数据为整个实验提供了基础数据,而 Kafka 和 Flume 的配置则确保了数据能够在分布式环境中稳定地传输和采集。这不仅拓宽了我的技术视野,也让我意识到在大数据领域还有很多知识需要深入学习和探索。在未来的学习和实践中,我将继续努力,提升自己在数据处理和分析方面的能力,更好地应对复杂的数据处理任务。

posted on 2024-11-13 16:42  zzsthere  阅读(9)  评论(0编辑  收藏  举报