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

数据采集实验四

时间:2024-11-12 16:20:24浏览次数:1  
标签:XPATH text driver element 采集 实验 div 数据 find

作业一

(1)实验内容

  • 要求
    • 熟练掌握 Selenium 查找 HTML 元素、爬取 Ajax 网页数据、等待 HTML 元素等内容。
    • 使用 Selenium 框架+ MySQL 数据库存储技术路线爬取“沪深 A 股”、“上证 A 股”、“深证 A 股”3 个板块的股票数据信息。
  • 候选网站
  • 输出信息
    • MYSQL 数据库存储和输出格式如下,表头应是英文命名例如:序号id,股票代码:bStockNo……,由同学们自行定义设计表头
      img

gitee仓库链接:作业4

完整代码如下

highlighter- apache

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver import ChromeService
from selenium.webdriver import ChromeOptions
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import time
import pymysql
chrome_options = ChromeOptions()
chrome_options.add_argument('--disable-gpu')
chrome_options.binary_location = r'C:\Program Files\Google\Chrome\Application\chrome.exe'
chrome_options.add_argument('--disable-blink-features=AutomationControlled')
service = ChromeService(executable_path='E:/FZU/sjcj/10.21/chromedriver.exe')
driver = webdriver.Chrome(service=service,options=chrome_options)
driver.maximize_window()

# 连接scrapy数据库,创建表
try:
    db = pymysql.connect(host='127.0.0.1',user='root',password='040417',port=3306,database='scrapy')
    cursor = db.cursor()
    cursor.execute('DROP TABLE IF EXISTS stockT')
    sql = '''CREATE TABLE stockT(num varchar(32),id varchar(12),name varchar(32),Latest_quotation varchar(32),Chg varchar(12),up_down_amount varchar(12),
            turnover varchar(16),transaction_volume varchar(16),amplitude varchar(16),highest varchar(32), lowest varchar(32),today varchar(32),yesterday varchar(32))'''
    cursor.execute(sql)
except Exception as e:
    print(e)

def spider(page_num):
    cnt = 0
    while cnt < page_num:
        spiderOnePage()
        driver.find_element(By.XPATH,'//a[@class="next paginate_button"]').click()
        cnt +=1
    time.sleep(2)

# 爬取一个页面的数据
def spiderOnePage():
    time.sleep(3)
    trs = driver.find_elements(By.XPATH,'//table[@id="table_wrapper-table"]//tr[@class]')
    for tr in trs:
        tds = tr.find_elements(By.XPATH,'.//td')
        num = tds[0].text
        id = tds[1].text
        name = tds[2].text
        Latest_quotation = tds[6].text
        Chg = tds[7].text
        up_down_amount = tds[8].text
        turnover = tds[9].text
        transaction_volume = tds[10].text
        amplitude = tds[11].text
        highest = tds[12].text
        lowest = tds[13].text
        today = tds[14].text
        yesterday = tds[15].text
        cursor.execute('INSERT INTO stockT VALUES ("%s","%s","%s","%s","%s","%s","%s","%s","%s","%s","%s","%s","%s")' % (num,id,name,Latest_quotation,
                                                Chg,up_down_amount,turnover,transaction_volume,amplitude,highest,lowest,today,yesterday))
        db.commit()

# 访问东方财富网
driver.get('https://www.eastmoney.com/')
# 访问行情中心
driver.get(WebDriverWait(driver,15,0.48).until(EC.presence_of_element_located((By.XPATH,'/html/body/div[6]/div/div[2]/div[1]/div[1]/a'))).get_attribute('href'))
# 访问沪深京A股
driver.get(WebDriverWait(driver,15,0.48).until(EC.presence_of_element_located((By.ID,'menu_hs_a_board'))).get_attribute('href'))
# 爬取两页的数据
spider(2)
driver.back()

# 访问上证A股
driver.get(WebDriverWait(driver,15,0.48).until(EC.presence_of_element_located((By.ID,'menu_sh_a_board'))).get_attribute('href'))
spider(2)
driver.back()

# 访问深证A股
driver.get(WebDriverWait(driver,15,0.48).until(EC.presence_of_element_located((By.ID,'menu_sz_a_board'))).get_attribute('href'))
spider(2)

try:
    cursor.close()
    db.close()
except:
    pass
time.sleep(3)
driver.quit()

navicat查看结果

(2)心得体会

  • 使用selenium库可以爬取动态加载的数据,编写xpath表达式时要注意相对路径的使用,最开始没注意,刚好表又定义了主键,将数据插入表格时就报了主键重复的错误

  • 不同字段本来想定义不同的数据类型,比如double,但是后来发现爬取下来的数据格式不一定统一,比如成交量这列数据,有的数据带了单位万,有的又没带,最终决定统一将字段数据类型定义为字符串,如果想定义不同数据类型,需对爬取下来的数据进一步处理

  • 由于要爬取的数据是动态加载的,所以需要强制等待一段时间,等待数据加载完成,才能开始爬取,否则会出现找不到标签的情况,最开始尝试使用WebDriverWait类进行等待,貌似行不通,最后改成使用sleep()函数进行等待

    highlighter- reasonml

    # 爬取一个页面的数据
    def spiderOnePage():
        time.sleep(3)
        trs = driver.find_elements(By.XPATH,'//table[@id="table_wrapper-table"]//tr[@class]')
    

作业二

(1)实验内容

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

gitee仓库链接:作业4

完整代码如下

highlighter- python

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver import ChromeService
from selenium.webdriver import ChromeOptions
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import time
import pymysql
chrome_options = ChromeOptions()
chrome_options.add_argument('--disable-gpu')
chrome_options.binary_location = r'C:\Program Files\Google\Chrome\Application\chrome.exe'
chrome_options.add_argument('--disable-blink-features=AutomationControlled')
# chrome_options.add_argument('--headless')  # 无头模式
service = ChromeService(executable_path='E:/FZU/sjcj/10.21/chromedriver.exe')
driver = webdriver.Chrome(service=service,options=chrome_options)
driver.maximize_window()  # 使浏览器窗口最大化
# 连接MySql
try:
    db = pymysql.connect(host='127.0.0.1',user='root',password='040417',port=3306,database='scrapy')
    cursor = db.cursor()
    cursor.execute('DROP TABLE IF EXISTS courseMessage')
    sql = '''CREATE TABLE courseMessage(cCourse varchar(64),cCollege varchar(64),cTeacher varchar(16),cTeam varchar(256),cCount varchar(16),
    cProcess varchar(32),cBrief varchar(2048))'''
    cursor.execute(sql)
except Exception as e:
    print(e)

# 爬取一个页面的数据
def spiderOnePage():
    time.sleep(5)  # 等待页面加载完成
    courses = driver.find_elements(By.XPATH,'//*[@id="channel-course-list"]/div/div/div[2]/div[1]/div')
    current_window_handle = driver.current_window_handle
    for course in courses:
        cCourse  = course.find_element(By.XPATH,'.//h3').text  # 课程名
        cCollege = course.find_element(By.XPATH,'.//p[@class="_2lZi3"]').text  # 大学名称
        cTeacher = course.find_element(By.XPATH,'.//div[@class="_1Zkj9"]').text  # 主讲老师
        cCount = course.find_element(By.XPATH,'.//div[@class="jvxcQ"]/span').text  # 参与该课程的人数
        cProcess = course.find_element(By.XPATH,'.//div[@class="jvxcQ"]/div').text  # 课程进展

        course.click()  # 点击进入课程详情页,在新标签页中打开
        Handles = driver.window_handles  # 获取当前浏览器的所有页面的句柄
        driver.switch_to.window(Handles[1])  # 跳转到新标签页
        time.sleep(5)  # 等待页面加载完成

        # 爬取课程详情数据
        # cBrief = WebDriverWait(driver,10,0.48).until(EC.presence_of_element_located((By.ID,'j-rectxt2'))).text
        cBrief = driver.find_element(By.XPATH,'//*[@id="j-rectxt2"]').text
        if len(cBrief) == 0:
            cBriefs = driver.find_elements(By.XPATH,'//*[@id="content-section"]/div[4]/div//*')
            cBrief=""
            for c in cBriefs:
                cBrief += c.text
        
        # 将文本中的引号进行转义处理,防止插入表格时报错
        cBrief = cBrief.replace('"',r'\"').replace("'",r"\'")
        cBrief = cBrief.strip()

        # 爬取老师团队信息
        nameList = []
        cTeachers = driver.find_elements(By.XPATH,'//div[@class="um-list-slider_con_item"]')
        for Teacher in cTeachers:
            name = Teacher.find_element(By.XPATH,'.//h3[@class="f-fc3"]').text.strip()
            nameList.append(name)
        # 如果有下一页的标签,就点击它,然后继续爬取
        nextButton = driver.find_elements(By.XPATH,'//div[@class="um-list-slider_next f-pa"]')
        while len(nextButton) != 0:
            nextButton[0].click()
            time.sleep(3)
            cTeachers = driver.find_elements(By.XPATH,'//div[@class="um-list-slider_con_item"]')
            for Teacher in cTeachers:
                name = Teacher.find_element(By.XPATH,'.//h3[@class="f-fc3"]').text.strip()
                nameList.append(name)
            nextButton = driver.find_elements(By.XPATH,'//div[@class="um-list-slider_next f-pa"]')
        cTeam = ','.join(nameList)

        driver.close()  # 关闭新标签页
        driver.switch_to.window(current_window_handle)  # 跳转回原始页面
        try:
            cursor.execute('INSERT INTO courseMessage VALUES ("%s","%s","%s","%s","%s","%s","%s")' % (cCourse,cCollege,cTeacher,cTeam,cCount,cProcess,cBrief))
            db.commit()
        except Exception as e:
            print(e)

# 访问中国大学慕课
driver.get('https://www.icourse163.org/')

# 点击登录按钮
# WebDriverWait(driver,10,0.48).until(EC.presence_of_element_located((By.XPATH,'//a[@class="f-f0 navLoginBtn"]'))).click()
# iframe = WebDriverWait(driver,10,0.48).until(EC.presence_of_element_located((By.XPATH,'//*[@frameborder="0"]')))
# 转到登录界面的iframe
# driver.switch_to.frame(iframe)
# 输入账号密码并点击登录按钮
# driver.find_element(By.XPATH,'//*[@id="phoneipt"]').send_keys("17850751681")
# time.sleep(2)
# driver.find_element(By.XPATH,'//*[@class="j-inputtext dlemail"]').send_keys("yx040417@")
# time.sleep(2)
# driver.find_element(By.ID,'submitBtn').click()


# 访问国家精品课程
driver.get(WebDriverWait(driver,15,0.48).until(EC.presence_of_element_located((By.XPATH,'//*[@id="app"]/div/div/div[1]/div[1]/div[1]/span[1]/a'))).get_attribute('href'))
spiderOnePage()  # 爬取第一页的内容

count = 1
'''翻页操作'''
# 下一页的按钮

next_page = driver.find_element(By.XPATH,'//*[@id="channel-course-list"]/div/div/div[2]/div[2]/div/a[10]')
# 如果还有下一页,那么该标签的class属性为_3YiUU 
while next_page.get_attribute('class') == '_3YiUU ':
    if count == 5:
        break
    count += 1
    next_page.click()  # 点击按钮实现翻页
    spiderOnePage()  # 爬取一页的内容
    next_page = driver.find_element(By.XPATH,'//*[@id="channel-course-list"]/div/div/div[2]/div[2]/div/a[10]')

try:
    cursor.close()
    db.close()
except:
    pass

time.sleep(3)
driver.quit()

navicat查看结果

(2)心得体会

  • 模拟登录时,输入框以及登录按钮的标签都位于iframe标签中,需要使用switch_to.frame()函数将查找区域变更为对应iframe,才能找到输入框以及登录按钮。每个iframe一般都有唯一的ID属性,但是该网站的ID属性值是动态生成的,每次加载的ID都不一样,最终选择根据frameborder属性值来定位该iframe。在尝试过程中发现,多次模拟登录后,再次登录会跳出滑块验证。

  • 但是!!!每次登录后的弹窗影响爬虫爬取XPath,一开始尝试写一个程序点击同意以解决该问题,可惜没有成功,一怒之下索性不登陆爬取,发现可以进行。

  • 我选择点击进入国家精品,爬取该网页下的课程。该页面下只包含部分数据,课程介绍,教师团队等信息还需要进入具体的课程网页进行爬取,由于没有在标签中找到具体课程页面的url,于是采用点击的方式进入,且点击之后,是在新标签页中打开该网页,这就需要进行标签页的切换,使用switch_to.window()函数可以实现标签页的切换,使用close()函数可以关闭标签页

  • 爬取教师团队信息时,当团队人数较多时,该网页并没有将所有老师一次性列出,需要进行局部翻页处理。与国家精品课程页面的翻页操作不同,当没有下一页时,下一页这个标签直接消失,而不是class属性值发生变化。可以改用find_elements查找该标签,如果没找到,只是返回空列表,并不会像find_element一样产生异常。

作业三

(1)实验内容

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





















标签:XPATH,text,driver,element,采集,实验,div,数据,find
From: https://www.cnblogs.com/yixiao114514/p/18542113

相关文章

  • Python那些事儿 - 注释与数据类型
    第二回初出茅庐前言Python的横空出世,很快吸引了大批的追捧者,大家都加入了对它的了解学习和使用当中。有人编制教学书籍,有人开培训课堂,如今市面上的书籍和培训机构数不胜数。但是对于学习者来说,大家学习Python的开始都是一样的,那就是:#1、代码区输入print('hello,world')#......
  • YOLOV8应用|排球垫球计数|附带全部数据集与源码(见文末百度云盘链接)
    项目简介:该项目旨在利用YOLOv8算法实现排球垫球动作的自动识别与计数。YOLOv8作为计算机视觉领域的先进目标检测算法,具备高精度和实时性的特点,非常适合用于体育训练和测试中的自动化计数。项目将排球垫球视频作为输入,通过YOLOv8算法检测视频中的排球及垫球动作,自动记录垫球次......
  • linux下oracle数据库重起
    切换到Oracle用户,使用SQLPlus作为系统管理员关闭和启动数据库,查看和重启监听进程。使用lsnrctl工具管理监听,检查状态。1、切换到oracle用户,进入sql命令窗口su-oraclesqlplus/assysdba2、关闭数据库shutdownimmediate;关掉exit退出3、查看......
  • 基于yolov8、yolov5的番茄成熟度检测识别系统(含UI界面、训练好的模型、Python代码、数
    摘要:番茄成熟度检测在农业生产及质量控制中起着至关重要的作用,不仅能帮助农民及时采摘成熟的番茄,还为自动化农业监测提供了可靠的数据支撑。本文介绍了一款基于YOLOv8、YOLOv5等深度学习框架的番茄成熟度检测模型,该模型使用了大量图片进行训练,能够准确识别不同成熟度阶段的......
  • MIT 操作系统实验问题记录
    Linux连接vscodeRemote-SSH设置:在实验环境搭建时只用官网提供的是不够的还需要安装在gitpush到远程仓库的过程中由于clone时用的是url=git://g.csail.mit.edu/xv6-labs-2020这个所以得创建一个新的分支来向远程仓库pushgitremoteaddgiteehttps://gitee.com/zhang......
  • 深入理解数据归一化:原理、方法和应用
    目录引言1.为什么要进行数据归一化?2.常用的归一化方法(1)最小-最大归一化(Min-MaxNormalization)(2)标准化(Standardization)(3)均值归一化(MeanNormalization)(4)缩放到单位范数(ScalingtoUnitNorm)3.归一化的应用场景  (1)深度学习中的数据归一化  (2......
  • 第四届计算建模、仿真与数据分析国际学术会议(CMSDA 2024)
    连续3届EI检索|ACM出版、EI检索稳且快第四届计算建模、仿真与数据分析国际学术会议(CMSDA2024)20244th InternationalConferenceonComputationalModeling,SimulationandDataAnalysis重要信息大会官网:www.icmsda.com【会议投稿、参会方式可详情了解】大会时间......
  • 数据要素市场概述(概念、运行机制、发展现状、发展趋势、存在问题、发展建议)
    摘要:我国数据资源总量日益扩大,数据采集存储渠道丰富,开放共享不断推进,数据交易流通规模不断扩大,数据要素应用场景不断拓宽,数据跨境流动探索有序开展。从发展的新动向和新趋势上看,《数据管理能力成熟度评估模型》(DCMM)贯标、数据空间建设、数据确权登记等加快探索,数据标记化技术、......
  • 使用NumPy、Pandas和Matplotlib进行数据处理和可视化
    前言在数据科学和数据分析领域,NumPy、Pandas和Matplotlib是最常用的数据处理和可视化库。NumPy提供了高效的数组操作功能,Pandas则在NumPy的基础上增加了丰富的数据处理工具,而Matplotlib则是最流行的Python绘图库之一。本文将详细介绍如何使用这三个库进行数据处理和可视化。......
  • Spring Boot编程训练系统:数据管理与存储
    摘要随着信息技术在管理上越来越深入而广泛的应用,管理信息系统的实施在技术上已逐步成熟。本文介绍了编程训练系统的开发全过程。通过分析编程训练系统管理的不足,创建了一个计算机管理编程训练系统的方案。文章介绍了编程训练系统的系统分析部分,包括可行性分析等,系统设计部......