2023数据采集与融合技术实践作业四
作业①:
- 要求:
熟练掌握 Selenium 查找HTML元素、爬取Ajax网页数据、等待HTML元素等内容。
使用Selenium框架+ MySQL数据库存储技术路线爬取“沪深A股”、“上证A股”、“深证A股”3个板块的股票数据信息。 - 候选网站:东方财富网:http://quote.eastmoney.com/center/gridlist.html#hs_a_board
- 输出信息:MYSQL数据库存储和输出格式如下,表头应是英文命名例如:序号id,股票代码:bStockNo……,由同学们自行定义设计表头:
- Gitee文件夹链接:Gitee链接
序号 | 股票代码 | 股票名称 | 最新报价 | 涨跌幅 | 涨跌额 | 成交量 | 成交额 | 振幅 | 最高 | 最低 | 今开 | 昨收 |
---|---|---|---|---|---|---|---|---|---|---|---|---|
1 | 688093 | N世华 | 28.47 | 62.22% | 10.92 | 26.13万 | 7.6亿 | 22.34 | 32.0 | 28.08 | 30.2 | 17.55 |
2...... |
(1)代码和图片
- 代码
import pymysql
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.by import By
import datetime
import time
class MySpider:
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/117.0.0.0 Safari/537.36"}
imagePath = "download"
def startUp(self, url,key):
# 初始化Chrome浏览器
chrome_options = Options()
chrome_options.add_argument('--headless') # 设置无头模式,不弹出浏览器窗口
chrome_options.add_argument('--disable-gpu')
self.driver = webdriver.Chrome(options=chrome_options)
self.driver.get(url)
# 初始化变量
self.bankuai = ["nav_hs_a_board", "nav_sh_a_board", "nav_sz_a_board"]
self.bankuai_id = 0 # 当前板块
# 初始化数据库
try:
self.con = pymysql.connect(host="127.0.0.1", port=3306, user="root", passwd="123456", db="shares",charset="utf8")
self.cursor = self.con.cursor(pymysql.cursors.DictCursor)
# 如果有表就删除
self.cursor.execute("drop table stocks2")
# 建立新的表
sql = "create table stocks2(序号 varchar(128),代码 varchar(128),名称 varchar(128),最新价格 varchar(128),涨跌额 varchar(128),涨跌幅 " \
"varchar(128),成交量 varchar(128),成交额 varchar(128),振幅 varchar(128)," \
"最高 varchar(128),最低 varchar(128),今开 varchar(128),昨收 varchar(128));"
self.cursor.execute(sql)
except Exception as err:
print(err)
# 关闭浏览器和数据库连接
def closeUp(self):
try:
self.con.commit()
self.con.close()
self.driver.close()
except Exception as err:
print(err)
# 数据库插入操作
def insertDB(self,number,code, name, latest_price, price_limit, price_range, turnover, volume_transaction,
amplitude, highest, lowest, today_open, yesterday_close):
try:
sql = "insert into stocks2(序号,代码,名称,最新价格,涨跌额,涨跌幅,成交量,成交额,振幅,最高,最低,今开,昨收)values(%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s)"
self.cursor.execute(sql,(number,code, name, latest_price, price_limit, price_range, turnover, volume_transaction,
amplitude, highest, lowest, today_open, yesterday_close))
except Exception as err:
print(err)
# 爬虫主程序
def processSpider(self):
try:
time.sleep(1)
print(self.driver.current_url)
trs = self.driver.find_elements(By.XPATH,"//table[@class='table_wrapper-table']/tbody/tr")
# 遍历表格行,提取数据并插入数据库
for tr in trs:
number = tr.find_elements(By.XPATH,"./td")[0].text
code = tr.find_elements(By.XPATH,"./td")[1].text
name = tr.find_elements(By.XPATH,"./td")[2].text
latest_price = tr.find_elements(By.XPATH,"./td")[4].text
price_limit = tr.find_elements(By.XPATH,"./td")[5].text
price_range = tr.find_elements(By.XPATH,"./td")[6].text
turnover = tr.find_elements(By.XPATH,"./td")[7].text
volume_transaction = tr.find_elements(By.XPATH,"./td")[8].text
amplitude = tr.find_elements(By.XPATH,"./td")[9].text
highest = tr.find_elements(By.XPATH,"./td")[10].text
lowest = tr.find_elements(By.XPATH,"./td")[11].text
today_open = tr.find_elements(By.XPATH,"./td")[12].text
yesterday_close = tr.find_elements(By.XPATH,"./td")[13].text
try:
self.insertDB(number,code, name, latest_price, price_limit, price_range, turnover, volume_transaction,
amplitude, highest, lowest, today_open, yesterday_close)
except Exception as err:
print(err)
print("插入失败")
# 切换到下一个板块
self.bankuai_id += 1
next = self.driver.find_element(By.XPATH,"//li[@id='"+self.bankuai[self.bankuai_id]+"']/a")
self.driver.execute_script("arguments[0].click();", next)
time.sleep(100) # 等待页面加载完成
self.processSpider()
except Exception as err:
print(err)
# 执行爬虫程序
def executeSpider(self, url, key):
starttime = datetime.datetime.now()
print("Spider starting......")
self.startUp(url, key)
print("Spider processing......")
self.processSpider()
print("Spider closing......")
self.closeUp()
# 输出程序结束信息和运行时间
print("Spider completed......")
endtime = datetime.datetime.now()
elapsed = (endtime - starttime).seconds
print("Total ", elapsed, " seconds elapsed")
# 主程序部分
url ="http://quote.eastmoney.com/center/gridlist.html#hs_a_board"
spider = MySpider()
while True:
print("1.爬取")
print("2.退出")
s = input("请选择(1,2):")
if s == "1":
spider.executeSpider(url,"key")
elif s == "2":
break
- 运行结果截图
- 终端里

- MySQL里,每个板块爬取20条信息

(2)心得体会
跟以前爬取相比,将数据保存到MySQL这都是一样的,只不过这次要爬取三个板块的股票,所以就涉及到切换板块,那这就需要点击操作,所以就使用selenium。通过开发者工具可以知道所有板块都是li标签下的a标签对象,而每个li标签都各自有自己的id,所以我们只需self.bankuai_id变量的初始值为0,代表第一个板块(沪深A股)。这样通过控制self.bankuai_id变量的值,配合查找HTML元素和模拟点击(执行click())方法等操作,就可以实现板块切换功能了。
总之,对selenium查找HTML元素更熟练了,找的更准确了,还有使用MySQL数据库连接数据库、建立表格、插入数据等操作也更加熟练。
作业②:
- 要求:
熟练掌握 Selenium 查找HTML元素、实现用户模拟登录、爬取Ajax网页数据、等待HTML元素等内容。
使用Selenium框架+MySQL爬取中国mooc网课程资源信息(课程号、课程名称、学校名称、主讲教师、团队成员、参加人数、课程进度、课程简介) - 候选网站:中国mooc网:https://www.icourse163.org
输出信息:MYSQL数据库存储和输出格式 - Gitee文件夹链接:Gitee链接
Id | cCourse | cCollege | cTeacher | cTeam | cCount | cProcess | cBrief |
---|---|---|---|---|---|---|---|
1 | Python数据分析与展示 | 北京理工大学 | 嵩天 | 嵩天 | 470 | 进行至第8周 | “我们正步入一个数据或许比软件更重要的新时代。——Tim O'Reilly” …… |
2..... |
(1)代码和图片
- 代码
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
import time
import pymysql
class MySpider:
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/117.0.0.0 Safari/537.36"
}
def __init__(self):
print("初始化爬虫中......")
chrome_options = Options()
# chrome_options.add_argument('--headless')
# chrome_options.add_argument('--disable-gpu')
self.driver = webdriver.Chrome(options=chrome_options)
self.page = 0
self.no = 0
try:
# 与数据库建立连接
self.con = pymysql.connect(
host="127.0.0.1",
port=3306,
user="root",
passwd="123456",
charset="utf8",
db="shares"
)
self.cursor = self.con.cursor()
try:
# 如果有表就删除
self.cursor.execute("DROP TABLE IF EXISTS mooc")
except:
pass
try:
# 建立数据表
sql = """CREATE TABLE mooc (
Id VARCHAR(8),
cCource VARCHAR(64),
cCollege VARCHAR(64),
cTeacher VARCHAR(64),
cTeam VARCHAR(64),
cCount VARCHAR(64),
cProcess VARCHAR(256),
cBrief VARCHAR(256)
) ENGINE=InnoDB DEFAULT CHARSET=utf8"""
self.cursor.execute(sql)
except:
pass
except Exception as err:
print(err)
print("初始化完成,准备进行登录")
def login(self, account, password, loginurl):
print("登录中...")
self.driver.get(loginurl)
time.sleep(1)
# 切换到手机号登录
phone_login_btn = self.driver.find_element(By.XPATH, "//ul[@class='ux-tabs-underline_hd']//li")
phone_login_btn.click()
# 切换到登录框iframe,重点中的重点
self.driver.switch_to.frame(self.driver.find_element(By.XPATH, "//div[@class='ux-login-set-container']/iframe"))
# 输入账号密码并登录
account_input = self.driver.find_element(By.XPATH, "//input[@class='dlemail j-nameforslide']")
password_input = self.driver.find_element(By.XPATH, "//input[@class='j-inputtext dlemail']")
login_button = self.driver.find_element(By.XPATH, "//a[@class='u-loginbtn btncolor tabfocus ']")
account_input.send_keys(account)
password_input.send_keys(password)
login_button.click()
print("登录成功")
def search(self, keyword, url):
print(f"正在搜索关键词 {keyword} ......")
self.driver.get(url)
time.sleep(1)
# 在搜索框输入关键词并搜索
search_input = self.driver.find_element(By.XPATH, ".//div[@class='u-baseinputui']/input[@type='text']")
search_input.send_keys(keyword)
search_input.send_keys(Keys.ENTER)
time.sleep(2)
print("搜索完成,准备开始爬取")
def processSpider(self, max_pages):
try:
# 统计当前爬取的页数
self.page += 1
print(f"爬取第 {self.page} 页")
# 获取当前页的所有课程数据
datalist = self.driver.find_elements(By.XPATH, "//div[@class='cnt f-pr']")
time.sleep(2)
for data in datalist:
try:
# 获取各项数据
cCource = data.find_element(By.XPATH, "./div[@class='t1 f-f0 f-cb first-row']").text
cCollege = data.find_element(By.XPATH, ".//a[@class='t21 f-fc9']").text
cTeacher = data.find_element(By.XPATH, ".//a[@class='f-fc9']").text
cTeam = data.find_element(By.XPATH, ".//a[@class='f-fc9']").text
cCount = data.find_element(By.XPATH, ".//span[@class='hot']").text
cProcess = data.find_element(By.XPATH, ".//span[@class='txt']").text
cBrief = data.find_element(By.XPATH, ".//span[@class='p5 brief f-ib f-f0 f-cb']").text
# 统计爬取的课程个数,用做序号数据项
self.no += 1
# 将数据插入到MySQL数据库中
self.cursor.execute(
"INSERT INTO mooc VALUES (%s,%s,%s,%s,%s,%s,%s,%s)",
(self.no, cCource, cCollege, cTeacher, cTeam, cCount, cProcess,cBrief)
)
self.con.commit()
# 简单记录爬取过程
print(cCource)
except:
pass
try:
# 若找到了“不可翻页”标记,则说明到了最后一页,程序结束
self.driver.find_element(By.XPATH,
"//li[@class='ux-pager_btn ux-pager_btn__next']/a[@class='th-bk-disable-gh']")
print("爬取结束")
except:
# 否则点击翻页按钮进入下一页,并递归调用processSpider()函数继续爬取
next_page = self.driver.find_element(By.XPATH,
"//li[@class='ux-pager_btn ux-pager_btn__next']/a[@class='th-bk-main-gh']")
next_page.click()
time.sleep(3)
if self.page < max_pages: # 如果当前页数小于等于最大页数,则继续爬取下一页
self.processSpider(max_pages)
except Exception as err:
print(err)
def run(self, url, login_url):
self.login_url = login_url
self.search_url = url
print("请输入账号:")
account = input()
print("请输入密码:")
password = input()
self.login(account, password, self.login_url)
print("请输入要搜索的关键词:")
keyword = input()
self.search(keyword, self.search_url)
self.processSpider(max_pages=9) # 最大页数为9
# 主程序入口
url = "https://www.icourse163.org"
login_url = "https://www.icourse163.org/member/login.htm#/webLoginIndex"
# 创建爬虫对象并运行
spider = MySpider()
spider.run(url, login_url)
- 运行结果截图
- 终端里(密码做了遮盖)

- MySQL里

(2)心得体会
学习到了使用selenium用户模拟登录,首先要确认登录页面是否已经切换到了正确的 iframe 中,根据提供的switch_to.frame() 方法进行切换,一定要切换到 iframe 元素的正确ID,刚开始不熟练,也不知道登录页面中 iframe 元素的 ID在哪,学习找了好久才找到正确,前面一直在提示找的不正确,这应该是没有切换到正确的iframe。在其中认识到了frame框架,先去浅浅学了一下frame。在浏览器中,通过使用iframe标签来定义一个Frame。所以找到iframe标签就能找到iframe的ID。

总之,学习到了使用Selenium模拟浏览器操作,包括打开网站、输入账号密码、点击按钮、输入关键词、翻页等,还有使用XPath语法定位网页元素和使用MySQL库连接数据库、建立表格、插入数据等有了更熟练的操作。
作业③:
- 要求:
掌握大数据相关服务,熟悉Xshell的使用
完成文档 华为云_大数据实时分析处理实验手册-Flume日志采集实验(部分)v2.docx 中的任务,即为下面5个任务,具体操作见文档。 - 环境搭建:
任务一:开通MapReduce服务 - 实时分析开发实战:
任务一:Python脚本生成测试数据
任务二:配置Kafka
任务三: 安装Flume客户端
任务四:配置Flume采集数据 - 输出:实验关键步骤或结果截图。
(1)结果截图(步骤太繁多,所以每个任务只展示结果截图)
- 任务一:开通MapReduce服务
- 集群

- 节点管理

- 弹性公网IP

- 任务一:Python脚本生成测试数据

- 任务二:配置Kafka

- 任务三: 安装Flume客户端

- 任务四:配置Flume采集数据

(2)心得体会
通过按照word一步一步操作,但是刚接触还是不熟练中间也走了很多弯路,一开始连Xshell和Xftp也不熟悉,不知道怎么操作,但最终还是完成了,结果做出来了,知道了如何开通MapReduce服务(MRS)、Flume日志采集相关服务的使用和Xshell、Xftp的使用有了一定的认识和操作,但感觉在截图过程可能有些潦草,只截了结果,下次可以留点心思在这上面。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)