Python爬虫项目实例——爬取上海市历史天气数据

爬天气的网站为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-5None   None   None
1   2011-01-02    6    2      多云      北风       4-5None   None   None
2   2011-01-03    7    2    多云~阴     东北风       3-4None   None   None
3   2011-01-04    6    1      小雨      北风       4-5None   None   None
4   2011-01-05    5    0~多云      北风       4-5None   None   None
5   2011-01-06    6    0      多云      北风       3-4None   None   None
6   2011-01-07    7    2      多云      北风       4-5None   None   None
7   2011-01-08    7    4    多云~阴     东北风       3-4None   None   None
8   2011-01-09    7    0~多云      北风       3-4None   None   None
9   2011-01-10    5    0    多云~阴  东北风~东风  4-5~3-4None   None   None
10  2011-01-11    6    2      多云      东风       3-4None   None   None
11  2011-01-12    7    3    多云~阴     东北风       3-4None   None   None
12  2011-01-13    6    0~多云     东北风       4-5None   None   None
13  2011-01-14    5   -2      多云      北风       4-5None   None   None
14  2011-01-15    3   -1      多云  北风~东北风       4-5None   None   None
15  2011-01-16    4    0    多云~阴     东北风  4-5~3-4None   None   None
16  2011-01-26    7    2       阴     东北风       3-4None   None   None
17  2011-01-29    4   -2~多云      北风       4-5None   None   None
18  2011-01-30    4   -3    多云~晴     西北风  4-5~3-4None   None   None
19  2011-01-31    7   -2       晴     西北风    微风~3-4None   None   None]
[            日期 最高气温 最低气温    天气状况      风向         风力  空气质量 空气质量说明 空气质量水平
0   2011-01-01    6    2  多云~雨夹雪      北风       4-5None   None   None
1   2011-01-02    6    2      多云      北风       4-5None   None   None
2   2011-01-03    7    2    多云~阴     东北风       3-4None   None   None
3   2011-01-04    6    1      小雨      北风       4-5None   None   None
4   2011-01-05    5    0~多云      北风       4-5None   None   None
5   2011-01-06    6    0      多云      北风       3-4None   None   None
6   2011-01-07    7    2      多云      北风       4-5None   None   None
7   2011-01-08    7    4    多云~阴     东北风       3-4None   None   None
8   2011-01-09    7    0~多云      北风       3-4None   None   None
9   2011-01-10    5    0    多云~阴  东北风~东风  4-5~3-4None   None   None
10  2011-01-11    6    2      多云      东风       3-4None   None   None
11  2011-01-12    7    3    多云~阴     东北风       3-4None   None   None
12  2011-01-13    6    0~多云     东北风       4-5None   None   None
13  2011-01-14    5   -2      多云      北风       4-5None   None   None
14  2011-01-15    3   -1      多云  北风~东北风       4-5None   None   None
15  2011-01-16    4    0    多云~阴     东北风  4-5~3-4None   None   None
16  2011-01-26    7    2       阴     东北风       3-4None   None   None
17  2011-01-29    4   -2~多云      北风       4-5None   None   None
18  2011-01-30    4   -3    多云~晴     西北风  4-5~3-4None   None   None
19  2011-01-31    7   -2       晴     西北风    微风~3-4None   None   None,             日期 最高气温 最低气温    天气状况       风向         风力  空气质量 空气质量说明 空气质量水平
0   2011-02-01    9    1      多云      西南风       3-4None   None   None
1   2011-02-02   11    2       晴      西南风         微风  None   None   None
2   2011-02-03   13    3~多云       南风    微风~3-4None   None   None
3   2011-02-04   14    4       晴    南风~北风       3-4None   None   None
4   2011-02-05   15    5~多云   北风~东南风       3-4None   None   None
5   2011-02-06   16    5    多云~晴    南风~北风       3-4None   None   None
6   2011-02-07   15   10    多云~阴   东风~东南风       3-4None   None   None
7   2011-02-08   19    6      多云      东北风       3-4None   None   None
8   2011-02-09    9    4~小雨       北风       4-5None   None   None
9   2011-02-10    5    1  小雨~雨夹雪      东北风       4-5None   None   None
10  2011-02-11    6   -1      多云       北风       4-5None   None   None
11  2011-02-12    5    0    多云~阴   北风~东北风  4-5~3-4None   None   None
12  2011-02-13    4    0       阴      东北风       3-4None   None   None
13  2011-02-14    4   -1      多云       北风  4-5~3-4None   None   None
14  2011-02-15    6    3~多云   东北风~东风       3-4None   None   None
15  2011-02-16    9    5      小雨  东南风~东北风       3-4None   None   None
16  2011-02-17    5    3~多云      东北风       4-5None   None   None
17  2011-02-18    6    2    多云~阴   北风~东北风  4-5~3-4None   None   None
18  2011-02-19    8    3~多云   北风~东北风       3-4None   None   None
19  2011-02-20   11    2    多云~晴      东北风       3-4None   None   None
20  2011-02-21   12    5       晴   北风~东北风       3-4None   None   None
21  2011-02-22   13    7~多云   东风~东南风       3-4None   None   None
22  2011-02-23   16    8       晴      东南风       3-4None   None   None
23  2011-02-24   18    9~多云   东南风~东风       3-4None   None   None
24  2011-02-25   13    9    多云~阴  东北风~东南风       4-5None   None   None
25  2011-02-26   15   11    小雨~阴      东南风  3-4~4-5None   None   None
26  2011-02-27   20    7   多云~阵雨   西北风~北风  3-4~4-5None   None   None
27  2011-02-28    7    4      小雨       北风       4-5None   None   None]
[            日期 最高气温 最低气温    天气状况      风向         风力  空气质量 空气质量说明 空气质量水平
0   2011-01-01    6    2  多云~雨夹雪      北风       4-5None   None   None
1   2011-01-02    6    2      多云      北风       4-5None   None   None
2   2011-01-03    7    2    多云~阴     东北风       3-4None   None   None
3   2011-01-04    6    1      小雨      北风       4-5None   None   None
4   2011-01-05    5    0~多云      北风       4-5None   None   None
5   2011-01-06    6    0      多云      北风       3-4None   None   None
6   2011-01-07    7    2      多云      北风       4-5None   None   None
7   2011-01-08    7    4    多云~阴     东北风       3-4None   None   None
8   2011-01-09    7    0~多云      北风       3-4None   None   None
9   2011-01-10    5    0    多云~阴  东北风~东风  4-5~3-4None   None   None
10  2011-01-11    6    2      多云      东风       3-4None   None   None
11  2011-01-12    7    3    多云~阴     东北风       3-4None   None   None
12  2011-01-13    6    0~多云     东北风       4-5None   None   None
13  2011-01-14    5   -2      多云      北风       4-5None   None   None
14  2011-01-15    3   -1      多云  北风~东北风       4-5None   None   None
15  2011-01-16    4    0    多云~阴     东北风  4-5~3-4None   None   None
16  2011-01-26    7    2       阴     东北风       3-4None   None   None
17  2011-01-29    4   -2~多云      北风       4-5None   None   None
18  2011-01-30    4   -3    多云~晴     西北风  4-5~3-4None   None   None
19  2011-01-31    7   -2       晴     西北风    微风~3-4None   None   None,             日期 最高气温 最低气温    天气状况       风向         风力  空气质量 空气质量说明 空气质量水平
0   2011-02-01    9    1      多云      西南风       3-4None   None   None
1   2011-02-02   11    2       晴      西南风         微风  None   None   None
2   2011-02-03   13    3~多云       南风    微风~3-4None   None   None
3   2011-02-04   14    4       晴    南风~北风       3-4None   None   None
4   2011-02-05   15    5~多云   北风~东南风       3-4None   None   None
5   2011-02-06   16    5    多云~晴    南风~北风       3-4None   None   None
6   2011-02-07   15   10    多云~阴   东风~东南风       3-4None   None   None
7   2011-02-08   19    6      多云      东北风       3-4None   None   None
8   2011-02-09    9    4~小雨       北风       4-5None   None   None
9   2011-02-10    5    1  小雨~雨夹雪      东北风       4-5None   None   None
10  2011-02-11    6   -1      多云       北风       4-5None   None   None
11  2011-02-12    5    0    多云~阴   北风~东北风  4-5~3-4None   None   None
12  2011-02-13    4    0       阴      东北风       3-4None   None   None
13  2011-02-14    4   -1      多云       北风  4-5~3-4None   None   None
14  2011-02-15    6    3~多云   东北风~东风       3-4None   None   None
15  2011-02-16    9    5      小雨  东南风~东北风       3-4None   None   None
16  2011-02-17    5    3~多云      东北风       4-5None   None   None
17  2011-02-18    6    2    多云~阴   北风~东北风  4-5~3-4None   None   None
18  2011-02-19    8    3~多云   北风~东北风       3-4None   None   None
19  2011-02-20   11    2    多云~晴      东北风       3-4None   None   None
20  2011-02-21   12    5       晴   北风~东北风       3-4None   None   None
21  2011-02-22   13    7~多云   东风~东南风       3-4None   None   None
22  2011-02-23   16    8       晴      东南风       3-4None   None   None
23  2011-02-24   18    9~多云   东南风~东风       3-4None   None   None
24  2011-02-25   13    9    多云~阴  东北风~东南风       4-5None   None   None
25  2011-02-26   15   11    小雨~阴      东南风  3-4~4-5None   None   None
26  2011-02-27   20    7   多云~阵雨   西北风~北风  3-4~4-5None   None   None
27  2011-02-28    7    4      小雨       北风       4-5None   None   None,             日期 最高气温 最低气温   天气状况       风向         风力  空气质量 空气质量说明 空气质量水平
0   2011-03-01    6    0~多云       北风  4-5~3-4None   None   None
1   2011-03-02    8    1      晴       北风       3-4None   None   None
2   2011-03-03    9    1~多云       北风       3-4None   None   None
3   2011-03-04    9    4~多云  东北风~东南风       3-4None   None   None
4   2011-03-05   13    7  多云~小雨   东南风~南风  4-5~3-4None   None   None
5   2011-03-06   10    4   小雨~阴       北风  3-4~4-5None   None   None
6   2011-03-07   10    2      晴       北风       3-4None   None   None
7   2011-03-08   15    5~多云      西南风       3-4None   None   None
8   2011-03-09   14    3     多云       北风  4-5~3-4None   None   None
9   2011-03-10   13    6~多云      东南风       3-4None   None   None
10  2011-03-11   17    9~多云       南风  3-4~4-5None   None   None
11  2011-03-12   17   10     多云   南风~东南风       4-5None   None   None
12  2011-03-13   18    8  多云~阵雨      东南风  4-5~3-4None   None   None
13  2011-03-14   14    4     小雨       北风       4-5None   None   None
14  2011-03-15    9    2~多云       北风       4-5None   None   None
15  2011-03-16   12    4   多云~晴  西北风~东北风       3-4None   None   None
16  2011-03-17   16    6~多云   东南风~南风  3-4~4-5None   None   None
17  2011-03-18   15    9      阴   东南风~南风  4-5~3-4None   None   None
18  2011-03-19   16   12     阵雨       南风       4-5None   None   None
19  2011-03-20   16    7  阵雨~中雨      东北风       4-5None   None   None
20  2011-03-21    8    5  中雨~小雨       北风       4-5None   None   None
21  2011-03-22    9    3  小雨~多云       北风  4-5~3-4None   None   None
22  2011-03-23   13    6~多云       东风       3-4None   None   None
23  2011-03-24   16    5     多云    南风~北风  3-4~4-5None   None   None
24  2011-03-25   13    5~多云  东北风~东南风       3-4None   None   None
25  2011-03-26   15    7~多云   西南风~南风       3-4None   None   None
26  2011-03-27   17    8~多云       南风       3-4None   None   None
27  2011-03-28   19    9~多云   西南风~北风  3-4~4-5None   None   None
28  2011-03-29   14    6   多云~晴      东北风  4-5~3-4None   None   None
29  2011-03-30   16    7~多云   南风~东南风  3-4~4-5None   None   None
30  2011-03-31   19    9~多云      东南风       3-4None   None   None]

CSV:
在这里插入图片描述

代码中的难点知识:
pd.read_csv() 、to_csv() 之 常用参数
pandas数据合并与重塑(pd.concat篇)

  • 5
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 7
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值