利用爬虫获取某地1月份的天气情况(最高温度和最低温度),并作出相关的曲线图
实现思路:
1.首先,利用requests模块对url发送请求
# 定义url和请求头
url = 'http://tianqihoubao.com/lishi/xian/month/202101.html'
headers = {
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36 Edg/88.0.705.56'
}
# 发送请求
response = requests.get(url,headers=headers)
content = response.content.decode('gbk')
注意这里的解码方式只能用gbk,用utf-8解码会报错
2.利用beautifulsoup和正则表达式提取温度数据
# 实例化BeautifulSoup对象
soup = BeautifulSoup(content,'lxml')
trs = soup.find_all('tr')
# 提取数据
HighestTemperature_list = []
LowestTemperature_list = []
for tr in trs:
# 获取气温
temperature_high = tr.find_all('td')[2:3]
Temperature_data = re.findall('(.*?)℃',str(temperature_high[0]))
if Temperature_data == []:
continue
else:
HighestTemperature_list.append(int(Temperature_data[0]))
LowestTemperature_list.append(int(Temperature_data[1]))
这样的话,就会获得两个列表HighestTemperature_list和LowTemperature_list两个列表,分别存储对应的最高气温和最低气温
3.对获得的数据进行绘图操作,笔者用的是Matplotlib绘制折线图
1>导入相关的数据和模块
# 导入相关的模块和数据
from 获取西安1月份天气数据 import HighestTemperature_list
from 获取西安1月份天气数据 import LowestTemperature_list
from matplotlib import pyplot as plt
from matplotlib import font_manager
注意:在一个.py文件中引用另一个文件的变量可以直接使用from……import……,类似于模块的导入
2>初始化数据
# 气温数据
x = range(1,32)
y = range(-15,20)
y_high = HighestTemperature_list
y_low = LowestTemperature_list
3>绘制图形
# 设定图形大小
plt.figure(figsize=(20,8),dpi=100)
# 绘制图形
plt.plot(x,y_high,label='最高气温')
plt.plot(x,y_low,label='最低气温')
4>添加图例,区分最高气温和最低气温
# 添加图例
plt.legend(prop=my_font)
这里的my_font是自己定义的,为了解决中文的乱码问题
my_font = font_manager.FontProperties(fname="G:/letters/YaHei.Consolas.1.11b.ttf")
5>添加描述信息
# 添加描述信息
plt.xlabel('日期',fontproperties=my_font)
plt.ylabel('温度',fontproperties=my_font)
plt.title('西安1月份气温走势图',fontproperties=my_font)
6>调整x轴刻度
#调整x轴刻度
_xticks_labels = ["1月{}日".format(i) for i in x]
_yticks_labels = ["{}℃".format(m) for m in y]
plt.xticks(list(x)[::1],_xticks_labels[::1],rotation=45,fontproperties = my_font)
plt.yticks(y[::1],_yticks_labels[::1],fontproperties = my_font)
7>绘制网格,展示图片
# 绘制网格
plt.grid(alpha = 0.5)
# 展示图片
plt.show()
附上源码
## 这份源码即 获取西安1月份天气数据
## 导入相关模块:requests、bs、re
import requests
from bs4 import BeautifulSoup
import re
# 定义url和请求头
url = 'http://tianqihoubao.com/lishi/baoying/month/202101.html'
headers = {
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36 Edg/88.0.705.56'
}
# 发送请求
response = requests.get(url,headers=headers)
content = response.content.decode('gbk')
# 实例化BeautifulSoup对象
soup = BeautifulSoup(content,'lxml')
trs = soup.find_all('tr')
# 提取数据
date_list = []
HighestTemperature_list = []
LowestTemperature_list = []
for tr in trs:
# 获取气温
temperature_high = tr.find_all('td')[2:3]
Temperature_data = re.findall('(.*?)℃',str(temperature_high[0]))
if Temperature_data == []:
continue
else:
HighestTemperature_list.append(int(Temperature_data[0]))
LowestTemperature_list.append(int(Temperature_data[1]))
print(HighestTemperature_list)
print(LowestTemperature_list)
# 导入相关的模块和数据
from 获取西安1月份天气数据 import HighestTemperature_list
from 获取西安1月份天气数据 import LowestTemperature_list
from matplotlib import pyplot as plt
from matplotlib import font_manager
my_font = font_manager.FontProperties(fname="G:/letters/YaHei.Consolas.1.11b.ttf")
# 气温数据
x = range(1,32)
y = range(-15,20)
y_high = HighestTemperature_list
y_low = LowestTemperature_list
# 设定图形大小
plt.figure(figsize=(20,8),dpi=100)
plt.plot(x,y_high,label='最高气温')
plt.plot(x,y_low,label='最低气温')
# 添加图例
plt.legend(prop=my_font)
# 添加描述信息
plt.xlabel('日期',fontproperties=my_font)
plt.ylabel('温度',fontproperties=my_font)
plt.title('西安1月份气温走势图',fontproperties=my_font)
#调整x轴刻度
_xticks_labels = ["1月{}日".format(i) for i in x]
_yticks_labels = ["{}℃".format(m) for m in y]
plt.xticks(list(x)[::1],_xticks_labels[::1],rotation=45,fontproperties = my_font)
plt.yticks(y[::1],_yticks_labels[::1],fontproperties = my_font)
# 绘制网格
plt.grid(alpha = 0.5)
# 展示图片
plt.show()
笔者最近在学习爬虫,主要学习了requests库和BeautifulSoup库的使用,第一次做了一个很小很小的项目,不足之处还请多多指教,有什么问题可以私信我,共同学习。关于爬虫和数据分析,以后还会进一步更新于完善,希望大家喜欢!