抓取AQI,风速,风向等数据输出到控制台一例,请大家参考
# encoding=utf-8
#import requests 这是python2里的
import json
import time
#from urllib.request import urlopen 另一种用法
import urllib.request
import urllib
# 正则
import re
#db
import pymysql
def requests(citycode):
citycode = 101280601
# 请求地址http://d1.weather.com.cn/aqi_all/101280601.html?_=1576479057467,后边的一串数字是时间戳可以随机或者确定的不影响
url = "http://d1.weather.com.cn/aqi_all/" + str(citycode) + ".html?_=1576479057467"
# 请求头,不加获取不到数据
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36",
"Referer": "http://www.weather.com.cn/air/?city=101280601",
}
# 请求对象
req = urllib.request.Request(url, headers=headers)
#这里使用request对象打开
res = urllib.request.urlopen(req).read()
return res
def parse(res):
# p1 = re.compile(r'[(](.*?)[)]', re.S) # 最小匹配
# 使用正则取出第一个方括号中的内容
p2 = re.compile(r'[[](.*)[]]', re.S) # 贪婪匹配
json_str = re.findall(p2, res.decode('utf-8'))
# json反序列化(字符串转成字典)方法 loads:无文件操作 load: 读文件+反序列化
# json序列化(字典转成字符串)方法: dumps:无文件操作 dump:序列化+写入文件
json_str1= json.loads('['+json_str[0]+']')
return json_str1
def save(list):
# 作用 1,过滤指定内容,2 映射为想要的字串
subkey = {'time': 'HH24','t1': 'AQI','t3': 'PM25','t4': 'PM10', 't5': 'CO', 't6': 'NO2','t7':'O3', 't9': 'SO2','t11':'风速','t12':'相对湿度','t13':'降水量', 't14': '风向'}
for dict in list:
# 这里用到了 列表推导式(for表达式)
subdict = {value: dict[key] for key, value in subkey.items()} # 提取原字典中部分键值对,并替换key为中文
print(subdict)
# forecast.insert_one(subdict) # 插入数据库 省略
if __name__ == '__main__':
# 起始年月
year = "2019"
month = 1
# 循环请求
#for i in range(month, 13):
# month = str(i) if i > 9 else "0" + str(i) # 小于10的月份要补0
citycode= 101280601
save(parse(requests(citycode)))
# 避免被禁,休息1s
time.sleep(1)