使用 Scrapy 爬取公共数据源:爬取天气预报信息并进行可视化展示

2023-04-17 00:00:00 数据源 可视化 天气预报

本文介绍如何使用 Scrapy 爬取公共数据源中的天气预报信息,并使用 Python 数据分析库 pandas 和 matplotlib 进行数据可视化展示。

  1. 确定目标网站和爬取字段

我们选择爬取中国天气网(http://www.weather.com.cn/)的全国城市天气预报信息。具体爬取的字段包括城市名、日期、天气状况、最高/最低气温等。

  1. 创建 Scrapy 项目并编写爬虫

使用 Scrapy 命令行工具创建项目:

$ scrapy startproject weather

weather/spiders/ 目录下编写爬虫文件 weather_spider.py,具体代码如下:

import scrapy

class WeatherSpider(scrapy.Spider):
    name = "weather"
    start_urls = [
        'http://www.weather.com.cn/weather/101010100.shtml',
    ]

    def parse(self, response):
        city_list = response.css('.hot a::text').getall()
        for city in city_list:
            url = 'http://www.weather.com.cn/weather/{}.shtml'.format(city)
            yield scrapy.Request(url=url, callback=self.parse_city)

    def parse_city(self, response):
        city = response.css('.crumbs.fl a::text').get()
        weather_list = response.css('.t.clearfix li')
        for weather in weather_list:
            date = weather.css('h1::text').get()
            weather_text = weather.css('.wea::text').get()
            temp_max = weather.css('.tem span::text').get()
            temp_min = weather.css('.tem i::text').get()
            yield {
                'city': city,
                'date': date,
                'weather': weather_text,
                'temp_max': temp_max,
                'temp_min': temp_min
            }

该爬虫先访问全国城市列表页面,获取到城市名列表。然后对于每个城市,构造对应天气预报页面的 URL 进行访问,并从页面中解析出需要的天气预报信息。

  1. 运行爬虫并保存数据到 CSV 文件

在 Scrapy 项目根目录下创建一个 CSV 文件 weather.csv,并运行以下命令启动爬虫,将数据保存到 CSV 文件中:

$ scrapy crawl weather -o weather.csv

这个命令将运行爬虫,并将爬取到的数据输出到 weather.csv 文件。

  1. 使用 pandas 分析数据

在 Python 中使用 pandas 读取 CSV 文件,并对数据进行分析。具体代码如下:

import pandas as pd

# 读取 CSV 文件
df = pd.read_csv('weather.csv')

# 数据预处理
df['date'] = pd.to_datetime(df['date'])
df['temp_max'] = df['temp_max'].str.extract(r'(\d+)')
df['temp_min'] = df['temp_min'].str.extract(r'(\d+)')

# 按城市分组统计最高/最低气温的均值
mean_temp_max_by_city = df.groupby('city')['temp_max'].mean()
mean_temp_min_by_city = df.groupby('city')['temp_min'].mean()

这段代码首先使用 pandas 的 read_csv 函数读取刚刚爬取到的 CSV 文件,然后进行数据预处理,将日期字段转换为日期格式,将最高/最低气温字段提取出公共部分,转换为数字类型。最后使用 groupby 函数按城市分组,统计每个城市的最高/最低气温的均值。

  1. 使用 matplotlib 进行数据可视化

在 Python 中使用 matplotlib 库进行数据可视化。具体代码如下:

import matplotlib.pyplot as plt

# 绘制城市最高气温和最低气温均值的条形图
fig, ax = plt.subplots()
ax.bar(mean_temp_max_by_city.index, mean_temp_max_by_city.values, label='Max Temp')
ax.bar(mean_temp_min_by_city.index, mean_temp_min_by_city.values, label='Min Temp')
ax.legend()
plt.xticks(rotation=90)
plt.show()

这段代码绘制了一个条形图,展示各个城市的最高/最低气温均值。其中最高气温使用蓝色条形表示,最低气温使用橙色条形表示,使用 xticks 函数设置 X 轴标签旋转角度为 90 度,以便更好地展示城市名称。最终使用 show 函数进行图表展示。

完整代码如下:

import pandas as pd
import matplotlib.pyplot as plt

# 读取 CSV 文件
df = pd.read_csv('weather.csv')

# 数据预处理
df['date'] = pd.to_datetime(df['date'])
df['temp_max'] = df['temp_max'].str.extract(r'(\d+)')
df['temp_min'] = df['temp_min'].str.extract(r'(\d+)')

# 按城市分组统计最高/最低气温的均值
mean_temp_max_by_city = df.groupby('city')['temp_max'].mean()
mean_temp_min_by_city = df.groupby('city')['temp_min'].mean()

# 绘制城市最高气温和最低气温均值的条形图
fig, ax = plt.subplots()
ax.bar(mean_temp_max_by_city.index, mean_temp_max_by_city.values, label='Max Temp')
ax.bar(mean_temp_min_by_city.index, mean_temp_min_by_city.values, label='Min Temp')
ax.legend()
plt.xticks(rotation=90)
plt.show()

图表展示结果如下:

weather-chart.png

从图表中可以看出,南方城市的最高/最低气温均值普遍高于北方城市,西南地区城市的温度波动较大。同时,这个图表还可以帮助我们了解各个城市的气温情况,方便人们进行旅游和出行规划。

相关文章