当前位置:网站首页>七月到底有多热?通过爬虫爬取当月温度信息,并使用matplotlib绘制温度折线图
七月到底有多热?通过爬虫爬取当月温度信息,并使用matplotlib绘制温度折线图
2022-07-23 07:19:00 【仙草哥哥】
需求分析
最近,天气实在是太热了,感觉整个人都陷入了宕机状态,完全干不了什么事情了。就拿我自己来说吧,最近文章更新明显变少了,甚至就现在都是顶着高温的天气,被迫营业的
这个时候呢,我也非常好奇,现在的天气到底有多热呢?到底哪个地方会更热一些呢?其实吧,这个想法实现并不困难,只要通过爬虫程序,爬取天气信息就可以了
而且,巧的是,爬取天气信息的文章,我早就做过了,比如说通过爬虫爬取天气信息,或者说,通过爬虫爬取高温预警信息,但是呢,问题在于,之前爬取的都是文字,很不直观,俗话说,只有能够将数据绘制成图形,我们才能够一眼就能看出直观的数据信息。所以说呢,这次,我打算不仅要爬取天气信息的状况,而且要通过matplotlib进行绘图
实现分析
爬取天气信息本身不是很困难,但是这期间还是会遇到一个主要的问题,那就是,如何选择所在地区呢?在之前的实现中,我采用的方法是根据ip自动选择地区,但是对于本次的需求来说,这样做并不合适。原因在于,关于天气信息的状况,我更大的可能只希望了解本地的天气状况,但是对于天气温度的变化,我可能也希望关注一下其他地区的情况,因此应该允许自由的选择地区
那么,到底如何选择地区呢?可能的一个想法是,“小孩子才做选择题,我全都要!”,这个虽然听起来也很不错,但是呢,需要绘制的图太多,没什么必要
因此,最终我决定了通过输入拼音的方式,让用户自己选择地区。当然啦,这个功能可能也不是很好,比如说并非所有的地区都能被正确的选择到,但是大体上能够满足我们的需求了
然后,另外的一个问题就是,如何绘图呢?这个关于matplotlib的操作也不是很困难,而且matplotlib也是python中使用历史最久,知名度最高的可视化绘图库了,应该有很多小伙伴对其已经有了很多的了解,那么自不必说,直接看实现好了
完整代码展示
import requests
import time
from urllib.parse import quote
from parsel import Selector
from base64 import b64decode
from matplotlib import pyplot as plt
t = time.localtime(time.time())
month = str(t.tm_year) + str(t.tm_mon).rjust(2, "0")
position = input("输入你要查看的地区(使用拼音):")
base_url = b64decode("aHR0cHM6Ly9tLnRpYW5xaS5jb20vbGlzaGkv").decode()
url = base_url + position + "/" + month + ".html"
lua = """
function main(splash)
splash:go("%s")
splash:wait(1)
local al = splash:select(".show1")
al:mouse_click()
splash:wait(1)
return splash:html()
end
""" % url
url = "http://localhost:8050/execute?lua_source=" + quote(lua)
r = requests.get(url)
s = Selector(r.text)
position = s.xpath("//div[@class='history_w2']/h3/text()").re_first("(.*?)\d")
if not position:
raise ValueError("输入的地区有误")
item_list = list()
high_set = set()
low_set = set()
a_list = s.xpath("//a[@class='listto']")
for a in a_list:
date = a.xpath("./div[1]/span[1]/text()").get()
high = a.xpath("./div[2]/text()").re_first("\d+")
low = a.xpath("./div[3]/text()").re_first("\d+")
item_list.append({
"时间": date,
"最高温度": int(high),
"最低温度": int(low)
})
high_set.add(int(high))
low_set.add(int(low))
plt.figure(figsize=(20, 8), dpi=320)
max_t = max(high_set)
min_t = min(low_set)
x = range(len(item_list))
y1 = [i["最高温度"] for i in item_list]
y2 = [i["最低温度"] for i in item_list]
x_ticks = [i["时间"] for i in item_list]
y_show = range(min_t, max_t + 1, 2)
y_ticks = [str(i) + "度" for i in y_show]
plt.xticks(x, x_ticks, rotation=45)
plt.yticks(y_show, y_ticks)
plt.title(position + "本月温度变化情况")
plt.plot(x, y1, color="red", label="最高温度变化")
plt.plot(x, y2, color="blue", label="最低温度变化")
plt.legend(loc=1)
plt.savefig(position + ".png")
然后,我们就可以顺利的得到绘制好的图片了,比比看,到底哪里更热呢?


由于历史天气数据的提供并非100%准确,所以如果出现了明显离谱的情况,比如说7月的北京最低气温只有4度,那么属于意外情况,并非是绘图出现了问题
对于从未使用过matplotlib的用户,我还要格外提醒一句,matplotlib默认并不支持中文字符集,需要进行一些小小的设置。所以,如果你从未使用过matplotlib,但是现在希望运行这个代码的话,不可以直接运行,需要先去搜索研究一下,在你的机器上,如何完成中文的设置
边栏推荐
- PHP获取当前时间戳三位毫秒 - 毫秒时间戳
- Okaleido tiger NFT即将登录Binance NFT平台,你期待吗?
- [graphics] ASTC texture compression format
- keepalived双机热备
- C language insert sort (direct insert sort)
- 基于OpenCV实现对图片及视频中感兴趣区域颜色识别
- Wechat applet -- dynamically set the navigation bar color
- 一篇文章教会你使用kubernetes的基本使用
- ROS中引用和输出消息类型
- Shell operator, $((expression)) "or" $[expression], expr method, condition judgment, test condition, [condition], comparison between two integers, judgment according to file permission, judgment accor
猜你喜欢

Kept dual machine hot standby

解决MySQL向表中增加数据插入中文乱码问题

Okaleido tiger NFT即将登录Binance NFT平台,你期待吗?

浅谈Anroid设备的CPU类型以及so文件的放置目录

Special topic of MIMO Radar (0) - General Chapter

Point target simulation of SAR imaging (III) -- Analysis of simulation results

Error running ‘XXX‘: Command line is too long. Shorten command line for AudioTest or also ...

Why choose AMD epyc for cloud solutions?

How to deal with the new development mode when doing testing?

【深入浅出玩转FPGA学习10------简单的Testbench设计】
随机推荐
数据库系统原理与应用教程(038)—— MySQL 的索引(四):使用 EXPLAIN 命令分析索引
决策树详解
SparkSQL设计及入门,220722,
高中语文教资考试大纲
LeetCode_51_N皇后
PHP connecting to SQL Server
keepalived双机热备
Typora modify table width
"Computing beast" Inspur nf5468a5 GPU server open trial free application
SeekTiger的Okaleido有大动作,生态通证STI会借此爆发?
Kotlin - Job 任务/取消
【MUDUO】EPOLLPOLLER事件分发器
Shell运算符、$((运算式))” 或 “$[运算式]、expr方法、条件判断、test condition、[ condition ]、两个整数之间比较、按照文件权限进行判断、按照文件类型进行判断
养老机构智能视频监控解决方案,用新技术助力养老院智慧监管
概率沉思录:2.The quantitative rules
同花顺开户风险性大吗,安全吗?
Introduction to radar part vii 3 formation and processing of SAR image
-20: +usecgroupmemorylimitforheap failed to create virtual machine problem
Ti single chip millimeter wave radar 1642 code walk through (0) - General Outline
数据库系统原理与应用教程(039)—— MySQL 查询(一):SELECT 命令的语法分析