Python爬取城市天气信息


摘要

本次尝试爬取高德地图中全国部分城市天气信息,程序主要是对json字符串进行操作,如果有天气方面的数据分析需求,可以把代码稍作修改,放到服务器上定时跑一个月,就可以得到数量相当可观的数据。

用到的包

#网页请求
import requests
#操作json字符串,在本文中可用可不用
import json
#用于使程序暂停数秒
import time

全局变量

#城市及对应的adcode保存在该url指向的json文本中,在高德地图官网审查元素可以找到该url
url_city = 'https://www.amap.com/service/cityList?version=2020101417'
#使用该url和城市的adcode可以构造出完整的城市天气信息地址
url_weather = 'https://www.amap.com/service/weather?adcode={}'
#模拟浏览器进行访问
headers = {
    'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.111 Safari/537.36'
    }

城市列表

def get_city():
    #发起get请求
    req = requests.get(url = url_city,headers = headers)
    #将信息保存为字典
    city_info = req.json()
    #如果你想将信息保存为文本文件可以启用下面的代码
    """
    f = open('city.txt','w')
    f.write(req.text)
    f.close()
    """
    #定义空列表用于存储城市信息
    city_list = []
    #根据A到Z的索引进行遍历,需要使用ASCII码
    for i in range(65,91):
        #因为有些索引不包含城市,比如I,所以需要捕捉一下异常
        try:
            #这里的index_city是一个列表,列表中又包含字典元素
            index_city = city_info['data']["cityByLetter"][chr(i)]
            for index in index_city:
                city_list.append((index['adcode'],index['name']))
        except:
            pass
    #返回城市列表
    return city_list

获取天气信息

def get_weather(city_list):
    #用于记录出错的城市
    error_list = []
    #创建一个文本文档保存天气信息,需要爬取多天信息可以使用日期命名
    f = open('weather.txt','w')
    #枚举每一个城市
    for i,city in enumerate(city_list):
        #有些城市信息在访问时出错,为了不前功尽弃也需要捕捉异常
        try:
            #定义一个空字典
            item = {}
            #对城市信息发起get请求
            weather = requests.get(url = url_weather.format(city[0]),headers = headers)
            #记录城市adcode
            item['adcode'] = city[0]
            #记录城市名称
            item['name'] = city[1]
            #记录天气时间
            item['time'] = weather.json()['data']['data'][0]['report_time']
            #记录具体天气信息,如晴、阴、多云
            item['weather'] = weather.json()['data']['data'][0]['live']['weather_name']
            #记录当前温度
            item['temperature'] = weather.json()['data']['data'][0]['live']['temperature']
            #记录当天最低温度
            item['min_temp'] = weather.json()['data']['data'][0]['forecast_data'][0]['min_temp']
            #记录当天最高温度
            item['max_temp'] = weather.json()['data']['data'][0]['forecast_data'][0]['max_temp']
            #将字典转换为字符串,加入换行符后写入文本文件,再次操作时使用json即可
            f.write(str(item) + '\n')
            #输出提示信息
            print(city[1],'天气已获取')
            #使程序休眠0.5s
            time.sleep(0.5)
        except:
            #遇到错误时记录城市的索引位置、adcode、名称
            error_list.append((i,city[0],city[1]))
            pass
    #关闭打开的文本文档
    f.close()
    #输出error_list
    print(error_list)

最后

if __name__ == '__main__':
    city_list = get_city()
    get_weather(city_list)