使用 Scrapy 爬取公共数据源:爬取天气预报信息并进行可视化展示
本文介绍如何使用 Scrapy 爬取公共数据源中的天气预报信息,并使用 Python 数据分析库 pandas 和 matplotlib 进行数据可视化展示。
- 确定目标网站和爬取字段
我们选择爬取中国天气网(http://www.weather.com.cn/)的全国城市天气预报信息。具体爬取的字段包括城市名、日期、天气状况、最高/最低气温等。
- 创建 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 进行访问,并从页面中解析出需要的天气预报信息。
- 运行爬虫并保存数据到 CSV 文件
在 Scrapy 项目根目录下创建一个 CSV 文件 weather.csv
,并运行以下命令启动爬虫,将数据保存到 CSV 文件中:
$ scrapy crawl weather -o weather.csv
这个命令将运行爬虫,并将爬取到的数据输出到 weather.csv
文件。
- 使用 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
函数按城市分组,统计每个城市的最高/最低气温的均值。
- 使用 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()
图表展示结果如下:
从图表中可以看出,南方城市的最高/最低气温均值普遍高于北方城市,西南地区城市的温度波动较大。同时,这个图表还可以帮助我们了解各个城市的气温情况,方便人们进行旅游和出行规划。
相关文章