当前位置: 首页 > article >正文

【Python】实现爬虫(完整版),爬取天气数据并进行可视化分析

往期源码回顾:【C】图书管理系统(完整板)【C】实现图书管理系统Qt C GUI界面版进入今天的正题1.实现需求从网上(随便一个网址我爬的网址会在评论区告诉大家dddd获取某一年的历史天气信息包括每天最高气温、最低气温、天气状况、风向等完成以下功能 1将获取的数据信息存储到csv格式的文件中文件命名为”城市名称.csv”,其中每行数据格式为“日期最高温最低温天气风向” 2在数据中增加“平均温度”一列其中平均温度最高温最低温/2在同一张图中绘制两个城市一年平均气温走势折线图 3统计两个城市各类天气的天数并绘制条形图进行对比假设适合旅游的城市指数由多云天气占比0.3晴天占比0.4阴天数占比0.3试比较两个城市中哪个城市更适合旅游 4统计这两个城市每个月的平均气温绘制折线图并通过折线图分析该城市的哪个月最适合旅游 5统计出这两个城市一年中平均气温在18~25度风力小于5级的天数并假设该类天气数越多城市就越适宜居住判断哪个城市更适合居住2025年3月2日更新爬取网址新增了查看更多选项导致我们爬取数据时每个月份的数据爬取不全为了解决这个问题我们需要使用selenium中的webdriver模拟用户点击查看更多之后再获取整个页面再进行解析就可以获取全部数据了。因此代码有所更新。爬虫代码:importrandomimporttimefromspider.data_storageimportDataStoragefromspider.html_downloaderimportHtmlDownloaderfromspider.html_parserimportHtmlParserclassSpiderMain:def__init__(self):self.html_downloaderHtmlDownloader()self.html_parserHtmlParser()self.data_storageDataStorage()defstart(self): 爬虫启动方法 将获取的url使用下载器进行下载 将html进行解析 数据存取 :return: foriinrange(1,13):# 采用循环的方式进行依次爬取time.sleep(random.randint(0,10))# 随机睡眠0到40s防止ip被封urlXXXXhtmlself.html_downloader.download(url)resultWeatherself.html_parser.parser(html)resultWeather.insert(0,t)self.data_storage.storage(resultWeather)if__name____main__:mainSpiderMain()main.start()importrequestsasrequestsclassHtmlDownloader:defdownload(self,url): 根据给定的url下载网页 :param url: :return: 下载好的文本 headers{User-Agent:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:101.0) Gecko/20100101 Firefox/101.0}resultrequests.get(url,headersheaders)returnresult.content.decode(utf-8)此处大家需要注意将User-Agent换成自己浏览器访问该网址的具体如何查看呢其实很简单只需大家进入网站后右键网页然后点击检查将出现这样的界面然后只需再点击网络再随便点击一个请求如下图就可以进入如下图然后再复制图中User-Agent的内容就好了继续from bs4importBeautifulSoupclassHtmlParser:defparser(self,html): 解析给定的html:param html::return:area set weather[]bsBeautifulSoup(html,html.parser)bodybs.body # 获取html中的body部分 uldiv.find(ul)# 获取div中的ul/ulliul.find_all(li)# 获取ul中的所有li/liforl in li:tempWeather[]div1l.find_all(div)# 获取当前li中的所有divfori in div1:tempStri.string.replace(℃,)# 将℃进行替换 tempStrtempStr.replace( ,)# 替换空格 tempWeather.append(tempStr)weather.append(tempWeather)returnweatherimportpandasas pdclassDataStorage:defstorage(self,weather): 数据存储:param weather list:return: datapd.DataFrame(columnsweather[0],dataweather[1:])# 格式化数据 data.to_csv(C:\\Users\\86183\\Desktop\\成都.csv,indexFalse,sep,,modea)# 保存到csv文件当中可视化代码importpandasaspdimportmatplotlibasmplimportnumpyasnpimportmatplotlib.pyplotasplt plt.rcParams[font.sans-serif][SimHei]# 设置字体plt.rcParams[axes.unicode_minus]False# 该语句解决图像中的“-”负号的乱码问题defbroken_line_chart(x,y1,y2):# 折线图绘制函数plt.figure(dpi500,figsize(10,5))plt.title(泸州-成都每日平均气温折线图)plt.plot(x,y1,colorcyan,label泸州)plt.plot(x,y2,coloryellow,label成都)# 获取图的坐标信息coordinatesplt.gca()# 设置x轴每个刻度的间隔天数xLocatormpl.ticker.MultipleLocator(30)coordinates.xaxis.set_major_locator(xLocator)# 将日期旋转30°plt.xticks(rotation30)plt.xticks(fontsize8)plt.ylabel(温度(℃))plt.xlabel(日期)plt.legend()plt.savefig(平均气温走势折线图.png)# 平均气温折线图plt.show()plt.close()data_luZhoupd.read_csv(C:\\Users\\Administrator\\Desktop\\泸州.csv)data_chengdupd.read_csv(C:\\Users\\Administrator\\Desktop\\成都.csv)# 将列的名称转为列表类型方便添加columSdata_luZhou.columns.tolist()columYdata_chengdu.columns.tolist()# 将数据转换为列表data_luZhounp.array(data_luZhou).tolist()data_chengdunp.array(data_chengdu).tolist()# 在最开始的位置上添加列的名字data_luZhou.insert(0,columS)data_chengdu.insert(0,columY)# 添加平均气温列data_luZhou[0].append(平均气温)data_chengdu[0].append(平均气温)weather_dict_luZhou{}weather_dict_chengdu{}foriinrange(1,len(data_luZhou)):# 去除日期中的星期data_luZhou[i][0]data_luZhou[i][0][0:10]data_chengdu[i][0]data_chengdu[i][0][0:10]# 获取平均气温average_luZhouint((int(data_luZhou[i][1])int(data_luZhou[i][2]))/2)average_chengduint((int(data_chengdu[i][1])int(data_chengdu[i][2]))/2)# 将平均气温添加进入列表中data_luZhou[i].append(average_luZhou)data_chengdu[i].append(average_chengdu)# 将新的数据存入新的csv中new_data_luZhoupd.DataFrame(columnsdata_luZhou[0],datadata_luZhou[1:])new_data_chengdupd.DataFrame(columnsdata_chengdu[0],datadata_chengdu[1:])new_data_luZhou.to_csv(泸州.csv,indexFalse,sep,)new_data_chengdu.to_csv(成都.csv,indexFalse,sep,)# 折线图的绘制y1np.array(new_data_luZhou.get(平均气温)).tolist()y2np.array(new_data_chengdu.get(平均气温)).tolist()xnp.array(new_data_luZhou.get(日期)).tolist()broken_line_chart(x,y1,y2)# 进行每个月的平均气温求解new_data_luZhou[日期]pd.to_datetime(new_data_luZhou[日期])new_data_chengdu[日期]pd.to_datetime(new_data_chengdu[日期])new_data_luZhou.set_index(日期,inplaceTrue)new_data_chengdu.set_index(日期,inplaceTrue)# 按月进行平均气温的求取new_data_luZhou[平均气温](new_data_luZhou[最高气温]new_data_luZhou[最低气温])/2new_data_chengdu[平均气温](new_data_chengdu[最高气温]new_data_chengdu[最低气温])/2month_lnew_data_luZhou[[平均气温]].resample(ME).mean()month_lnp.array(month_l).tolist()month_cnew_data_chengdu[[平均气温]].resample(ME).mean()month_cnp.array(month_c).tolist()lengthmin(len(month_c),len(month_l))month_average_l[]month_average_c[]foriinrange(length):month_average_l.append(month_l[i][0])month_average_c.append(month_c[i][0])month_list[str(i)月foriinrange(1,13)]plt.figure(dpi500,figsize(10,5))plt.title(泸州-成都每月平均折线气温图)plt.plot(month_list,month_average_l,colorcyan,label泸州,markero)plt.plot(month_list,month_average_c,colorblue,label成都,markerv)fora,binzip(month_list,month_average_l):plt.text(a,b0.5,%.2f%b,horizontalalignmentcenter,verticalalignmentbottom,fontsize6)fora,binzip(month_list,month_average_c):plt.text(a,b-0.5,%.2f%b,horizontalalignmentcenter,verticalalignmentbottom,fontsize6)plt.legend()plt.xlabel(月份)plt.ylabel(温度℃)plt.savefig(月平均气温折线图.png)# 月平均气温折线图plt.show()## 只获取两列的数据data_lpd.read_csv(泸州.csv,usecols[风向,平均气温])data_cpd.read_csv(成都.csv,usecols[风向,平均气温])data_lnp.array(data_l).tolist()data_cnp.array(data_c).tolist()day_c0day_l0foriinrange(len(data_l)):iflen(data_l[i][0])6:ifint(data_l[i][0][4])5and18int(data_l[i][1])25:day_l1else:ifint(data_l[i][0][3])5and18int(data_l[i][1])25:day_l1iflen(data_c[i][0])6:ifint(data_c[i][0][4])5and10int(data_c[i][1])25:day_c1else:ifint(data_c[i][0][3])5and18int(data_c[i][1])25:day_c1plt.figure(dpi500,figsize(8,4))plt.title(泸州-成都平均气温在18-25且风力5级的天数)list_name[泸州,成都]list_days[day_l,day_c]plt.bar(list_name,list_days,width0.5)plt.text(0,day_l,%.0f%day_l,horizontalalignmentcenter,verticalalignmentbottom,fontsize7)plt.text(1,day_c,%.0f%day_c,horizontalalignmentcenter,verticalalignmentbottom,fontsize7)plt.xlabel(城市)plt.ylabel(天数(d))plt.savefig(适宜居住柱形图.png)plt.show()data_lpd.read_csv(泸州.csv)data_cpd.read_csv(成都.csv)# 将数据转换为列表data_lnp.array(data_l).tolist()data_cnp.array(data_c).tolist()# 获取每种天气的天数采用字典类型进行存储foriinrange(1,min(len(data_l),len(data_c))):weather_ldata_l[i][3]weather_cdata_c[i][3]ifweather_linweather_dict_luZhou:weather_dict_luZhou[weather_l]weather_dict_luZhou.get(weather_l)1else:weather_dict_luZhou[weather_l]1ifweather_cinweather_dict_chengdu:weather_dict_chengdu[weather_c]weather_dict_chengdu.get(weather_c)1else:weather_dict_chengdu[weather_c]1weather_list_luZhoulist(weather_dict_luZhou)weather_list_chengdulist(weather_dict_chengdu)value_l[]value_c[]# 获取所有的天气种类weather_listsorted(set(weather_list_luZhouweather_list_chengdu))# 获取每种天气的天数并将其对应的放入列表中没有的则用0进行替代方便条形图的绘制。foriinweather_list:ifiinweather_dict_luZhou:value_l.append(weather_dict_luZhou[i])else:value_l.append(0)ifiinweather_dict_chengdu:value_c.append(weather_dict_chengdu[i])else:value_c.append(0)# 绘制条形图进行对比plt.figure(dpi500,figsize(10,5))plt.title(泸州-成都各种天气情况对比)x1list(range(len(weather_list)))x[i0.4foriinx1]plt.bar(x1,value_l,width0.4,colorred,label泸州)plt.bar(x,value_c,width0.4,colororange,label成都)fora,binzip(x1,value_l):plt.text(a,b0.4,%.0f%b,hacenter,vabottom,fontsize7)fora,binzip(x,value_c):plt.text(a,b0.4,%.0f%b,hacenter,vabottom,fontsize7)plt.xticks(x1,weather_list)plt.ylabel(天数)plt.xlabel(天气)plt.xticks(rotation270)plt.legend()plt.savefig(泸州成都天气情况对比.png)plt.show()plt.close()注意文件保存路径该成你们自己的哦ok,爬取代码就到这接下来是图形化效果大致如下

相关文章:

【Python】实现爬虫(完整版),爬取天气数据并进行可视化分析

往期源码回顾: 【C】图书管理系统(完整板) 【C】实现图书管理系统(Qt C GUI界面版) 进入今天的正题: 1.实现需求: 从网上(随便一个网址,我爬的网址会在评论区告诉大家,dddd)获取某一年的历史天…...

**基于Python的高通量测序数据质量控制与可视化全流程实战**在生物信息学领域,高通

基于Python的高通量测序数据质量控制与可视化全流程实战 在生物信息学领域,高通量测序(HTS)技术已成为基因组研究的核心工具。然而,原始测序数据往往存在质量问题,如低质量碱基、污染序列或接头残留等,直接…...

JSONEditor-React:深度解析React生态中的JSON编辑器实现方案

JSONEditor-React:深度解析React生态中的JSON编辑器实现方案 【免费下载链接】jsoneditor-react react wrapper implementation for https://github.com/josdejong/jsoneditor 项目地址: https://gitcode.com/gh_mirrors/js/jsoneditor-react 在复杂的前端应…...

题解:洛谷 P3799 小 Y 拼木棒

本文分享的必刷题目是从蓝桥云课、洛谷、AcWing等知名刷题平台精心挑选而来,并结合各平台提供的算法标签和难度等级进行了系统分类。题目涵盖了从基础到进阶的多种算法和数据结构,旨在为不同阶段的编程学习者提供一条清晰、平稳的学习提升路径。 欢迎大家订阅我的专栏:算法…...

掌握IEC 61850通信协议:libiec61850开源库的完整入门指南

掌握IEC 61850通信协议:libiec61850开源库的完整入门指南 【免费下载链接】libiec61850 Official repository for libIEC61850, the open-source library for the IEC 61850 protocols 项目地址: https://gitcode.com/gh_mirrors/li/libiec61850 libiec61850…...

10大好用班组4m变更管理系统盘点!班组4m变更管理系统选型避坑指南

在制造业数字化转型的深水区,班组4m变更管理已成为保障生产连续性与质量稳定性的核心环节。面对日益复杂的生产环境,企业急需一套成熟的班组4m变更管理系统来应对人员、设备、物料及方法的变动风险。本文将为您带来2026年10大好用班组4m变更管理系统盘点…...

KNN、K-Means算法调参实战:如何用闵可夫斯基距离的p值提升模型效果?

KNN与K-Means算法调优:闵可夫斯基距离p值的实战艺术 距离度量是机器学习算法的隐形骨架,它决定了模型如何"看待"数据之间的关系。在K近邻(KNN)和K-Means这类基于距离的算法中,选择恰当的距离度量往往比调整其…...

Postman便携版终极指南:3分钟掌握免安装API测试神器

Postman便携版终极指南:3分钟掌握免安装API测试神器 【免费下载链接】postman-portable 🚀 Postman portable for Windows 项目地址: https://gitcode.com/gh_mirrors/po/postman-portable 你是不是经常需要在不同电脑上测试API接口?每…...

番茄小说下载器:构建个人离线数字图书馆的终极指南

番茄小说下载器:构建个人离线数字图书馆的终极指南 【免费下载链接】fanqienovel-downloader 下载番茄小说 项目地址: https://gitcode.com/gh_mirrors/fa/fanqienovel-downloader 在数字阅读时代,你是否曾因网络中断而无法继续阅读心爱的小说&am…...

PyUSB社区生态:如何参与开源贡献并获得技术支持

PyUSB社区生态:如何参与开源贡献并获得技术支持 【免费下载链接】pyusb Easy USB access for Python 项目地址: https://gitcode.com/gh_mirrors/py/pyusb PyUSB作为一款简化Python USB设备访问的开源库,凭借其跨平台特性和易用性,已成…...

从PCIE到SRIO:聊聊Xilinx 7系列GTX IP核里那些“看不见”的编码与对齐机制

从PCIE到SRIO:深入解析Xilinx 7系列GTX IP核的编码与对齐机制 在高速串行通信领域,Xilinx 7系列FPGA的GTX收发器IP核扮演着关键角色。当工程师面对PCIE或SRIO链路训练失败、误码率高等实际问题时,往往需要深入理解GTX内部的数据编码与对齐机制…...

如何快速实现Android底部导航栏:BottomNavigation完整指南

如何快速实现Android底部导航栏:BottomNavigation完整指南 【免费下载链接】BottomNavigation This Library helps users to use Bottom Navigation Bar (A new pattern from google) with ease and allows ton of customizations 项目地址: https://gitcode.com/…...

华为 2026 新品发布会亮点多:Pura 90 系列开启 2 亿智拍时代,多款产品齐亮相

开启 2 亿智拍新时代,HUAWEI Pura 90 系列引领移动影像再突破2026 年 4 月 20 日,华为 Pura 系列及全场景新品发布会在广州举行,HUAWEI Pura 90 系列等多款新品亮相,展现多领域创新实力,打造全场景智慧生活。全新 HUAW…...

从零基础出发,全面掌握SEO优化技巧以提升网站流量

在学习SEO的过程中,了解内容的重要性是基础。内容不仅要有吸引力,而且要与目标受众的需求紧密结合。首先,确保内容的相关性,能够有效解答用户的问题是关键。其次,利用关键词策略,使目标用户能够更容易找到相…...

WebPlotDigitizer终极指南:5步从图像中提取精确数据,科研效率提升300%

WebPlotDigitizer终极指南:5步从图像中提取精确数据,科研效率提升300% 【免费下载链接】WebPlotDigitizer Computer vision assisted tool to extract numerical data from plot images. 项目地址: https://gitcode.com/gh_mirrors/we/WebPlotDigitize…...

通义实验室推出 Fun-ASR1.5:方言工业级可用,多语言识别能力大幅提升!

通义实验室正式推出 Fun-ASR1.5 语音识别大模型,实现「方言工业级可用」,单模型覆盖 30 种语言及多种方言,典型方言场景字错误率大幅下降。多语言与方言覆盖Fun-ASR1.5 基于统一大模型架构,能无缝覆盖 30 种语言、汉语七大方言体系…...

低幻觉 Deepoc 数学大模型在半导体行业的应用探索

半导体产业技术迭代密集,研发流程深度依赖底层数学与工程计算。本文客观阐述低幻觉 Deepoc 数学大模型面向半导体全链路的技术支撑思路,不涉及营销或夸大表述,仅作为行业技术参考。 一、半导体研发流程的核心计算痛点 设计阶段多目标约束 芯片…...

CV炼丹师的效率神器:5分钟看懂CBAM注意力机制,轻松提升你的模型精度

CV炼丹师的效率神器:5分钟看懂CBAM注意力机制,轻松提升你的模型精度 深夜的实验室里,显示器泛着幽幽蓝光。你盯着训练曲线已经三个小时,准确率卡在89.7%纹丝不动。隔壁组的实习生刚把模型精度提升了2.3%,组长看你的眼神…...

终极WebPShop插件安装指南:让Photoshop完美支持WebP格式图片

终极WebPShop插件安装指南:让Photoshop完美支持WebP格式图片 【免费下载链接】WebPShop Photoshop plug-in for opening and saving WebP images 项目地址: https://gitcode.com/gh_mirrors/we/WebPShop 你是否曾经因为Photoshop无法直接处理WebP格式的图片而…...

GraalVM静态镜像启动内存飙高300%?别再盲目加--no-fallback!4类反射/资源/代理误配导致的隐式堆膨胀全解析

第一章:GraalVM静态镜像内存优化性能调优指南GraalVM 静态镜像(Native Image)通过提前编译(AOT)将 Java 应用转化为独立的原生可执行文件,显著降低启动延迟与运行时内存开销。但默认构建的镜像常存在堆内存…...

DDrawCompat终极指南:3步快速修复Windows老游戏兼容性问题 [特殊字符]

DDrawCompat终极指南:3步快速修复Windows老游戏兼容性问题 🎮 【免费下载链接】DDrawCompat DirectDraw and Direct3D 1-7 compatibility, performance and visual enhancements for Windows Vista, 7, 8, 10 and 11 项目地址: https://gitcode.com/gh…...

STM32CubeMX实战:5分钟为你的HAL库工程添加Modbus RTU主机功能(兼容FreeModbus从机)

STM32CubeMX实战:5分钟为HAL库工程集成Modbus RTU主机功能 Modbus RTU作为工业自动化领域最常用的通信协议之一,其简单可靠的特性使其在嵌入式系统中广泛应用。许多开发者已经熟悉使用FreeModbus实现从机功能,但当需要主动控制其他设备时&…...

KMS_VL_ALL_AIO深度解析:企业级Windows与Office批量激活完整指南

KMS_VL_ALL_AIO深度解析:企业级Windows与Office批量激活完整指南 【免费下载链接】KMS_VL_ALL_AIO Smart Activation Script 项目地址: https://gitcode.com/gh_mirrors/km/KMS_VL_ALL_AIO 在当今企业IT环境中,Windows和Office的批量许可证管理是…...

终极指南:如何让机器学习模型自动适应动态输入形状变化

终极指南:如何让机器学习模型自动适应动态输入形状变化 【免费下载链接】ivy Convert Machine Learning Code Between Frameworks 项目地址: https://gitcode.com/gh_mirrors/iv/ivy 在当今快速发展的机器学习领域,模型需要处理各种不同形状的输入…...

别再只用中值滤波了!一个更鲁棒的掩膜后处理流程:OpenCV形态学操作组合拳详解

超越中值滤波:构建鲁棒图像掩膜后处理的形态学操作体系 在计算机视觉领域,二值掩膜处理是目标检测、图像分割等任务中不可或缺的一环。传统的中值滤波虽然能有效去除椒盐噪声,但当面对复杂的噪声类型和边缘保持需求时,单一滤波手段…...

如何快速配置虚拟控制器:从零开始的完整vJoy教程

如何快速配置虚拟控制器:从零开始的完整vJoy教程 【免费下载链接】vJoy Virtual Joystick 项目地址: https://gitcode.com/gh_mirrors/vj/vJoy vJoy是一款功能强大的开源虚拟摇杆工具,能够帮助用户创建模拟游戏控制器,实现自定义输入映…...

终极网盘直链下载神器:八大平台一键获取真实下载地址的完整指南

终极网盘直链下载神器:八大平台一键获取真实下载地址的完整指南 【免费下载链接】Online-disk-direct-link-download-assistant 一个基于 JavaScript 的网盘文件下载地址获取工具。基于【网盘直链下载助手】修改 ,支持 百度网盘 / 阿里云盘 / 中国移动云…...

最速终端音乐体验:spotify-player极速配置与性能优化指南

最速终端音乐体验:spotify-player极速配置与性能优化指南 【免费下载链接】spotify-player A Spotify player in the terminal with full feature parity 项目地址: https://gitcode.com/GitHub_Trending/sp/spotify-player spotify-player是一款极速、易用且…...

CubiFS存储接口最佳实践:10个提升性能与可靠性的终极技巧

CubiFS存储接口最佳实践:10个提升性能与可靠性的终极技巧 【免费下载链接】cubefs cloud-native distributed storage 项目地址: https://gitcode.com/gh_mirrors/cu/cubefs CubiFS作为一款云原生分布式存储系统,提供了高性能、高可靠的存储解决方…...

3分钟轻松上手:RPG Maker加密文件解密实战指南

3分钟轻松上手:RPG Maker加密文件解密实战指南 【免费下载链接】RPGMakerDecrypter Tool for decrypting and extracting RPG Maker XP, VX and VX Ace encrypted archives and MV and MZ encrypted files. 项目地址: https://gitcode.com/gh_mirrors/rp/RPGMaker…...