数据采集与融合技术第四次作业
学号姓名 | 102202103王文豪 |
---|---|
gitee仓库地址 | https://gitee.com/wwhpower/project_wwh.git |
作业①:
要求:
熟练掌握 Selenium 查找HTML元素、爬取Ajax网页数据、等待HTML元素等内容。
使用Selenium框架+ MySQL数据库存储技术路线爬取“沪深A股”、“上证A股”、“深证A股”3个板块的股票数据信息。
候选网站:东方财富网:http://quote.eastmoney.com/center/gridlist.html#hs_a_board
输出信息:MYSQL数据库存储和输出格式如下,表头应是英文命名例如:序号id,股票代码:bStockNo……,由同学们自行定义设计表头
(1)代码如下:
#MYSQL数据库连接及创建数据库和表
def create_database_and_table():
db = mysql.connector.connect(
host="********",
user="****",
password="*****"
)
cursor = db.cursor()
# 创建数据库
cursor.execute("CREATE DATABASE IF NOT EXISTS stock")
cursor.execute("USE stock")
# 创建表
cursor.execute("""
CREATE TABLE IF NOT EXISTS stocks_sz (
id INT AUTO_INCREMENT PRIMARY KEY,
bStockNo VARCHAR(255),
bStockName VARCHAR(255),
latestPrice VARCHAR(255),
changePercent VARCHAR(255),
changeAmount VARCHAR(255),
volume VARCHAR(255),
amount VARCHAR(255),
amplitude VARCHAR(255),
high VARCHAR(255),
low VARCHAR(255),
open_price VARCHAR(255),
previousClose VARCHAR(255)
)
""")
db.commit()
cursor.close()
db.close()
爬取“沪深A股”、“上证A股”、“深证A股”
# 爬取股票数据并存储到数据库
def scrape_stock_data():
# Selenium WebDriver设置
driver = webdriver.Chrome()
driver.get("http://quote.eastmoney.com/center/gridlist.html#hs_a_board")
# 等待页面加载
time.sleep(5)
# 爬取数据
stocks = driver.find_elements(By.XPATH, "//tbody//tr")
# 连接数据库
db = mysql.connector.connect(
host="*****",
user="****",
password="*******",
database="stock"
)
cursor = db.cursor()
for stock in stocks:
bStockNo = stock.find_element(By.XPATH, ".//td[2]").text
bStockName = stock.find_element(By.XPATH, ".//td[3]").text
latestPrice = stock.find_element(By.XPATH, ".//td[5]").text
changePercent = stock.find_element(By.XPATH, ".//td[6]").text
changeAmount = stock.find_element(By.XPATH, ".//td[7]").text
volume = stock.find_element(By.XPATH, ".//td[8]").text
amount = stock.find_element(By.XPATH, ".//td[9]").text
amplitude = stock.find_element(By.XPATH, ".//td[10]").text
high = stock.find_element(By.XPATH, ".//td[11]").text
low = stock.find_element(By.XPATH, ".//td[12]").text
open_price = stock.find_element(By.XPATH, ".//td[13]").text
previousClose = stock.find_element(By.XPATH, ".//td[14]").text
# 数据存储到MySQL
cursor.execute("""
INSERT INTO stocks_sz (bStockNo, bStockName, latestPrice, changePercent, changeAmount, volume, amount, amplitude, high, low, open_price, previousClose)
VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s)
""", (bStockNo, bStockName, latestPrice, changePercent, changeAmount, volume, amount, amplitude, high, low, open_price, previousClose))
结果如下:
(2)心得体会:通过作业1,我深入学习了Selenium库的使用,包括如何查找HTML元素、处理Ajax请求和等待元素加载。我掌握了如何使用Selenium与MySQL数据库结合,实现数据的爬取和存储。学习了如何设计数据库表结构,以及如何编写SQL语句来创建表和插入数据。在爬取过程中,我遇到了元素定位的问题,通过使用浏览器的开发者工具和XPath选择器,我成功解决了这些问题。
作业②:
要求:
熟练掌握 Selenium 查找HTML元素、实现用户模拟登录、爬取Ajax网页数据、等待HTML元素等内容。
使用Selenium框架+MySQL爬取中国mooc网课程资源信息(课程号、课程名称、学校名称、主讲教师、团队成员、参加人数、课程进度、课程简介)
候选网站:中国mooc网:https://www.icourse163.org
输出信息:MYSQL数据库存储和输出格式
(1)代码如下:
核心爬取代码
# 爬取一个页面的数据
def spiderOnePage():
time.sleep(5) # 等待页面加载完成
courses = driver.find_elements(By.XPATH, '//*[@id="channel-course-list"]/div/div/div[2]/div[1]/div')
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 = driver.find_element(By.XPATH, '//*[@id="j-rectxt2"]').text
if not cBrief:
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(Handles[0]) # 跳转回原始页面
try:
cursor.execute('INSERT INTO courseMessage VALUES (%s, %s, %s, %s, %s, %s, %s)', (
cCourse, cCollege, cTeacher, cTeam, cCount, cProcess, cBrief))
db.commit()
except mysql.connector.Error as e:
print("数据库插入数据失败:", e)
翻页处理
# 翻页操作
next_page_button = driver.find_element(By.XPATH, '//*[@id="channel-course-list"]/div/div/div[2]/div[2]/div/a[10]')
while next_page_button.get_attribute('class') == '_3YiUU ':
if count >= 3: # 限制爬取的页数
break
next_page_button.click() # 点击按钮实现翻页
spiderOnePage() # 爬取一页的内容
next_page_button = driver.find_element(By.XPATH, '//*[@id="channel-course-list"]/div/div/div[2]/div[2]/div/a[10]')
count += 1
结果如下:
课程太多,每个课程爬取时间有点久,暂时先爬取一些课程
(2)心得体会:在作业2中,我进一步加深了对Selenium库的理解,特别是如何处理登录流程和iframe中的元素。可惜的是,在模拟用户交互,包括点击和输入,以及处理弹出的新窗口出现的问题,最后没有能够解决。
作业③:
要求:
掌握大数据相关服务,熟悉Xshell的使用
完成文档 华为云_大数据实时分析处理实验手册-Flume日志采集实验(部分)v2.docx 中的任务,即为下面5个任务,具体操作见文档。
环境搭建:
任务一:开通MapReduce服务
实时分析开发实战:
任务一:Python脚本生成测试数据
任务二:配置Kafka
任务三: 安装Flume客户端
任务四:配置Flume采集数据
输出:实验关键步骤或结果截图。
任务一:Python脚本生成测试数据
执行脚本测试
使用more命令查看生成的数据
任务二:下载安装并配置Kafka
校验下载的客户端文件包
安装Kafka运行环境
安装Kafka客户端
查看topic信息
任务三:安装Flume客户端
校验下载的客户端文件包
安装Flume运行环境
安装Flume客户端
重启Flume服务
任务四:配置Flume采集数据
修改配置文件
创建消费者消费kafka中的数据
心得体会:我掌握了实时分析的基本流程和技术架构。通过编写的Python脚本模拟生产商品的实时销售数据,然后由Flume+Kafka完成数据采集。