这个作业属于哪个课程 | <首页 - 2024数据采集与融合技术实践 - 福州大学 - 班级博客 - 博客园 (cnblogs.com)> |
---|---|
这个作业要求在哪里 | <作业4 - 作业 - 2024数据采集与融合技术实践 - 班级博客 - 博客园 (cnblogs.com)> |
学号 | <102202101> |
一、作业内容
作业①
-
要求:
-
熟练掌握 Selenium 查找HTML元素、爬取Ajax网页数据、等待HTML元素等内容。
-
使用Selenium框架+ MySQL数据库存储技术路线爬取“沪深A股”、“上证A股”、“深证A股”3个板块的股票数据信息
-
代码如下
点击查看代码
# 爬取一个页面的数据
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')num = tds[0].textid = tds[1].textname = tds[2].textLatest_quotation = tds[6].textChg = tds[7].textup_down_amount = tds[8].textturnover = tds[9].texttransaction_volume = tds[10].textamplitude = tds[11].texthighest = tds[12].textlowest = tds[13].texttoday = tds[14].textyesterday = tds[15].textcursor.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()
-
输出信息:
-
Gitee文件夹链接:https://gitee.com/ma-xin1/data-acquisition/blob/master/作业4/task1.py
-
心得体会:
-
- 使用 Selenium 控制浏览器进行爬取
浏览器配置:通过 ChromeOptions 设置浏览器选项,禁用 GPU 加速,并通过 binary_location 指定 Chrome 浏览器的路径。通过 ChromeService 和指定 chromedriver.exe 来初始化浏览器驱动。
自动化操作:代码模拟了用户的浏览器操作,访问不同的网页链接(如行情中心、沪深京A股等),并通过 WebDriverWait 等待页面加载完成后继续操作。这种方式使得爬虫能够动态加载页面内容(如股票数据),适应现代网站的 Ajax 加载模式。
分页爬取:通过点击下一页按钮,循环爬取多页数据,并在每次爬取后等待页面加载完成。
- 使用 Selenium 控制浏览器进行爬取
-
- 数据库操作
连接 MySQL:通过 pymysql 连接到本地 MySQL 数据库,创建一个名为 stockT 的表来存储股票数据。如果表已存在,先删除再重新创建。
插入数据:每爬取一页股票数据,就将提取到的数据逐条插入到 MySQL 数据库中。使用 SQL 语句进行插入,并在每次插入后通过 db.commit() 提交事务,确保数据持久化。
- 数据库操作
-
- 网页解析
XPath 定位:通过 XPath 定位页面元素,如通过 find_elements(By.XPATH, '//table[@id="table_wrapper-table"]//tr[@class]') 找到所有表格行,从中提取股票信息。
数据提取:从每一行表格中提取多个数据字段(如股票编号、名称、最新报价等),并进行存储。需要注意,数据提取过程中可能遇到一些无效或格式不正确的数据,因此可以加入异常处理或数据清洗步骤。
- 网页解析
-
- 多次访问不同页面
代码通过 driver.get() 方法分别访问不同的网页,比如沪深A股、上证A股、深证A股等,爬取不同页面的股票数据。每爬取完一页数据后,会通过 driver.back() 返回到上一页面,然后继续爬取其他页面数据。这种结构使得爬虫能够获取多种股票板块的数据。
- 多次访问不同页面
-
- 潜在的改进和问题
错误处理:在数据库连接和操作时,应该加上更多的错误处理。例如,数据库连接失败、表创建失败或数据插入失败时的异常处理。
数据清洗:在插入数据前,可以对爬取的数据进行更严格的检查和清洗,避免无效数据或空值被存入数据库。
延时优化:虽然代码通过 time.sleep() 做了延时处理,但在爬取大量页面时,固定时间的等待可能会导致效率低下。可以考虑使用 WebDriverWait 来等待页面元素加载完成,而非简单地等待固定时间。
可扩展性:目前的代码只爬取了几页数据,如果需要爬取大量数据,可能需要增加分页控制,处理不同网站结构或反爬虫机制的情况。
作业②
- 潜在的改进和问题
-
要求:
-
熟练掌握 Selenium 查找HTML元素、实现用户模拟登录、爬取Ajax网页数据、等待HTML元素等内容。
-
使用Selenium框架+MySQL爬取中国mooc网课程资源信息(课程号、课程名称、学校名称、主讲教师、团队成员、参加人数、课程进度、课程简介)
-
代码如下
点击查看代码
# 爬取一个页面的数据
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_handlefor 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 = WebDriverWait(driver,10,0.48).until(EC.presence_of_element_located((By.ID,'j-rectxt2'))).textcBrief = driver.find_element(By.XPATH, '//*[@id="j-rectxt2"]').textif 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)
-
输出信息:
-
Gitee文件夹链接:https://gitee.com/ma-xin1/data-acquisition/blob/master/作业4/task2.py
-
心得体会:
-
1.使用 Selenium 库的合理性:
借助selenium库来自动化操作浏览器,能够很好地应对需要与动态网页交互的场景。例如在点击课程进入详情页、处理页面加载等待以及翻页等操作上,selenium提供的诸如WebDriverWait等待机制(通过expected_conditions模块)、元素定位方法(By类结合XPATH等定位方式)等功能,使得代码可以灵活地应对网页不同状态下的元素获取和交互需求,有效模拟了用户在浏览器中的操作行为,增强了爬虫的通用性和稳定性。 -
2.数据库交互部分:
代码中使用pymysql库连接 MySQL 数据库,并且在开始时对数据表进行了合理的创建(如果不存在则创建)以及先删除旧表的处理,逻辑严谨。后续将爬取到的数据插入到数据库的操作也比较常规和清晰,通过构建合适的INSERT语句,把从网页获取到的各类课程信息准确地存储起来,方便后续的数据查询、分析和应用。 -
3.数据处理细节:
在处理爬取到的课程简介文本时,考虑到了可能存在的特殊字符(如引号)会影响插入数据库的情况,进行了转义处理,这种对数据细节的把控能有效避免因数据格式问题导致的插入报错,提高了数据存储的成功率和准确性。另外,在爬取教师团队信息时,对于存在分页展示教师的情况,通过循环点击 “下一页” 按钮并持续收集教师名字的方式,较为全面地获取了完整的教师团队信息,保证了数据的完整性。 -
4.代码可改进之处
代码结构与可读性:
整体代码结构稍显混杂,虽然功能实现了,但把页面访问、数据爬取、数据库操作以及翻页逻辑等都放在一个大的脚本中,没有很好地进行模块化划分。例如,可以将不同功能的代码块提取成独立的函数,像把数据库连接和关闭操作封装成专门的函数、将翻页相关的逻辑独立出来等,这样能让代码结构更清晰,更易于理解和维护,后续如果需要扩展功能或者修改某一部分逻辑也更方便定位代码。作业③
-
要求:
-
掌握大数据相关服务,熟悉Xshell的使用
-
完成文档 华为云_大数据实时分析处理实验手册-Flume日志采集实验(部分)v2.docx 中的任务,即为下面5个任务,具体操作见文档。
-
环境搭建:
任务一:开通MapReduce服务 -
实时分析开发实战:
任务一:Python脚本生成测试数据
任务二:配置Kafka
任务三: 安装Flume客户端
任务四:配置Flume采集数据
任务一:Python脚本生成测试数据
任务二:配置Kafka
任务三: 安装Flume客户端
任务四:配置Flume采集数据
释放资源:
**心得体会:
- 通过这次华为云大数据实时分析处理实验,收获颇丰。
开通 MapReduce 服务,体会到云服务操作的规范便捷,为后续打基础。用 Python 脚本生成测试数据,感受到其在构造数据上的强大,也明白了数据质量等对分析的重要性。
配置 Kafka,认识到它在数据流转中的关键作用,参数配置需谨慎。安装 Flume 客户端,提升了解决依赖、网络等问题的能力。配置 Flume 采集数据,深知细节决定成败。
全程使用 Xshell 远程操作,深感其便利性与重要性。总之,此次实验提升了技能,加深了对大数据架构的理解,很有价值。