作业①
要求:
熟练掌握 Selenium 查找 HTML 元素、爬取 Ajax 网页数据、等待 HTML 元素等内容。
使用 Selenium 框架+ MySQL 数据库存储技术路线爬取“沪深 A 股”、“上证 A 股”、“深证 A 股”3 个板块的股票数据信息。
候选网站:东方财富网:http://quote.eastmoney.com/center/gridlist.html#hs_a_board
输出信息:MYSQL 数据库存储和输出格式如下,表头应是英文命名例如:序号id,股票代码:bStockNo……,由同学们自行定义设计表头:
Gitee文件夹链接:https://gitee.com/EI-Shaddoll-Midrash/2023-data-collection/tree/master/作业4
代码如下:
import pymysql
from selenium import webdriver
from lxml import etree
import time
edge_options = webdriver.EdgeOptions()
edge_options.add_argument('--headless')
edge_options.add_argument('--disable-gpu')
driver = webdriver.Chrome(options=edge_options)
def Spider(url):
driver.get(url)
time.sleep(1) # 等待页面加载完毕
html = etree.HTML(driver.page_source) # 获取网页HTML内容
# print(html)
# 获得元素信息
lis = html.xpath('//*[@id="table_wrapper-table"]/tbody/tr')
for link in lis:
stock_id = link.xpath('./td[2]/a/text()')[0]
stock_name = link.xpath('./td[3]/a/text()')[0]
newest_price = link.xpath('./td[5]/span/text()')[0]
up_down_extent = link.xpath('./td[6]/span/text()')[0]
up_down_value = link.xpath('./td[7]/span/text()')[0]
deal_value = link.xpath('./td[8]/text()')[0]
freq = link.xpath('./td[10]/text()')[0]
highest = link.xpath('./td[11]/span/text()')[0]
lowest = link.xpath('./td[12]/span/text()')[0]
opening = link.xpath('./td[13]/span/text()')[0]
zt = link.xpath('./td[14]/text()')[0]
try:
# 打开数据库
mydb = pymysql.connect(host="127.0.0.1", port=3306, user="root", passwd="123456", db="mydb", charset="utf8")
# 创建游标
mycursor = mydb.cursor()
# sql语言
sql = "INSERT INTO demo2 (stock_id, stock_name, newest_price, up_down_extent, up_down_value,deal_value, " \
"freq, highest, lowest, opening, zt) VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s)"
val = (
stock_id,stock_name,newest_price,up_down_extent,up_down_value,deal_value,freq,highest,lowest,opening,zt)
# 执行语句
mycursor.execute(sql, val)
# 确认更新
mydb.commit()
except Exception as err:
print(err)
def main():
url1 = 'https://quote.eastmoney.com/center/gridlist.html#hs_a_board' # 要爬取的网页URL
url2 = 'https://quote.eastmoney.com/center/gridlist.html#sh_a_board' # 要爬取的网页URL
url3 = 'https://quote.eastmoney.com/center/gridlist.html#sz_a_board' # 要爬取的网页URL
#进行爬取工作
Spider(url1)
Spider(url2)
Spider(url3)
if __name__ == '__main__':
main()
效果展示
心得体会
这个实验和上个实验的内容接近,没有什么要过多注意的地方
作业②
要求:
熟练掌握 Selenium 查找 HTML 元素、实现用户模拟登录、爬取 Ajax 网页数据、
等待 HTML 元素等内容。
使用 Selenium 框架+MySQL 爬取中国 mooc 网课程资源信息(课程号、课程名
称、学校名称、主讲教师、团队成员、参加人数、课程进度、课程简介)
候选网站:中国 mooc 网:https://www.icourse163.org
输出信息:MYSQL 数据库存储和输出格式
Gitee文件夹:https://gitee.com/EI-Shaddoll-Midrash/2023-data-collection/tree/master/作业4
代码如下:
import pymysql
from bs4 import BeautifulSoup
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import time
rows = []
def findElement(html):
soup = BeautifulSoup(html, 'html.parser')
global rows
try:
# 尽量精确查找
row = ''
div_elements = soup.select('div[class="m-course-list"]>div>div')
# 在div_element中获取需要的元素
for div_element in div_elements:
cCourse = cCollege = cTeacher = cTeam = cCount = cProcess = cBrief = ""
#获取课程名字
course_name = div_element.select_one('span[class="u-course-name f-thide"]')
if course_name is not None:
cCourse = course_name.text.strip()
else:
continue
#获取学校名字
college_name = div_element.select_one('a[class="t21 f-fc9"]')
if college_name is not None:
cCollege = college_name.text.strip()
else:
continue
#获取老师名字
teacher_name = div_element.select_one('a[class="f-fc9"]')
if teacher_name is not None:
cTeacher = teacher_name.text.strip()
else:
continue
#获取团队名字
team_name = div_element.select_one('span[class="f-fc9"]')
if team_name is not None:
cTeam = team_name.text.replace('、', ' ').strip()
else:
continue
#获取人数
count_num = div_element.select_one('span[class="hot"]')
if count_num is not None:
cCount = count_num.text.replace('人参加', '')
else:
continue
#获取课程进度
process_info = div_element.select_one('span[class="txt"]')
if process_info is not None:
cProcess = process_info.text
else:
continue
#获取课程简介
brief_info = div_element.select_one('span[class="p5 brief f-ib f-f0 f-cb"]')
if brief_info is not None:
cBrief = brief_info.text
else:
continue
# 对获取到的元素进行拼接
row = cCourse + "-" + cCollege + "-" + cTeacher + "-" + cTeam + "-" + str(
cCount) + "-" + cProcess + "-" + cBrief
rows.append(row)
except Exception as err:
print(err)
return rows
def saveData():
global rows
# 进入数据库
mydb = pymysql.connect(host="127.0.0.1", port=3306, user="root", passwd="123456", db="mydb",
charset="utf8")
# 创建游标
cursor = mydb.cursor()
# 删除已有表
cursor.execute("drop table mooc")
# 新建表
cursor.execute('''
CREATE TABLE mooc (
Id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
cCourse VARCHAR(45),
cCollege VARCHAR(45),
cTeacher VARCHAR(45),
cTeam VARCHAR(255),
cCount VARCHAR(45),
cProcess VARCHAR(45),
cBrief VARCHAR(255)
);
''')
# 向表中插入数据
for row in rows:
print(row)
data = row.split('-')
cursor.execute(
"INSERT INTO mooc (cCourse,cCollege,cTeacher,cTeam,cCount,cProcess,cBrief) VALUES (%s, %s, %s, %s, %s, %s, %s)",
(data[0], data[1], data[2], data[3], data[4], data[5], data[6])
)
mydb.commit()
# 创建对象
edge_options = webdriver.EdgeOptions()
# edge_options.add_argument('--headless')
# edge_options.add_argument('--disable-gpu')
browser = webdriver.Chrome(options=edge_options)
url = 'https://www.icourse163.org/'
browser.get(url) # 获取网页
time.sleep(1) # 等待网页加载
browser.maximize_window()#放大网页至全屏
# 获取登录按键
loginbutton = browser.find_element(By.XPATH, '//div[@class="_1Y4Ni"]/div')
# 点击按键
loginbutton.click()
time.sleep(3)
# 转换到iframe
frame = browser.find_element(By.XPATH,
'/html/body/div[13]/div[2]/div/div/div/div/div/div[1]/div/div[1]/div[2]/div[2]/div[1]/div/iframe')
browser.switch_to.frame(frame)
# 输入账号
account = browser.find_element(By.ID, 'phoneipt').send_keys('13055261873*')
# 输入密码
password = browser.find_element(By.XPATH, '/html/body/div[2]/div[2]/div[2]/form/div/div[4]/div[2]/input[2]').send_keys(
"**************")
# 获取登录按钮
logbutton = browser.find_element(By.XPATH, '/html/body/div[2]/div[2]/div[2]/form/div/div[6]/a')
# 点击按钮
logbutton.click()
# 等待登录成功页面加载完成
time.sleep(5)
# 跳出iframe
browser.switch_to.default_content()
# 等待页面成功加载
wait = WebDriverWait(browser, 10)
element = wait.until(EC.visibility_of_element_located((By.CSS_SELECTOR, ".inputtxt")))
# 找到输入框并输入内容
phone_input = browser.find_element(By.CSS_SELECTOR, ".inputtxt")
phone_input.send_keys("计算机")
# 点击搜索按钮
searchbutton = browser.find_element(By.CSS_SELECTOR, ".j-searchBtn")
searchbutton.click()
time.sleep(2)
for i in range(10):
# 等待页面成功加载
wait = WebDriverWait(browser, 10) # 设置显式等待时间为10秒
element = wait.until(
EC.visibility_of_element_located((By.CSS_SELECTOR, ".th-bk-main-gh"))) # 等待元素可见
html = browser.page_source
findElement(html)
# 实现翻页
time.sleep(1)
nextbutton = browser.find_element(By.CSS_SELECTOR, ".th-bk-main-gh")
nextbutton.click()
# 保存到数据库
saveData()
# 关闭浏览器
print('over')
browser.quit()
效果展示:
心得体会:
这个实验的难点在于如何实现mooc的登录。(虽然不登录也可以实现爬取信息)。第一次发现找不到输入账号密码的框,然后发现这个登录界面是弹窗,最后发现这个输入框在iframe的document中,需要用iframe进行转换,然后才能实现输入。
作业③
要求:
• 掌握大数据相关服务,熟悉 Xshell 的使用
• 完成文档 华为云_大数据实时分析处理实验手册-Flume 日志采集实验(部
分)v2.docx 中的任务,即为下面 5 个任务,具体操作见文档。
• 环境搭建:
·任务一:开通 MapReduce 服务
• 实时分析开发实战:
·任务一:Python 脚本生成测试数据
使用Xshell 7连接服务器
进入/opt/client/目录,使用vi命令编写Python脚本:vi autodatapython.py
创建目录
使用mkdir命令在/tmp下创建目录flume_spooldir,我们把Python脚本模拟生成的数据放到此目录下,后面Flume就监控这个文件下的目录,以读取数据。
测试执行
执行Python命令,测试生成100条数据
查看数据
·任务二:配置 Kafka
设置环境变量
首先设置环境变量,执行source命令,使变量生效
在kafka中创建topic
执行如下命令创建topic,替换实际Zookeeper的IP
查看topic信息
·任务三: 安装 Flume 客户端
打开flume服务界面
进入MRS Manager集群管理界面,打开服务管理,点击flume,进入Flume服务
点击下载客户端
点击确定,等待下载
解压下载的flume客户端文件
使用Xshell7登录到上步中的弹性服务器上,进入/tmp/MRS-client目录
执行以下命令,解压压缩包获取校验文件与客户端配置包
校验文件包
解压“MRS_Flume_ClientConfig.tar”文件
安装Flume环境变量
执行以下命令,安装客户端运行环境到新的目录“/opt/Flumeenv”,安装时自动生成目录。
查看安装输出信息,如有以下结果表示客户端运行环境安装成功:
配置环境变量,执行命令:
解压Flume客户端
执行命令
安装Flume客户端
安装Flume到新目录”/opt/FlumeClient”,安装时自动生成目录。
重启Flume服务
执行一下命令
·任务四:配置 Flume 采集数据
修改配置文件
在conf目录下编辑文件properties.properties
创建消费者消费kafka中的数据
执行完毕后,在新开一个Xshell 7窗口(右键相应会话-->在右选项卡组中打开),执行2.2.1步骤三的Python脚本命令,再生成一份数据,查看Kafka中是否有数据产生,可以看到,已经消费出数据了:
有数据产生,表明Flume到Kafka目前是打通的。测试完毕可以关闭Kafka的消费者窗口了。
输出:实验关键步骤或结果截图。
心得体会:
这个实验简单,就是按照word文档的步骤一步一步来就行了。