摘要
本次尝试爬取高德地图中全国部分城市天气信息,程序主要是对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)