北上广深历史天气采集,爬取天气数据
  K9ZzX4sYpBhu 2023年11月05日 47 0
import time
import requests     #发送数据
import parsel       #解析数据
import csv

'''
网站:
https://tianqi.2345.com/
目的:北上广深历史天气采集,爬取天气数据

北京历史天气网页
https://tianqi.2345.com/wea_history/54511.htm

找数据
    静态:网页html代码
    动态:network(网页变化就会产生新的数据)
        在页面的network中的Disable cache(勾选)和AII(勾选),找到Name里面的GetHistory开头的就是请求的,点击Headers,复制General里面Request URL的链接并在pycharm中赋值给变量url
        https://tianqi.2345.com/Pc/GetHistory?areaInfo%5BareaId%5D=54511&areaInfo%5BareaType%5D=2&date%5Byear%5D=2023&date%5Bmonth%5D=5
代码实现
    发送请求
    获取数据
    解析数据
    保存数据
    
在页面的network中的Disable cache(勾选)和AII(勾选),找到Name里面的GetHistory开头的字符串,点击Payload,看到4个数据,从上到下依次是
areaInfo[areaId]: 54511     --》城市代码
areaInfo[areaType]: 2       --》
date[year]: 2023            --》年份
date[month]: 5              --》月份      
'''

'''
要爬全国城市的历史数据的话需要先爬取相关城市代码,下面只演示4个城市
'''

f = open('爬虫-天气数据.csv',mode='a',encoding='utf-8',newline='')
csv_writer = csv.writer(f)
csv_writer.writerow(['日期','最高温度','最低温度','天气','风向','城市'])

city_list = [54511,58362,59287,59493]#北京、上海、广州、深圳
for city in city_list:
    city_name = ''
    if city == 54511:
        city_name = '北京'
    elif city == 58362:
        city_name = '上海'
    elif city == 59287:
        city_name = '广州'
    elif city == 59493:
        city_name = '深圳'
    print(f'-----获取{city_name}城市的数据-----')
    time.sleep(1)

    for year in range(2013,2023):#获取2013年到2022年北京的历史天气
        print(f'-----获取{city_name}城市{year}年的数据-----')
        time.sleep(1)
        for month in range(1,13):#获取一年的数据
            # 发送请求
            url = f'https://tianqi.2345.com/Pc/GetHistory?areaInfo%5BareaId%5D={city}&areaInfo%5BareaType%5D=2&date%5Byear%5D={year}&date%5Bmonth%5D={month}'
            #上面的url设置了三个变量来改变url数据,以达到爬取不同数据的目的
            response = requests.get(url=url)
            # 获取数据
            json_data = response.json()['data']
            # 解析数据
            select = parsel.Selector(json_data)
            tr_css = select.css('.history-table tr')  # 用css的语法提取数据,解析了网页源代码后会发现数据在.history-table tr里面
            for tr in tr_css[1:]:
                td_css = tr.css('td::text').getall()
                '''
                td_css = tr.css('td').getall()获取到的数据是:
                ['<td>2023-05-25 周四</td>', '<td style="color:#ff5040;">25°</td>', '<td style="color:#3097fd;">16°</td>',
                 '<td>多云</td>', '<td>西南风2级</td>', '<td><span class="history-aqi wea-aqi-2">65 良</span></td>']
                 '''
                td_css.append(city_name)#在列表尾部添加所在城市
                print(td_css)
                '''
                td_css = tr.css('td::text').getall()获取到的数据是:
                ['2023-05-25 周四', '25°', '16°', '多云', '西南风2级']
                '''
                csv_writer.writerow(td_css)

print('爬取完成!请在相应文档查看数据。')
【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月08日 0

暂无评论

推荐阅读