数据采集与融合技术实验课程作业四
数据采集与融合技术实验课程作业四
目录
任务①:
主要代码
try:
db = connect_db()
cursor = db.cursor()
cursor.execute('DROP TABLE IF EXISTS stockT')
sql = '''CREATE TABLE stockT(
num varchar(32),
id varchar(12),
name varchar(32),
Latest_quotation varchar(32),
Chg varchar(12),
up_down_amount varchar(12),
turnover varchar(16),
transaction_volume varchar(16),
amplitude varchar(16),
highest varchar(32),
lowest varchar(32),
today varchar(32),
yesterday varchar(32)
)'''
cursor.execute(sql)
except Exception as e:
print(e)
def spider(page_num):
cnt = 0
while cnt < page_num:
spiderOnePage()
driver.find_element(By.XPATH, '//a[@class="next paginate_button"]').click()
cnt += 1
time.sleep(2)
# 爬取一个页面的数据
def spiderOnePage():
time.sleep(3)
trs = driver.find_elements(By.XPATH, '//table[@id="table_wrapper-table"]//tr[@class]')
for tr in trs:
tds = tr.find_elements(By.XPATH, './/td')
if len(tds) >= 16: # 确保数据格式正确,检查列数是否符合
num = tds[0].text
id = tds[1].text
name = tds[2].text
Latest_quotation = tds[6].text
Chg = tds[7].text
up_down_amount = tds[8].text
turnover = tds[9].text
transaction_volume = tds[10].text
amplitude = tds[11].text
highest = tds[12].text
lowest = tds[13].text
today = tds[14].text
yesterday = tds[15].text
cursor.execute('INSERT INTO stockT VALUES ("%s","%s","%s","%s","%s","%s","%s","%s","%s","%s","%s","%s","%s")' % (
num, id, name, Latest_quotation, Chg, up_down_amount, turnover, transaction_volume, amplitude, highest, lowest, today, yesterday))
db.commit()
# 访问东方财富网
driver.get('https://www.eastmoney.com/')
# 访问行情中心
driver.get(WebDriverWait(driver, 15, 0.48).until(EC.presence_of_element_located((By.XPATH, '/html/body/div[6]/div/div[2]/div[1]/div[1]/a'))).get_attribute('href'))
# 访问沪深京A股
driver.get(WebDriverWait(driver, 15, 0.48).until(EC.presence_of_element_located((By.ID, 'menu_hs_a_board'))).get_attribute('href'))
# 爬取两页的数据
spider(2)
driver.back()
# 访问上证A股
driver.get(WebDriverWait(driver, 15, 0.48).until(EC.presence_of_element_located((By.ID, 'menu_sh_a_board'))).get_attribute('href'))
spider(2)
driver.back()
# 访问深证A股
driver.get(WebDriverWait(driver, 15, 0.48).until(EC.presence_of_element_located((By.ID, 'menu_sz_a_board'))).get_attribute('href'))
spider(2)
运行后
查看数据库
作业心得
分析
-
功能实现
1.使用了Selenium自动化测试工具进行网页数据爬取,通过定位网页元素实现页面的导航和数据提取。
2.提取到的数据包括股票编号、名称、最新报价、涨跌幅、成交量等,覆盖股票信息的多个方面。
3.数据被存储到MySQL数据库中,表结构合理,适合存储多维度的股票信息。 -
关键技术点
1.使用了WebDriverWait等待网页加载完成,避免了因页面加载速度不同导致的元素未找到错误。
2.Selenium的XPath定位结合页面结构动态获取链接并跳转,实现了较高的通用性。
3.数据库操作部分使用了pymysql库,事务提交设计避免了数据丢失。 -
不足与改进空间
1.错误处理不足:部分功能缺乏异常捕获,可能在网页结构变化或网络波动时导致程序中断。
2.效率与性能:在单页爬取时逐行插入数据库,效率偏低。可以使用批量插入提高性能。
3.浏览器模拟识别:使用了禁用AutomationControlled的选项,但仍可能被网站检测为爬虫,建议进一步伪装用户行为。
心得
- 学习和实践价值
这份代码展示了如何使用Selenium与MySQL结合完成数据抓取和存储,对学习爬虫技术和数据库操作有很大的借鉴意义。
提供了一个完整的抓取管道,从网页交互到数据库存储的过程一目了然。
任务②:
主要代码
def spiderOnePage():
time.sleep(5) # 等待页面加载完成
courses = driver.find_elements(By.XPATH, '//*[@id="channel-course-list"]/div/div/div[2]/div[1]/div')
current_window_handle = driver.current_window_handle
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 len(cBrief) == 0:
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(current_window_handle) # 跳转回原始页面
try:
cursor.execute('INSERT INTO courseMessage VALUES ("%s","%s","%s","%s","%s","%s","%s")' % (
cCourse, cCollege, cTeacher, cTeam, cCount, cProcess, cBrief))
db.commit()
except Exception as e:
print(e)
# 访问中国大学慕课
driver.get('https://www.icourse163.org/')
# 访问国家精品课程
driver.get(WebDriverWait(driver, 15, 0.48).until(EC.presence_of_element_located((By.XPATH, '//*[@id="app"]/div/div/div[1]/div[1]/div[1]/span[1]/a'))).get_attribute('href'))
spiderOnePage() # 爬取第一页的内容
count = 1
'''翻页操作'''
# 下一页的按钮
next_page = driver.find_element(By.XPATH, '//*[@id="channel-course-list"]/div/div/div[2]/div[2]/div/a[10]')
# 如果还有下一页,那么该标签的class属性为_3YiUU
while next_page.get_attribute('class') == '_3YiUU ':
if count == 5:
break
count += 1
next_page.click() # 点击按钮实现翻页
spiderOnePage() # 爬取一页的内容
next_page = driver.find_element(By.XPATH, '//*[@id="channel-course-list"]/div/div/div[2]/div[2]/div/a[10]')
运行后
查看数据库
作业心得
分析
- 功能实现
数据爬取
利用Selenium模拟浏览器操作,通过点击、翻页等方式抓取多页课程数据。
提取的数据包括课程名称、大学名称、主讲老师、参与人数、课程进度、课程简介以及授课团队等,数据维度较为全面。
数据存储
使用了MySQL数据库存储爬取结果,表结构设计合理。
技术点
动态页面处理:通过点击和切换标签页抓取动态加载的数据,如课程简介和团队信息。
异常处理:在数据库插入部分加入了基本的异常捕获,避免爬虫因单条数据错误中断。 - 不足与改进
性能问题
爬取速度较慢,如单个课程需要频繁等待页面加载,建议结合多线程或异步操作优化。
错误处理不足
课程爬取过程中异常捕获不完善,如页面加载失败或元素定位失败时可能导致中断。
心得
- 技术收获
学习了如何使用Selenium实现动态网站的数据抓取,特别是对多页和动态加载内容的处理。
数据存储部分对可能存在的问题进行了处理(如特殊字符转义),体现了实际应用场景中对细节的关注。 - 改进方向
加强异常处理机制,确保爬虫的稳定性。
使用Scrapy等框架代替Selenium,提高爬取效率。
增加日志记录功能,便于调试和分析爬取过程中的问题。
任务③:
任务一:Python脚本生成测试数据
- 创建并进入/opt/client/目录,使用vi命令编写Python脚本:autodatagen.py
- 执行Python命令,测试生成100条数据
- 使用more命令查看生成的数据
任务二:下载安装并配置Kafka
- 使用PuTTY登录到master节点服务器上,进入/tmp/FusionInsight-Client/目录。
- 安装Kafka运行环境,解压“MRS_Flume_ClientConfig.tar”文件。
- 安装客户端运行环境到目录“/opt/Kafka_env”(安装时自动生成目录)。
sh FusionInsight_Cluster_1_Kafka_ClientConfig/install.sh /opt/Kafka_env
- 查看topic信息
任务三:安装Flume客户端
- 解压“MRS_Flume_ClientConfig.tar”文件
- 安装Flume客户端
任务四:配置Flume采集数据
- check
作业心得
- 大数据平台环境搭建
了解了如何在华为云上开通大数据服务(MRS),包括虚拟私有云(VPC)的创建、弹性IP的绑定、安全组规则配置等。通过这些操作,掌握了云环境的基本搭建步骤。 - Flume 日志采集
掌握了 Flume 的核心配置项(Source、Channel、Sink)及其在实时流数据采集中的应用。
实验中模拟了一个数据采集管道,通过 Python 脚本生成测试数据,并通过 Flume 将数据传输到 Kafka。这一流程体现了 Flume 在数据采集中的高效性和灵活性。 - Kafka 配置与使用
学习了 Kafka 在大数据架构中作为消息中间件的作用,了解了 Topic 的创建、数据传输以及与 Flume 的集成方法。
实验中详细展示了 Kafka 客户端的安装与配置过程,为后续的流式计算打下了基础。 - 实时数据分析准备
Flume 数据采集的最终目的是为实时分析提供数据支持。实验手册中的设计为后续数据分析(如通过 DLV 数据可视化工具)提供了清晰的技术路径。