爬虫与数据分析(一)

利用爬虫获取某地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()


最后的图片展示:
爬虫与数据分析(一)_第1张图片

笔者最近在学习爬虫,主要学习了requests库和BeautifulSoup库的使用,第一次做了一个很小很小的项目,不足之处还请多多指教,有什么问题可以私信我,共同学习。关于爬虫和数据分析,以后还会进一步更新于完善,希望大家喜欢!

你可能感兴趣的:(爬虫与数据分析,python,数据分析,爬虫)