数据采集实验四

news/2024/11/13 21:58:12/文章来源:https://www.cnblogs.com/yixiao114514/p/18542113

作业一

(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 = 0while cnt < page_num:spiderOnePage()driver.find_element(By.XPATH,'//a[@class="next paginate_button"]').click()cnt +=1time.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].textid = tds[1].textname = tds[2].textLatest_quotation = tds[6].textChg = tds[7].textup_down_amount = tds[8].textturnover = tds[9].texttransaction_volume = tds[10].textamplitude = tds[11].texthighest = tds[12].textlowest = tds[13].texttoday = tds[14].textyesterday = tds[15].textcursor.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 网课程资源信息(课程号、课程名称、学校名称、主讲教师、团队成员、参加人数、课程进度、课程简介)
  • 候选网站
    • 中国 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_handlefor 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'))).textcBrief = driver.find_element(By.XPATH,'//*[@id="j-rectxt2"]').textif 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:breakcount += 1next_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:passtime.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 个任务,具体操作见文档。





















本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/832334.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【题解】洛谷P8346:最澄澈的空与海

题解:二分图性质。【题解】洛谷P8346:最澄澈的空与海 猜结论题,本身其实很简单,在纸上画个差不多就能想出来,我一开始想二分图最大匹配,但是还是太大了,不可以。 当一个二分图有且仅有一种解时,必定有节点的入度为 \(1\)。 我们想到有多种匹配的情况,可以想到如果这是…

过路车辆识别智慧矿山一体机罐笼乘坐人员超限识别煤矿安全监控系统升级改造技术方案

在当今煤炭行业的发展中,安全和效率是两个核心议题。随着技术的进步,智慧矿山的概念应运而生,它代表着煤炭行业向智能化、自动化的转型。智慧矿山一体机煤矿安全监控系统的升级改造技术方案,正是在这样的行业需求背景下提出的。这一方案旨在通过集成先进的信息技术,如物联…

birdwatcher安装使用

1.官网下载二进制版本的安装包,解压到相应目录即可运行https://github.com/milvus-io/birdwatcher 2.尝试使用birdwatcher链接注意单机部署的milvus默认是没有暴露etcd端口的,需要修改配置重新部署[root@localhost birdwatcher]# ./birdwatcherOffline > connect --etcd 1…

这款工具让开发变得没门槛了

在快速变化的软件开发领域,工具的选择往往能决定开发效率的高低。今天,我要介绍的是一款能够让你告别繁琐编程步骤,实现需求到代码快速转换的在线开发工具——TitanIDE。它凭借一键生成代码和一键解释代码的功能,为开发者们带来了前所未有的便捷体验。 一、前言 在传统的开…

Linux各种作死故障与修复方法,全面复盘全程高能,系统级故障救援经验汇总

来自:https://www.cnblogs.com/liulianzhen99/p/17543477.html原文连接:https://mp.weixin.qq.com/s/l_D3-jm4JWPIz3DecrRUyw1 linux启动过程启动过程分析 启动级别init 0,init3, init5 init6。 systemd 服务管理。 systemd 导致系统反复重启:2 磁盘与分区配置文件磁盘UUID…

强化学习的数学原理-09策略梯度

目录Basic idea of policy gradientMetrics to define optimal policiesaverage valueaverage rewardGradient of the metricsGradient-ascent algorithm(REINFORCE) Basic idea of policy gradient 截至目前,所有的策略policy都是用表格表示的,如下图所示,每个状态对应一行…

1. 初始认识 Spring Cloud

1. 初始认识 Spring Cloud @目录1. 初始认识 Spring Cloud前言2. Spring Cloud 基本介绍3. 系统架构的演变过程3.1 单机架构3.2 动静分离架构:静态缓存 + 文件存储3.3 分布式架构:业务拆分 + 负载均衡3.4 微服务架构:使用 Spring Cloud4. Spring Cloud 全面说明4.1 Spring C…

请问有哪些好用的项目管理工具?做个项目经理需要哪些能力?

常用的项目管理工具: 项目管理工具种类繁多,适用于不同规模和类型的项目。以下是一些常见且功能强大的项目管理工具: 1. Trello特点:看板式任务管理工具,简单易用,适合小型项目或团队。任务通过卡片和列表进行管理,可以灵活拖动和更新进度。 适用场景:适合小团队、创业…

大家做项目管理时都用的什么工具?

在项目管理中,常用的工具涵盖了从任务分配、团队协作、资源管理、时间追踪到进度跟踪等各个方面。下面我将介绍一些项目经理和团队常用的工具,按功能类别进行分类: 1. 任务管理和项目进度跟踪 这些工具帮助团队规划任务、设置优先级,并跟踪任务进度。Trello:基于看板的工具…

IDEA -去除 mapper.xml 中的 SQL 语句黄色下划线

问题描述 当我们使用idea开发java项目时,经常会与数据库打交道,一般在使用mybatis的时候需要写一大堆的mapper.xml以及SQL语句,每当写完SQL语句的时候总是有黄色下划线,看着很不舒服。 解决方案: setting---Editor----Inspections-----SQL 打开后找到图中的两个配置项,去…