爬天气的网站为2345天气王
URL:http://tianqi.2345.com/
历史天气:http://tianqi.2345.com/wea_history/58465.htm
58465是城市的ID
该项目主要是为了获取上海市的历史天气数据,字段包含日期、最低气温、最高气温、风向、风力、天气状况、空气质量指标值、空气质量等级和空气质量说明,所有数据一共包含2544天的记录。
下面就详细写出整个爬虫的代码:
# 导入第三方包
import requests #用于URL的请求和数据的获取
import time #用于时间的停顿
import random #用于随机数的生成
import pandas as pd #用于数据的导出
import re #用于正则表达式的使用
# 生成请求头
headers = {
'Accept': '*/*',
'Accept-Encoding': 'gzip, deflate',
'Accept-Language': 'zh-CN,zh;q=0.9',
'Connection': 'keep-alive',
'Cookie': 'widget_dz_id=54511; widget_dz_cityValues=,; timeerror=1; defaultCityID=54511; defaultCityName=%u5317%u4EAC; Hm_lvt_a3f2879f6b3620a363bec646b7a8bcdd=1516245199; Hm_lpvt_a3f2879f6b3620a363bec646b7a8bcdd=1516245199; addFavorite=clicked',
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3236.0 Safari/537.36'
}
# 生成所有需要抓取的链接
urls = []
for year in range(2011, 2018): #遍历2011年至2017年
for month in range(1, 13): #遍历1月份至12月份
#用于2011年~2016年的链接与2017年的链接存在一点点差异,需要分支处理
if year <= 2016:
urls.append('http://tianqi.2345.com/t/wea_history/js/58362_%s%s.js' % (year, month))
else:
#2017年的月份中,1~9月前面都有数字0,需要分支处理
if month < 10:
urls.append('http://tianqi.2345.com/t/wea_history/js/%s0%s/58362_%s0%s.js' % (year, month, year, month))
else:
urls.append('http://tianqi.2345.com/t/wea_history/js/%s%s/58362_%s%s.js' % (year, month, year, month))
# 循环并通过正则匹配获取相关数据
info = [] #构建空列表,用于所有天气数据的存储
for url in urls:
seconds = random.randint(3, 6) #每次循环,都随机生成一个3~6之间的整数
response = requests.get(url, headers=headers).text #发送url链接的请求,并返回响应数据
ymd = re.findall("ymd:'(.*?)',", response) #正则表达式获取日期数据
high = re.findall("bWendu:'(.*?)℃',", response) #正则表达式获取最高气温数据
low = re.findall("yWendu:'(.*?)℃',", response) #正则表达式获取最低气温数据
tianqi = re.findall("tianqi:'(.*?)',", response) #正则表达式获取天气状况数据
fengxiang = re.findall("fengxiang:'(.*?)',", response) #正则表达式获取风向数据
fengli = re.findall(",fengli:'(.*?)'", response) #正则表达式获取风力数据
aqi = re.findall("aqi:'(.*?)',", response) #正则表达式获取空气质量指标数据
aqiInfo = re.findall("aqiInfo:'(.*?)',", response) #正则表达式获取空气质量说明数据
aqiLevel = re.findall(",aqiLevel:'(.*?)'", response) #正则表达式获取空气质量水平数据
# 由于2011~2015没有空气质量相关的数据,故需要分开处理
if len(aqi) == 0:
aqi = None
aqiInfo = None
aqiLevel = None
info.append(pd.DataFrame(
{
'ymd': ymd, 'high': high, 'low': low, 'tianqi': tianqi, 'fengxiang': fengxiang, 'fengli': fengli,
'aqi': aqi, 'aqiInfo': aqiInfo, 'aqiLevel': aqiLevel}))
else:
info.append(pd.DataFrame(
{
'ymd': ymd, 'high': high, 'low': low, 'tianqi': tianqi, 'fengxiang': fengxiang, 'fengli': fengli,
'aqi': aqi, 'aqiInfo': aqiInfo, 'aqiLevel': aqiLevel}))
print(info)
time.sleep(seconds) #每循环一次,都随机停顿几秒
# 将存储的所有的天气数据进行合并,生成数据表格
weather = pd.concat(info)
# 数据导出
weather.to_csv('weather.csv', index=False, encoding='gbk') #如果不写encoding或写encoding='utf-8'出现乱码,就还可以写encoding = ‘utf-8-sig'
打印结果(部分):
[ 日期 最高气温 最低气温 天气状况 风向 风力 空气质量 空气质量说明 空气质量水平
0 2011-01-01 6 2 多云~雨夹雪 北风 4-5级 None None None
1 2011-01-02 6 2 多云 北风 4-5级 None None None
2 2011-01-03 7 2 多云~阴 东北风 3-4级 None None None
3 2011-01-04 6 1 小雨 北风 4-5级 None None None
4 2011-01-05 5 0 阴~多云 北风 4-5级 None None None
5 2011-01-06 6 0 多云 北风 3-4级 None None None
6 2011-01-07 7 2 多云 北风 4-5级 None None None
7 2011-01-08 7 4 多云~阴 东北风 3-4级 None None None
8 2011-01-09 7 0 阴~多云 北风 3-4级 None None None
9 2011-01-10 5 0 多云~阴 东北风~东风 4-5级~3-4级 None None None
10 2011-01-11 6 2 多云 东风 3-4级 None None None
11 2011-01-12 7 3 多云~阴 东北风 3-4级 None None None
12 2011-01-13 6 0 阴~多云 东北风 4-5级 None None None
13 2011-01-14 5 -2 多云 北风 4-5级 None None None
14 2011-01-15 3 -1 多云 北风~东北风 4-5级 None None None
15 2011-01-16 4 0 多云~阴 东北风 4-5级~3-4级 None None None
16 2011-01-26 7 2 阴 东北风 3-4级 None None None
17 2011-01-29 4 -2 晴~多云 北风 4-5级 None None None
18 2011-01-30 4 -3 多云~晴 西北风 4-5级~3-4级 None None None
19 2011-01-31 7 -2 晴 西北风 微风~3-4级 None None None]
[ 日期 最高气温 最低气温 天气状况 风向 风力 空气质量 空气质量说明 空气质量水平
0 2011-01-01 6 2 多云~雨夹雪 北风 4-5级 None None None
1 2011-01-02 6 2 多云 北风 4-5级 None None None
2 2011-01-03 7 2 多云~阴 东北风 3-4级 None None None
3 2011-01-04 6 1 小雨 北风 4-5级 None None None
4 2011-01-05 5 0 阴~多云 北风 4-5级 None None None
5 2011-01-06 6 0 多云 北风 3-4级 None None None
6 2011-01-07 7 2 多云 北风 4-5级 None None None
7 2011-01-08 7 4 多云~阴 东北风 3-4级 None None None
8 2011-01-09 7 0 阴~多云 北风 3-4级 None None None
9 2011-01-10 5 0 多云~阴 东北风~东风 4-5级~3-4级 None None None
10 2011-01-11 6 2 多云 东风 3-4级 None None None
11 2011-01-12 7 3 多云~阴 东北风 3-4级 None None None
12 2011-01-13 6 0 阴~多云 东北风 4-5级 None None None
13 2011-01-14 5 -2 多云 北风 4-5级 None None None
14 2011-01-15 3 -1 多云 北风~东北风 4-5级 None None None
15 2011-01-16 4 0 多云~阴 东北风 4-5级~3-4级 None None None
16 2011-01-26 7 2 阴 东北风 3-4级 None None None
17 2011-01-29 4 -2 晴~多云 北风 4-5级 None None None
18 2011-01-30 4 -3 多云~晴 西北风 4-5级~3-4级 None None None
19 2011-01-31 7 -2 晴 西北风 微风~3-4级 None None None, 日期 最高气温 最低气温 天气状况 风向 风力 空气质量 空气质量说明 空气质量水平
0 2011-02-01 9 1 多云 西南风 3-4级 None None None
1 2011-02-02 11 2 晴 西南风 微风 None None None
2 2011-02-03 13 3 晴~多云 南风 微风~3-4级 None None None
3 2011-02-04 14 4 晴 南风~北风 3-4级 None None None
4 2011-02-05 15 5 晴~多云 北风~东南风 3-4级 None None None
5 2011-02-06 16 5 多云~晴 南风~北风 3-4级 None None None
6 2011-02-07 15 10 多云~阴 东风~东南风 3-4级 None None None
7 2011-02-08 19 6 多云 东北风 3-4级 None None None
8 2011-02-09 9 4 阴~小雨 北风 4-5级 None None None
9 2011-02-10 5 1 小雨~雨夹雪 东北风 4-5级 None None None
10 2011-02-11 6 -1 多云 北风 4-5级 None None None
11 2011-02-12 5 0 多云~阴 北风~东北风 4-5级~3-4级 None None None
12 2011-02-13 4 0 阴 东北风 3-4级 None None None
13 2011-02-14 4 -1 多云 北风 4-5级~3-4级 None None None
14 2011-02-15 6 3 晴~多云 东北风~东风 3-4级 None None None
15 2011-02-16 9 5 小雨 东南风~东北风 3-4级 None None None
16 2011-02-17 5 3 阴~多云 东北风 4-5级 None None None
17 2011-02-18 6 2 多云~阴 北风~东北风 4-5级~3-4级 None None None
18 2011-02-19 8 3 阴~多云 北风~东北风 3-4级 None None None
19 2011-02-20 11 2 多云~晴 东北风 3-4级 None None None
20 2011-02-21 12 5 晴 北风~东北风 3-4级 None None None
21 2011-02-22 13 7 晴~多云 东风~东南风 3-4级 None None None
22 2011-02-23 16 8 晴 东南风 3-4级 None None None
23 2011-02-24 18 9 晴~多云 东南风~东风 3-4级 None None None
24 2011-02-25 13 9 多云~阴 东北风~东南风 4-5级 None None None
25 2011-02-26 15 11 小雨~阴 东南风 3-4级~4-5级 None None None
26 2011-02-27 20 7 多云~阵雨 西北风~北风 3-4级~4-5级 None None None
27 2011-02-28 7 4 小雨 北风 4-5级 None None None]
[ 日期 最高气温 最低气温 天气状况 风向 风力 空气质量 空气质量说明 空气质量水平
0 2011-01-01 6 2 多云~雨夹雪 北风 4-5级 None None None
1 2011-01-02 6 2 多云 北风 4-5级 None None None
2 2011-01-03 7 2 多云~阴 东北风 3-4级 None None None
3 2011-01-04 6 1 小雨 北风 4-5级 None None None
4 2011-01-05 5 0 阴~多云 北风 4-5级 None None None
5 2011-01-06 6 0 多云 北风 3-4级 None None None
6 2011-01-07 7 2 多云 北风 4-5级 None None None
7 2011-01-08 7 4 多云~阴 东北风 3-4级 None None None
8 2011-01-09 7 0 阴~多云 北风 3-4级 None None None
9 2011-01-10 5 0 多云~阴 东北风~东风 4-5级~3-4级 None None None
10 2011-01-11 6 2 多云 东风 3-4级 None None None
11 2011-01-12 7 3 多云~阴 东北风 3-4级 None None None
12 2011-01-13 6 0 阴~多云 东北风 4-5级 None None None
13 2011-01-14 5 -2 多云 北风 4-5级 None None None
14 2011-01-15 3 -1 多云 北风~东北风 4-5级 None None None
15 2011-01-16 4 0 多云~阴 东北风 4-5级~3-4级 None None None
16 2011-01-26 7 2 阴 东北风 3-4级 None None None
17 2011-01-29 4 -2 晴~多云 北风 4-5级 None None None
18 2011-01-30 4 -3 多云~晴 西北风 4-5级~3-4级 None None None
19 2011-01-31 7 -2 晴 西北风 微风~3-4级 None None None, 日期 最高气温 最低气温 天气状况 风向 风力 空气质量 空气质量说明 空气质量水平
0 2011-02-01 9 1 多云 西南风 3-4级 None None None
1 2011-02-02 11 2 晴 西南风 微风 None None None
2 2011-02-03 13 3 晴~多云 南风 微风~3-4级 None None None
3 2011-02-04 14 4 晴 南风~北风 3-4级 None None None
4 2011-02-05 15 5 晴~多云 北风~东南风 3-4级 None None None
5 2011-02-06 16 5 多云~晴 南风~北风 3-4级 None None None
6 2011-02-07 15 10 多云~阴 东风~东南风 3-4级 None None None
7 2011-02-08 19 6 多云 东北风 3-4级 None None None
8 2011-02-09 9 4 阴~小雨 北风 4-5级 None None None
9 2011-02-10 5 1 小雨~雨夹雪 东北风 4-5级 None None None
10 2011-02-11 6 -1 多云 北风 4-5级 None None None
11 2011-02-12 5 0 多云~阴 北风~东北风 4-5级~3-4级 None None None
12 2011-02-13 4 0 阴 东北风 3-4级 None None None
13 2011-02-14 4 -1 多云 北风 4-5级~3-4级 None None None
14 2011-02-15 6 3 晴~多云 东北风~东风 3-4级 None None None
15 2011-02-16 9 5 小雨 东南风~东北风 3-4级 None None None
16 2011-02-17 5 3 阴~多云 东北风 4-5级 None None None
17 2011-02-18 6 2 多云~阴 北风~东北风 4-5级~3-4级 None None None
18 2011-02-19 8 3 阴~多云 北风~东北风 3-4级 None None None
19 2011-02-20 11 2 多云~晴 东北风 3-4级 None None None
20 2011-02-21 12 5 晴 北风~东北风 3-4级 None None None
21 2011-02-22 13 7 晴~多云 东风~东南风 3-4级 None None None
22 2011-02-23 16 8 晴 东南风 3-4级 None None None
23 2011-02-24 18 9 晴~多云 东南风~东风 3-4级 None None None
24 2011-02-25 13 9 多云~阴 东北风~东南风 4-5级 None None None
25 2011-02-26 15 11 小雨~阴 东南风 3-4级~4-5级 None None None
26 2011-02-27 20 7 多云~阵雨 西北风~北风 3-4级~4-5级 None None None
27 2011-02-28 7 4 小雨 北风 4-5级 None None None, 日期 最高气温 最低气温 天气状况 风向 风力 空气质量 空气质量说明 空气质量水平
0 2011-03-01 6 0 阴~多云 北风 4-5级~3-4级 None None None
1 2011-03-02 8 1 晴 北风 3-4级 None None None
2 2011-03-03 9 1 阴~多云 北风 3-4级 None None None
3 2011-03-04 9 4 晴~多云 东北风~东南风 3-4级 None None None
4 2011-03-05 13 7 多云~小雨 东南风~南风 4-5级~3-4级 None None None
5 2011-03-06 10 4 小雨~阴 北风 3-4级~4-5级 None None None
6 2011-03-07 10 2 晴 北风 3-4级 None None None
7 2011-03-08 15 5 晴~多云 西南风 3-4级 None None None
8 2011-03-09 14 3 多云 北风 4-5级~3-4级 None None None
9 2011-03-10 13 6 晴~多云 东南风 3-4级 None None None
10 2011-03-11 17 9 晴~多云 南风 3-4级~4-5级 None None None
11 2011-03-12 17 10 多云 南风~东南风 4-5级 None None None
12 2011-03-13 18 8 多云~阵雨 东南风 4-5级~3-4级 None None None
13 2011-03-14 14 4 小雨 北风 4-5级 None None None
14 2011-03-15 9 2 阴~多云 北风 4-5级 None None None
15 2011-03-16 12 4 多云~晴 西北风~东北风 3-4级 None None None
16 2011-03-17 16 6 晴~多云 东南风~南风 3-4级~4-5级 None None None
17 2011-03-18 15 9 阴 东南风~南风 4-5级~3-4级 None None None
18 2011-03-19 16 12 阵雨 南风 4-5级 None None None
19 2011-03-20 16 7 阵雨~中雨 东北风 4-5级 None None None
20 2011-03-21 8 5 中雨~小雨 北风 4-5级 None None None
21 2011-03-22 9 3 小雨~多云 北风 4-5级~3-4级 None None None
22 2011-03-23 13 6 晴~多云 东风 3-4级 None None None
23 2011-03-24 16 5 多云 南风~北风 3-4级~4-5级 None None None
24 2011-03-25 13 5 晴~多云 东北风~东南风 3-4级 None None None
25 2011-03-26 15 7 晴~多云 西南风~南风 3-4级 None None None
26 2011-03-27 17 8 晴~多云 南风 3-4级 None None None
27 2011-03-28 19 9 晴~多云 西南风~北风 3-4级~4-5级 None None None
28 2011-03-29 14 6 多云~晴 东北风 4-5级~3-4级 None None None
29 2011-03-30 16 7 晴~多云 南风~东南风 3-4级~4-5级 None None None
30 2011-03-31 19 9 晴~多云 东南风 3-4级 None None None]
代码中的难点知识:
pd.read_csv() 、to_csv() 之 常用参数
pandas数据合并与重塑(pd.concat篇)