2024数据采集与融合技术实践-作业4
作业①:
1)使用Selenium框架+ MySQL数据库存储技术路线爬取“沪深A股”、“上证A股”、“深证A股”3个板块的股票数据信息。
1.核心代码描述
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
from selenium.webdriver.chrome.options import Options
import pymysql
# 建表操作
table_names=['stocks_hs','stocks_hz','stocks_sz'] #分别对应三个板块的表名
conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', password='******', charset='utf8')
conn.autocommit(True)
with conn.cursor() as cursor:
cursor.execute('USE homework')
for table_name in table_names:#建三张表
cursor.execute(f'drop table {table_name}') #因为我之前已经建了,为了调试程序直接删了重建,第一次运行可注释掉这行
cursor.execute(f"""
CREATE TABLE IF NOT EXISTS {table_name} (
序号 INT,
代码 VARCHAR(10),
名称 VARCHAR(255),
最新价 DECIMAL(10,2),
涨跌幅 VARCHAR(10),
涨跌额 DECIMAL(8,2),
成交量 VARCHAR(10),
成交额 VARCHAR(10),
振幅 VARCHAR(10),
最高 DECIMAL(10,2),
最低 DECIMAL(10,2),
今开 DECIMAL(10,2),
昨收 DECIMAL(10,2)
);
""") #成交量和成交额里都有汉字,振幅涨跌幅有百分号,这里为了方便直接使用字符串类型了
oringinal_url = 'https://quote.eastmoney.com/center/gridlist.html#hs_a_board'
header = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/130.0.0.0 Safari/537.36'
}
chrome_options = Options()
chrome_options.add_argument('--headless')
driver = webdriver.Chrome(chrome_options)
driver.get(oringinal_url)
for i in range(0,3):
stockBotton = driver.find_elements(By.XPATH, "//*[@id='tab']/ul/li")[i].find_element(By.XPATH,"./a") #对应板块按钮
stockBotton.click()#点击按钮
driver.refresh()#刷新网页
WebDriverWait(driver, 10).until(
EC.presence_of_all_elements_located((By.CSS_SELECTOR, 'td'))
)
stocks=driver.find_elements(By.XPATH,"//table[@id='table_wrapper-table']/tbody/tr")#查找表格
for stock in stocks:
td1 = stock.find_element(By.XPATH,'./td[1]').text#序号
td2 = stock.find_element(By.XPATH, './td[2]/a').text#代码
td3 = stock.find_element(By.XPATH, './td[3]/a').text#名称
td5 = stock.find_element(By.XPATH, './td[5]/span').text#最新价
td6 = stock.find_element(By.XPATH, './td[6]/span').text#涨跌幅
td7 = stock.find_element(By.XPATH, './td[7]/span').text#涨跌额
td8 = stock.find_element(By.XPATH, './td[8]').text#成交量
td9 = stock.find_element(By.XPATH, './td[9]').text#成交额
td10 = stock.find_element(By.XPATH, './td[10]').text#振幅
td11 = stock.find_element(By.XPATH, './td[11]/span').text#最高
td12 = stock.find_element(By.XPATH, './td[12]/span').text#最低
td13 = stock.find_element(By.XPATH, './td[13]/span').text#今开
td14 = stock.find_element(By.XPATH, './td[14]').text#昨收
#将对应元素插入表中
sql = f"""
INSERT INTO {table_names[i]} (序号,代码,名称,最新价,涨跌幅,涨跌额,成交量,成交额,振幅,最高,最低,今开,昨收)
VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s)
"""
data = (
td1, td2, td3, td5, td6,
td7, td8, td9, td10, td11,
td12, td13, td14
)
with conn.cursor() as cursor:
try:
cursor.execute(sql, data)
except Exception as e:
print(e)
print(f'{table_names[i]}数据存储成功')
driver.quit()
2.输出信息
3.Gitee文件夹链接
作业4/1 · 舒锦城/2022级数据采集与融合技术 - 码云 - 开源中国
作业②:
1)使用Selenium框架+MySQL爬取中国mooc网课程资源信息(课程号、课程名称、学校名称、主讲教师、团队成员、参加人数、课程进度、课程简介)
1.核心代码描述
from selenium import webdriver
from selenium.webdriver.common.by import By
import time
import pymysql
from bs4 import BeautifulSoup
# 设置Chrome浏览器为无头模式(即不显示浏览器窗口)并禁用GPU加速,这样可以在后台运行浏览器操作
chrome_options = webdriver.ChromeOptions()
chrome_options.add_argument('--headless')
chrome_options.add_argument('--disable-gpu')
# 创建一个Chrome浏览器驱动实例,并传入设置好的选项
driver = webdriver.Chrome(options=chrome_options)
# 登录操作
driver.get('https://www.icourse163.org/')
time.sleep(2)
# 将浏览器窗口最大化,有些页面在不同窗口大小下可能显示效果不同,最大化可尽量保证页面元素正常显示
driver.maximize_window()
# 通过XPath找到并点击页面上的登入按钮
next_button = driver.find_element(By.XPATH, '//*[@id="app"]/div/div/div[1]/div[3]/div[3]/div')
next_button.click()
# 再次等待2秒,确保点击按钮后的页面加载或相关操作完成
time.sleep(2)
frame = driver.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')
driver.switch_to.frame(frame)
# 输入账号操作
# 通过ID找到账号输入框元素,并使用send_keys方法输入指定的账号
account = driver.find_element(By.ID, 'phoneipt').send_keys('******')
# 输入密码操作
# 通过XPath找到密码输入框元素,并使用send_keys方法输入指定的密码
password = driver.find_element(By.XPATH, '/html/body/div[2]/div[2]/div[2]/form/div/div[4]/div[2]/input[2]').send_keys("******")
# 获取登录按钮操作
# 通过XPath找到登录按钮元素,后续将点击这个按钮来完成登录
logbutton = driver.find_element(By.XPATH, '/html/body/div[2]/div[2]/div[2]/form/div/div[6]/a')
# 点击按钮操作
# 点击找到的登录按钮,触发登录行为
logbutton.click()
# 等待2秒,让登录后的页面加载完成,可能会有登录后的跳转或相关数据加载等操作
time.sleep(2)
# 抓取课程信息操作
# 打开课程搜索页面的网址
driver.get('https://www.icourse163.org/search.htm?search=%20#/')
# 等待2秒,确保搜索页面加载完成
time.sleep(2)
next_button = driver.find_element(By.XPATH, '/html/body/div[4]/div[2]/div[2]/div[2]/div/div[6]/div[1]/div[1]/label/div')
next_button.click()
time.sleep(2)
# 定义一段JavaScript代码,用于实现页面滚动操作
# 这段代码的目的是模拟用户不断滚动页面,以加载更多课程信息(因为很多网页是滚动加载更多内容的)
js = '''
timer = setInterval(function(){
var scrollTop=document.documentElement.scrollTop||document.body.scrollTop;
var ispeed=Math.floor(document.body.scrollHeight / 100);
if(scrollTop > document.body.scrollHeight * 90 / 100){
clearInterval(timer);
}
console.log('scrollTop:'+scrollTop)
console.log('scrollHeight:'+document.body.scrollHeight)
window.scrollTo(0, scrollTop+ispeed)
}, 20)
'''
# 循环执行页面滚动操作,这里循环4次,每次执行滚动脚本后等待4秒,让页面有足够时间加载更多课程信息
for i in range(1, 5):
driver.execute_script(js)
time.sleep(4)
# 获取当前页面的源代码,后续将使用BeautifulSoup解析这些源代码来提取课程信息
html = driver.page_source
soup = BeautifulSoup(html, 'lxml')
course_cards = soup.find_all('div', class_='u-course-card')
# 遍历找到的每一个课程卡片元素
for card in course_cards:
a_tag = card.find('a', class_='f-thide', attrs={'data-v-55c26986': True})
# 如果找到的a标签存在且其文本内容为'国家精品',则进行以下信息提取和数据库插入操作
if a_tag and a_tag.text == '国家精品':
# 提取课程名称
b = card.find('a', class_='f-thide', attrs={'data-v-55c26986': True}).text
c = card.find('a', class_='f-fc9', attrs={'data-v-55c26986': True}).text
d = card.find('a', class_='f-fc9', attrs={'data-v-55c26986': True}).text
e = card.find('a', class_='f-fc9', attrs={'data-v-55c26986': True}).text
# 提取课程的选课人数信息
f = card.find('span', class_='u-course-card__num').text
# 找到课程卡片底部的元素,用于后续提取课程状态信息
g_tag = card.find('div', class_='u-course-card__bottom')
# 如果找到底部元素,则提取课程状态信息,否则设置为'已结束'(可能是默认状态假设)
g = g_tag.find('span', class_='u-course-card__status').text if g_tag else '已结束'
# 找到课程卡片的图片链接相关元素,用于后续提取课程简介信息
h_tag = card.find('a', class_='u-course-card__img-link')
# 如果找到图片链接相关元素,则提取课程简介信息,否则设置为'空'
h = h_tag.find('span', class_='u-course-card__img-text').text if h_tag else '空'
# 连接到本地的MySQL数据库
mydb = pymysql.connect(
host="localhost",
user="root",
password="******",
database="homework",
charset='utf8mb4'
)
try:
# 创建一个数据库游标对象,用于执行SQL语句
with mydb.cursor() as cursor:
# 定义要插入数据的SQL语句,将提取到的课程相关信息插入到名为'mooc'的表中
sql = "INSERT INTO mooc (cCourse, cCollege, cTeacher, cTeam, cCount, cProcess, cBrief) VALUES (%s, %s, %s, %s, %s, %s, %s)"
val = (b, c, d, e, f, g, h)
# 执行SQL插入语句,将数据插入到数据库表中
cursor.execute(sql, val)
# 提交数据库事务,使插入操作生效
mydb.commit()
print(b, c, d, e, f, g, h)
except Exception as e:
print(f"Error: {e}")
finally:
# 关闭数据库连接,释放资源
mydb.close()
# 通过XPath找到并点击页面上的下一页按钮(用于切换到课程列表的下一页继续抓取信息)
next_button = driver.find_element(By.XPATH, '//*[@id="j-courseCardListBox"]/div[2]/ul/li[10]')
next_button.click()
time.sleep(2)
2.输出信息
3.Gitee文件夹链接
作业4/2 · 舒锦城/2022级数据采集与融合技术 - 码云 - 开源中国
作业③:
1)完成文档 华为云_大数据实时分析处理实验手册-Flume日志采集实验(部分)v2.docx 中的任务,即为下面5个任务,具体操作见文档。
1.开通MapReduce服务
2.Python脚本生成测试数据
3.配置Kafka
4.安装Flume客户端
5.配置Flume采集数据
心得体会:
1.selenium的使用
对于selenium的使用更加熟练了,而且个人感觉使用selenium爬取股票数据相比于使用scrapy框架要方便很多,对于不同网站数据的爬取,应当选择合适的技术手段,才能做到方便快捷的爬取到我们想要的数据,并且使用selenium不需要设置用户头和cookie,以及被检测到的风险会小很多,更方便我们调试程序。
2.Flume日志采集
在最后产生实时的可视化数据图像感到很有成就感,深感Flume日志采集的功能强大,同时对海量数据的快速处理有了更深的了解,希望以后能更加熟练运用这些工具带来更多的价值。