2023数据采集与融合技术实践四

发布时间 2023-11-16 00:29:16作者: liannnn

作业1:
·要求:
·熟练掌握 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/lian111111/crawl_project/tree/master/数据采集与融合技术第四次作业/作业4.1
代码如下:

	import pandas as pd
	from selenium import webdriver
	from selenium.webdriver.common.by import By
	from selenium.common.exceptions import TimeoutException, NoSuchElementException
	from selenium.webdriver.support import expected_conditions as EC
	from selenium.webdriver.support.ui import WebDriverWait
	from sqlalchemy import create_engine
	import mysql.connector
	import time

	# MySQL连接配置
	config = {
		'host': 'localhost',
		'user': 'root',
		'password': 'xck030312',
		'database': 'stock'
	}

	# 创建或更新数据表
	def setup_database(engine):
		with engine.connect() as conn:
			conn.execute(
				"""CREATE TABLE IF NOT EXISTS stock3s (
					id INT AUTO_INCREMENT PRIMARY KEY,
					serial_number INT,
					code VARCHAR(10),
					name VARCHAR(255),
					latest_price DECIMAL(10, 2),
					change_percentage VARCHAR(10),
					change_amount DECIMAL(10, 2),
					trade_volume VARCHAR(20),
					trade_value VARCHAR(20),
					amplitude VARCHAR(10),
					highest_price DECIMAL(10, 2),
					lowest_price DECIMAL(10, 2),
					opening_price DECIMAL(10, 2),
					closing_price DECIMAL(10, 2),
					volume_ratio DECIMAL(10, 2),
					turnover_rate VARCHAR(10),
					pe_ratio DECIMAL(10, 2),
					pb_ratio DECIMAL(10, 2)
				)"""
			)

	# 清理并转换数值
	# 省略clean_value函数,与原始代码相同

	# 爬取并存储数据
	def scrape_and_store(url, page_limit=None):
		# 启动Edge浏览器
		driver = webdriver.Edge()
		driver.get(url)

		engine = create_engine(f"mysql+mysqlconnector://{config['user']}:{config['password']}@{config['host']}/{config['database']}")
		setup_database(engine)

		page_scraped = 0

		while True:
			try:
				table = WebDriverWait(driver, 10).until(
					EC.presence_of_element_located((By.CSS_SELECTOR, 'table'))
				)
				df = pd.read_html(table.get_attribute('outerHTML'))[0]
				df = df.applymap(clean_value)  # 应用清理函数

				df.to_sql('stock3s', con=engine, if_exists='append', index=False)

				page_scraped += 1
				if page_limit is not None and page_scraped >= page_limit:
					break

				next_button = driver.find_element(By.CSS_SELECTOR, 'a.next.paginate_button')
				if 'disabled' in next_button.get_attribute('class'):
					break
				next_button.click()
				time.sleep(2)

			except (TimeoutException, NoSuchElementException) as e:
				print(f"An error occurred: {e}")
				break

		driver.quit()

	# 爬取三个板块的数据
	urls = [
		'http://quote.eastmoney.com/center/gridlist.html#hs_a_board',
		# ... 其他URL
	]
	for url in urls:
		scrape_and_store(url, page_limit=100)



结果如下图:
![image](https://img2023.cnblogs.com/blog/3290004/202311/3290004-20231116000458345-810924073.png)

心得体会:
翻页功能的实现主要是查找“next”按钮,并模拟点击进行刷新数据
之前的爬取json数据使用的是sqlite,这次采用了mysql,重构了代码较为顺利

作业2
·要求:
·熟练掌握 Selenium 查找HTML元素、实现用户模拟登录、爬取Ajax网页数据、等待HTML元素等内容。
使用Selenium框架+MySQL爬取中国mooc网课程资源信息(课程号、课程名称、学校名称、主讲教师、团队成员、参加人数、课程进度、课程简介)
候选网站:中国mooc网:https://www.icourse163.org
·输出信息:MYSQL数据库存储和输出格式
·Gitee文件夹链接:https://gitee.com/lian111111/crawl_project/tree/master/数据采集与融合技术第四次作业/作业4.2

代码如下:

import pandas as pd
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 scrapy.selector import Selector
import mysql.connector
from sqlalchemy import create_engine

# 数据库配置
config = {
	'host': 'localhost',
	'user': 'root',
	'password': 'xck030312',
	'database': 'stock'
}


def setup_database(engine):
	# 使用SQLAlchemy引擎创建表
	with engine.connect() as conn:
		conn.execute(
			"""CREATE TABLE IF NOT EXISTS mooc (
			id INT AUTO_INCREMENT PRIMARY KEY,
			course VARCHAR(255),
			school VARCHAR(255),
			teacher VARCHAR(255),
			team VARCHAR(255),
			number VARCHAR(255),
			time VARCHAR(255),
			jianjie TEXT
			)"""
		)


def main():
	url = 'https://www.icourse163.org/'
	driver = webdriver.Edge()
	driver.get(url)

	login(driver)
	search_for_courses(driver, "java")
	content = driver.page_source
	driver.quit()

	data = parse_content(content)
	save_to_database(data)


def login(driver):


# 省略登录代码,与原始代码相同

def search_for_courses(driver, query):


# 省略搜索代码,与原始代码相同

def parse_content(content):


# 省略解析内容代码,与原始代码相同

def save_to_database(data):
	# 创建数据库连接引擎
	engine = create_engine(
		f"mysql+mysqlconnector://{config['user']}:{config['password']}@{config['host']}/{config['database']}")

	# 设置数据库
	setup_database(engine)

	# 创建DataFrame对象
	df = pd.DataFrame(data=data, columns=['course', 'school', 'teacher', 'team', 'number', 'time', 'jianjie'])

	# 使用Pandas的to_sql方法直接保存到数据库
	df.to_sql('mooc', con=engine, if_exists='append', index=False)


if __name__ == "__main__":
	main()

运行结果如图所示:
image

心得体会:
对Selenium有了更深的理解

作业3
·要求:
·掌握大数据相关服务,熟悉Xshell的使用
·完成文档 华为云_大数据实时分析处理实验手册-Flume日志采集实验(部分)v2.docx 中的任务,即为下面5个任务,具体操作见文档。
·环境搭建:开通MapReduce服务
·实时分析开发实战:
·任务一:Python脚本生成测试数据 ·任务二:配置Kafka ·任务三: 安装Flume客户端 ·任务四:配置Flume采集数据
·输出:实验关键步骤或结果截图。

过程与结果展示:
任务一:Python脚本生成测试数据
image
image

任务二:配置Kafka
image
image

任务三: 安装Flume客户端
image
image
image
image

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

心得体会:
通过本次实践让我加深了对selenium爬取数据过程的知识的理解,同时紧接上次课作业对于将数据存储到数据库当中更加熟练!对华为云的相关服务有了初步认识、拓宽自己的眼界与认知!但在根据实践手册一步一步进行操作时还是有碰到些许问题,应该是自己较为粗心在配置时出现问题,今后做事应当更加注意细节。