首页 > 其他分享 >数据采集第四次实验

数据采集第四次实验

时间:2024-11-20 15:20:44浏览次数:1  
标签:XPATH text driver element 采集 实验 td find 第四次

作业1

要求: 熟练掌握 Selenium 查找 HTML 元素、爬取 Ajax 网页数据、等待 HTML 元素等内容。
使用 Selenium 框架+ MySQL 数据库存储技术路线爬取“沪深 A 股”、 “上证 A 股”、“深证 A 股”3 个板块的股票数据信息。
候选网站: 东方财富网:http://quote.eastmoney.com/center/gridlist.html#hs_a_board
输出信息: MYSQL 数据库存储和输出格式如下,表头应是英文命名例如:序号
id,股票代码: bStockNo……,由同学们自行定义设计表头:
–务必控制总下载的图片数量(学号尾数后2位)限制爬取的措施。

Gitee链接:https://gitee.com/wang-zicong-OVO/s1ened/tree/master/数据采集作业四/1

点击查看代码
import sqlite3
import time

from selenium import webdriver
from selenium.webdriver.common.by import By

# 创建数据库连接
conn = sqlite3.connect('stock_data.db')  # 'stock_data.db' 是数据库文件名
cursor = conn.cursor()
# 创建表
cursor.execute('''
CREATE TABLE IF NOT EXISTS stocks (
    id TEXT,
    stock_code TEXT,
    stock_name TEXT,
    latest_price TEXT,
    change_percent TEXT,
    change_amount TEXT,
    volume TEXT,
    turnover TEXT,
    amplitude TEXT,
    highest TEXT,
    lowest TEXT,
    open_price TEXT,
    last_close TEXT
)
''')

# 初始化Selenium WebDriver
driver = webdriver.Edge()
driver.get("https://quote.eastmoney.com/center/gridlist.html#hs_a_board")
time.sleep(2)

# 获取数据
ts = driver.find_elements(By.XPATH, "//tbody//tr")
for t in ts:
    id = t.find_element(By.XPATH, ".//td[1]").text
    stock_code = t.find_element(By.XPATH, ".//td[2]").text
    stock_name = t.find_element(By.XPATH, ".//td[3]").text
    latest_price = t.find_element(By.XPATH, ".//td[5]").text
    change_percent = t.find_element(By.XPATH, ".//td[6]").text
    change_amount = t.find_element(By.XPATH, ".//td[7]").text
    volume = t.find_element(By.XPATH, ".//td[8]").text
    turnover = t.find_element(By.XPATH, ".//td[9]").text
    amplitude = t.find_element(By.XPATH, ".//td[10]").text
    highest = t.find_element(By.XPATH, ".//td[11]").text
    lowest = t.find_element(By.XPATH, ".//td[12]").text
    open_price = t.find_element(By.XPATH, ".//td[13]").text
    last_close = t.find_element(By.XPATH, ".//td[14]").text


    cursor.execute('''
    INSERT INTO stocks (id, stock_code, stock_name, latest_price, change_percent, change_amount, volume, turnover, amplitude, highest, lowest, open_price, last_close)
    VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
    ''', (id, stock_code, stock_name, latest_price, change_percent, change_amount, volume, turnover, amplitude, highest, lowest, open_price, last_close))
button1 = driver.find_element(By.XPATH,'//*[@id="nav_sh_a_board"]/a')
button1.click()
time.sleep(2)


ts = driver.find_elements(By.XPATH, "//tbody//tr")
for t in ts:
    id = t.find_element(By.XPATH, ".//td[1]").text
    stock_code = t.find_element(By.XPATH, ".//td[2]").text
    stock_name = t.find_element(By.XPATH, ".//td[3]").text
    latest_price = t.find_element(By.XPATH, ".//td[5]").text
    change_percent = t.find_element(By.XPATH, ".//td[6]").text
    change_amount = t.find_element(By.XPATH, ".//td[7]").text
    volume = t.find_element(By.XPATH, ".//td[8]").text
    turnover = t.find_element(By.XPATH, ".//td[9]").text
    amplitude = t.find_element(By.XPATH, ".//td[10]").text
    highest = t.find_element(By.XPATH, ".//td[11]").text
    lowest = t.find_element(By.XPATH, ".//td[12]").text
    open_price = t.find_element(By.XPATH, ".//td[13]").text
    last_close = t.find_element(By.XPATH, ".//td[14]").text


    cursor.execute('''
    INSERT INTO stocks (id, stock_code, stock_name, latest_price, change_percent, change_amount, volume, turnover, amplitude, highest, lowest, open_price, last_close)
    VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
    ''', (id, stock_code, stock_name, latest_price, change_percent, change_amount, volume, turnover, amplitude, highest, lowest, open_price, last_close))

button1 = driver.find_element(By.XPATH,'//*[@id="nav_sz_a_board"]/a')
button1.click()
time.sleep(2)


ts = driver.find_elements(By.XPATH, "//tbody//tr")
for t in ts:
    id = t.find_element(By.XPATH, ".//td[1]").text
    stock_code = t.find_element(By.XPATH, ".//td[2]").text
    stock_name = t.find_element(By.XPATH, ".//td[3]").text
    latest_price = t.find_element(By.XPATH, ".//td[5]").text
    change_percent = t.find_element(By.XPATH, ".//td[6]").text
    change_amount = t.find_element(By.XPATH, ".//td[7]").text
    volume = t.find_element(By.XPATH, ".//td[8]").text
    turnover = t.find_element(By.XPATH, ".//td[9]").text
    amplitude = t.find_element(By.XPATH, ".//td[10]").text
    highest = t.find_element(By.XPATH, ".//td[11]").text
    lowest = t.find_element(By.XPATH, ".//td[12]").text
    open_price = t.find_element(By.XPATH, ".//td[13]").text
    last_close = t.find_element(By.XPATH, ".//td[14]").text


    cursor.execute('''
    INSERT INTO stocks (id, stock_code, stock_name, latest_price, change_percent, change_amount, volume, turnover, amplitude, highest, lowest, open_price, last_close)
    VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
    ''', (id, stock_code, stock_name, latest_price, change_percent, change_amount, volume, turnover, amplitude, highest, lowest, open_price, last_close))

# 提交事务
conn.commit()

# 关闭数据库连接
cursor.close()
conn.close()

# 关闭WebDriver
driver.quit()

结果:

实验心得:
通过本次作业,我深入掌握了 Selenium 相关操作,包括查找元素、处理 Ajax 数据和等待元素。设计 MySQL 表头让我明白数据存储结构的重要性。过程有挑战,如东方财富网页结构变化和数据存储问题,但提升了编程和处理数据能力,对类似任务有很大帮助。

作业2:

要求:
熟练掌握 Selenium 查找 HTML 元素、实现用户模拟登录、爬取 Ajax 网页数据、等待 HTML 元素等内容。
使用 Selenium 框架+MySQL 爬取中国 mooc 网课程资源信息(课程号、课程名称、学校名称、主讲教师、团队成员、参加人数、课程进度、课程简介)
候选网站:中国 mooc 网:https://www.icourse163.org
输出信息:MYSQL 数据库存储和输出格式
Gitee 文件夹链接:https://gitee.com/wang-zicong-OVO/s1ened/tree/master/数据采集作业四/2

点击查看代码
  def login(driver, username, password):
      try:
          driver.get("https://www.icourse163.org")
          time.sleep(2)
 
          # 点击登录按钮
          login_register_button = WebDriverWait(driver, 10).until(
              EC.element_to_be_clickable((By.CSS_SELECTOR, "div._3uWA6[role='button']"))
          )
          login_register_button.click()
 
          # 切换到登录 iframe
          iframe = WebDriverWait(driver, 10).until(
              EC.presence_of_element_located((By.CSS_SELECTOR, "iframe[src*='index_dl2_new.html']"))
          )
          driver.switch_to.frame(iframe)
 
          # 输入账号和密码
          phone_input = WebDriverWait(driver, 10).until(
              EC.presence_of_element_located((By.ID, "phoneipt"))
          )
          phone_input.send_keys(username)
 
          password_input = WebDriverWait(driver, 10).until(
              EC.presence_of_element_located((By.CLASS_NAME, "j-inputtext"))
          )
          password_input.send_keys(password)
 
          # 点击登录按钮
          login_button = WebDriverWait(driver, 10).until(
              EC.element_to_be_clickable((By.ID, "submitBtn"))
          )
          login_button.click()
 
          driver.switch_to.default_content()
          time.sleep(3)
      except Exception as e:
          print(f"Login failed: {e}")
          driver.quit()
          raise
        while total_scraped < course_limit:
            course_items = driver.find_elements(By.XPATH, '//div[contains(@class, "_2mbYw") and contains(@class, "commonCourseCardItem")]')
            for course_item in course_items:
                if total_scraped >= course_limit:
                    break
 
                try:
                    # 滚动页面确保课程可见
                    driver.execute_script("arguments[0].scrollIntoView();", course_item)
                    time.sleep(1)
                    course_item.click()
                    time.sleep(2)
                    driver.switch_to.window(driver.window_handles[-1])
 
                    # 获取课程详情
                    cCourse = driver.find_element(By.XPATH, '//span[@class="course-title f-ib f-vam"]').text
                    cCollege = driver.find_element(By.XPATH, "//img[@class='u-img']").get_attribute("alt")
                    cTeacher = driver.find_element(By.XPATH, '//div[@class="cnt f-fl"]//h3[@class="f-fc3"]').text
                    cTeam = cTeacher
                    cCount = driver.find_element(By.XPATH, '//span[@class="count"]').text
                    cProcess = driver.find_element(By.XPATH, "//div[@class='course-enroll-info_course-info_term-info_term-time']").text
                    cBrief = driver.find_element(By.XPATH, "//div[@class='course-heading-intro_intro']").text
 
# 翻页处理
if total_scraped < course_limit:
    try:
        next_page_button = WebDriverWait(driver, 10).until(
            EC.element_to_be_clickable((By.XPATH, '//a[@class="_3YiUU " and text()="下一页"]'))
        )
        next_page_button.click()
        time.sleep(3)
    except Exception as e:
        print("No more pages to scrape.")
        break
# 数据清洗
participants = int(re.sub(r'\D', '', cCount))  # 提取数字参与人数
course_time = re.sub(r'开课时间:', '', cProcess)  # 清理课程时间的无关文字
# 插入数据库
if insert_values:
    insert_query = """
    INSERT INTO course_data (cCourse, cCollege, cTeacher, cTeam, cCount, cProcess, cBrief)
    VALUES (%s, %s, %s, %s, %s, %s, %s)
    """
    cursor.executemany(insert_query, insert_values)
    db_connection.commit()

运行结果:

实验心得:
此次作业让我对 Selenium 有了新认识,模拟登录很关键。爬取 mooc 网课程信息使我在数据提取和存储上有了更多实践经验,也提高了应对复杂网页结构的能力,有助于今后的爬虫工作。

作业3:

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

任务一:任务一:开通 MapReduce 服务

实时分析开发实战

任务一:

Python 脚本生成测试数据

任务二:

配置 Kafka



任务三:

安装 Flume 客户端






心得体会:
经过对Flume日志采集实验手册的深入学习,我对Flume的核心理念和日志采集服务的操作流程有了更加深刻的理解。这不仅包括了数据流的配置和传输优化,还涉及到了华为云实验中大数据服务和实时数据处理的实际应用。通过这些实验,我不仅熟悉了Xshell工具的使用,还掌握了远程环境管理的技巧。

在实践过程中,我按照文档的指导,逐步完成了从环境搭建到数据采集和实时处理的各项任务。这让我全面掌握了大数据服务与工具的操作流程,并在技术技能和操作能力上得到了显著提升。同时,我对大数据生态系统有了更为清晰的认识,特别是从数据采集到实时处理的整个流程。

通过本次学习,我不仅增强了对Flume的使用能力,而且在实时数据处理和工具应用方面也有所精进。这不仅拓宽了我在大数据技术领域的知识视野,也为我未来的实践工作打下了坚实的基础。

标签:XPATH,text,driver,element,采集,实验,td,find,第四次
From: https://www.cnblogs.com/s1ened/p/18552913

相关文章

  • 第二次网络渗透测试课程实验--使用Ping指令测试网络连通性
    首先,我们需要知道目的计算机的ip,才能执行ping指令。那么如何得到设备的ip呢?在本机,可以调出控制台面板,然后输入ipconfig指令,即可获得本机的ip地址、默认网关、子网掩码等信息。在虚拟机中,打开控制台面板,然后输入ifconfig指令即可得到虚拟机的ip、MAC地址等信息。得到目的设备......
  • C# 开发的数据采集及云端监控系统
    前言推荐C#语言开发的堤坝渗透地质数据采集及云端监控系统。希望本文能够为大家提供有价值的信息和参考。项目介绍使用数十个.NET客户端控制硬件设备进行工作,采集数据并进行处理。管理人员通过Android应用实时控制各设备的工作。该作品在第十二届中国研究生电子设计竞赛......
  • 实验4 类的组合、继承、模板类、标准库
     实验任务21#include<iostream>2#include<vector>3#include<string>4#include<algorithm>5#include<numeric>6#include<iomanip>78usingstd::vector;9usingstd::string;10usingstd::cin;......
  • 武汉理工大学数据库系统综合实验(2024)【实验一 数据库定义与操作】
    ......
  • RAG中late chunking的实验效果测试
    代码:importosimportjsonimporttorchimportnumpyasnpimportspacyfromspacy.tokensimportDocfromspacy.languageimportLanguageimporttransformersfromtransformersimportAutoModelfromtransformersimportAutoTokenizerdefsentence_chunker......
  • 实验室管理平台:Spring Boot技术实现
    摘要随着信息技术在管理上越来越深入而广泛的应用,管理信息系统的实施在技术上已逐步成熟。本文介绍了实验室管理系统的开发全过程。通过分析实验室管理系统管理的不足,创建了一个计算机管理实验室管理系统的方案。文章介绍了实验室管理系统的系统分析部分,包括可行性分析等,系......
  • 实验室管理技术:Spring Boot技术优化
    摘要随着信息技术在管理上越来越深入而广泛的应用,管理信息系统的实施在技术上已逐步成熟。本文介绍了实验室管理系统的开发全过程。通过分析实验室管理系统管理的不足,创建了一个计算机管理实验室管理系统的方案。文章介绍了实验室管理系统的系统分析部分,包括可行性分析等,系......
  • 上机实验三:C4.5(带有预剪枝和后剪枝)算法实现与测试
    fromsklearn.datasetsimportload_irisfromsklearn.model_selectionimporttrain_test_split,cross_val_score,StratifiedKFoldfromsklearn.treeimportDecisionTreeClassifierfromsklearn.metricsimportaccuracy_score,precision_score,recall_score,f1_score#......
  • 希冀 操作系统 实验lab1 内核、Boot和printf(保姆级教程 建议点赞收藏 未完成)
    这次我把所有代码都写出来方便大家复制(可以直接复制我的代码粘贴到终端执行)开始之前首先先拉取lab1的内容(一定先干这个,不然做不了实验!!!!!!!!!!!!!!!!)先切换到这个目录下cd20221105894-lab变为:输入gitpullgitcheckoutorigin/lab1 之后刷新一下你的学号-lab文件夹,如果改变了就好......
  • 实验15:职责链模式
    [实验任务一]:财务审批某物资管理系统中物资采购需要分级审批,主任可以审批1万元及以下的采购单,部门经理可以审批5万元及以下的采购单,副总经理可以审批10万元及以下的采购单,总经理可以审批20万元及以下的采购单,20万元以上的采购单需要开职工大会确定。现用职责链模式设计该系统。......