数据采集第四次实验

作业1

仓库链接:https://gitee.com/jyppx000/crawl_project

作业①

要求:

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

1.1 代码和图片

代码:

"""
实现思路:
    1.连接数据库
    2.使用 selenium 打开 Chrome 浏览器,根据用户输入的选择(1、2、3),分别加载不同的网页链接
    3.数据爬取 遍历用户输入的页数 n 查找页面中的股票数据行 从每行中提取股票的详细信息,如代码、名称、最新报价
    4.存储数据:将提取的股票信息通过 INSERT 语句存入对应的数据库表中
    5.页面导航:模拟点击“下一页”按钮,继续爬取下一页数据
"""
import time
import pymysql
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.action_chains import ActionChains


conn = pymysql.connect(host="127.0.0.1", port=3306, user='root', passwd='123456', charset='utf8', db='east_money')
cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)

driver = webdriver.Chrome()

print("请输入需要查找的股票,1:沪深京,2:上证,3:深证")
while True:
    num = input("请输入:")
    if num == '1':
        # 沪深京A股
        driver.get("https://quote.eastmoney.com/center/gridlist.html#hs_a_board")
        table_name = "stocks_hs_a"
        break
    elif num == '2':
        # 上证A股
        driver.get("https://quote.eastmoney.com/center/gridlist.html#sh_a_board")
        table_name = "stocks_sh_a"
        break
    elif num == '3':
        # 深证A股
        driver.get("https://quote.eastmoney.com/center/gridlist.html#sz_a_board")
        table_name = "stocks_sz_a"
        break


cursor.execute(f'''CREATE TABLE IF NOT EXISTS {table_name}
                (id INTEGER PRIMARY KEY,
                code TEXT,
                name TEXT,
                latest_price TEXT,
                change_percent TEXT,
                change_amount TEXT,
                volume TEXT,
                turnover TEXT,
                amplitude TEXT,
                highest TEXT,
                lowest TEXT,
                open_price TEXT,
                close_price TEXT)''')


cursor.execute(f"DELETE FROM {table_name}")

n = input("请输入需要查找的页码:")
n = int(n)
# 爬取前n页股票信息
for page in range(1, n + 1):  # 爬取n页
    print(f"正在爬取第 {page} 页股票信息")

    # 定位所有股票信息的元素
    stocks_list = driver.find_elements(By.XPATH, "//div[@class='listview full']//tbody//tr")

    # 打印股票信息
    for stock in stocks_list:
        stock_id = stock.find_element(By.XPATH, './/td[1]').text
        stock_code = stock.find_element(By.XPATH, './/td[2]/a').text
        stock_name = stock.find_element(By.XPATH, './/td[3]/a').text
        stock_latest_price = stock.find_element(By.XPATH, './/td[5]//span').text
        stock_change_percent = stock.find_element(By.XPATH, './/td[6]//span').text
        stock_change_amount = stock.find_element(By.XPATH, './/td[7]//span').text
        stock_volume = stock.find_element(By.XPATH, './/td[8]').text
        stock_turnover = stock.find_element(By.XPATH, './/td[9]').text
        stock_amplitude = stock.find_element(By.XPATH, './/td[10]').text
        stock_highest = stock.find_element(By.XPATH, './/td[11]//span').text
        stock_lowest = stock.find_element(By.XPATH, './/td[12]//span').text
        stock_open_price = stock.find_element(By.XPATH, './/td[13]//span').text
        stock_close_price = stock.find_element(By.XPATH, './/td[14]').text

        sql = f"INSERT INTO {table_name} (id, code, name, latest_price, change_percent, change_amount, volume, turnover, amplitude, highest, lowest, open_price, close_price) VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s)"
        cursor.execute(sql,
                       [stock_id, stock_code, stock_name, stock_latest_price, stock_change_percent, stock_change_amount,
                        stock_volume, stock_turnover, stock_amplitude, stock_highest, stock_lowest, stock_open_price,
                        stock_close_price])
    conn.commit()
    print("数据已存入数据库")

    # 点击下一页按钮
    next_page_button = driver.find_element(By.XPATH, '//*[@id="main-table_paginate"]/a[2]')
    action = ActionChains(driver)
    time.sleep(5)
    action.move_to_element(next_page_button).perform()
    next_page_button.click()

    time.sleep(5)

conn.close()
# 关闭浏览器
driver.quit()

图片:

1.2 作业心得

  • 加深了用 Selenium 控制浏览器自动抓取网页数据的技术栈
  • 深入了解了如何模拟点击“下一页”按钮抓取多页数据。

作业②

要求:

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

2.1 代码和图片

代码:

"""
实现思路:
    1.启动浏览器并访问网站
    2.登录相关
        点击页面上的登录按钮
        切换到登录框的 iframe 内部
        输入手机号和密码进行登录
    3.访问课程搜索页面
    4.创建数据库并建立表格
    5.获取课程信息并存储到数据库
"""
from selenium import webdriver
from selenium.webdriver.common.by import By
import sqlite3
import time
driver = webdriver.Chrome()
driver.get('https://www.icourse163.org/')
time.sleep(1)
button = driver.find_element(By.XPATH, '//*[@id="app"]/div/div/div[1]/div[3]/div[3]/div')
button.click()
time.sleep(1)
frame = driver.find_element(By.XPATH,"//div[@class='ux-login-set-container']//iframe")
driver.switch_to.frame(frame)
# 我这里的手机号和密码肯定不会放真实的,大家根据自己的实际来填写【学计算机多少会注重个人隐私】
account = driver.find_element(By.ID, 'phoneipt').send_keys('15306918501')
password = driver.find_element(By.XPATH, '//input[@placeholder="请输入密码"]').send_keys("123456")

button1 = driver.find_element(By.XPATH, '/html/body/div[2]/div[2]/div[2]/form/div/div[6]/a')
button1.click()
time.sleep(1)

url = 'https://www.icourse163.org/search.htm?search=%E5%A4%A7%E6%95%B0%E6%8D%AE#/'
driver.get(url)
conn = sqlite3.connect('课程信息.db')
cursor = conn.cursor()
cursor.execute('''
    create table course(
        id INTEGER,课程名称 text, 学校名称 text,老师 text,教师团队 text,参加人数 text, 课程进度 text, 课程简介 text
    )
''')
count = 0
link_list = driver.find_elements(By.XPATH, '//div[@class="u-clist f-bgw f-cb f-pr j-href ga-click"]')
for link in link_list:
    count += 1
    course_name = link.find_element(By.XPATH, './/span[@class=" u-course-name f-thide"]').text
    school_name = link.find_element(By.XPATH, './/a[@class="t21 f-fc9"]').text
    teacher = link.find_element(By.XPATH, './/a[@class="f-fc9"]').text
    try:
        team_member = link.find_element(By.XPATH, './/span[@class="f-fc9"]/span').text
        team_member = team_member + ' 、' + teacher
    except Exception as err:
        team_member = 'none'
    attendees = link.find_element(By.XPATH, './/span[@class="hot"]').text
    attendees.replace('参加', '')
    process = link.find_element(By.XPATH, './/span[@class="txt"]').text
    introduction = link.find_element(By.XPATH, './/span[@class="p5 brief f-ib f-f0 f-cb"]').text
    cursor.execute('''
                        insert into course(
                    id ,课程名称 , 学校名称 ,老师 ,教师团队 ,参加人数 , 课程进度 , 课程简介
                    )
                    VALUES(?,?,?, ?, ?, ?, ?, ?)
                    ''', (count, course_name, school_name, teacher, team_member, attendees, process, introduction
                          ))
    conn.commit()
cursor.close()
conn.close()

图片:

2.2 作业心得

  • 使用自动化爬虫显著提高了数据采集的效率。与人工操作相比,它能够在极短的时间内完成大量数据的抓取,极大地节省了时间和人力成本。
  • 应对网站的反爬机制需要在爬虫设计中增加适当的延时与随机性,这样的话更加逼真。

作业③:

要求:完成文档 华为云_大数据实时分析处理实验手册-Flume日志采集实验(部分)v2.docx 中的任务

3.1过程

1.Python脚本生成测试数据

image-20241114011721643

2.配置Kafka

3.安装Flume客户端

4.MySQL中准备结果表与维度表数据

5.使用DLI中的Flink作业进行数据分析

直接全产业链打通!!!

3.2 作业心得

  • 为我国之后实现信创国产化,使用国产设备打下了坚实的基础。

  • 深入理解了Kafka作为消息队列的配置和使用,学习了如何将数据从Flume传输到Kafka。

  • 安装并配置Flume客户端进行数据采集,学习了数据采集的基本流程和配置技巧。

  • 将数据从Kafka传输到MySQL数据库,完整体验了从数据源到消息传输,再到数据存储的实时数据处理流程。

posted @ 2024-11-14 01:43  清风拂山岗(小高同学)  阅读(12)  评论(0编辑  收藏  举报