1、爬取对象:百度天气
2、天气解析
3、整理内容
4、发送对象,获取SMTP发送授权码
5、脚本完成
6、加入windows的任务计划程序,或者linux的crontab周期性任务设置
# -*- coding:utf-8 -*-
import json
import random
import re
import time
import requests
import yagmail
from bs4 import BeautifulSoup
url = 'https://weathernew.pae.baidu.com/weathernew/pc?srcid=4982&query='
s_url = 'https://www.baidu.com/s?ie=utf-8&f=8&rsv_bp=1&tn=baidu&wd='
user = 'king917619381@vip.qq.com'
password = 'xxxx授权码'
allProvince = ['河北', '山西', '辽宁', '吉林', '黑龙江', '江苏', '浙江', '安徽', '福建', '江西', '山东', '河南', '湖北',
'湖南', '广东', '海南', '四川', '贵州', '云南', '陕西', '甘肃', '青海', '台湾', '内蒙古', '北京', '天津',
'上海', '广西', '西藏', '重庆', '宁夏', '新疆', '香港', '澳门', '台湾']
# try:
# print('请您搜索:湖北黄冈天气(省+市+天气,应省去省市后缀)!')
# input_first = input('请输入您的城市:')
# if input_first[:2] in allProvince or input_first[:3] in ['黑龙江', '内蒙古']:
# input_first = input_first
# else:
# input_first = '湖北武穴天气'
# finally:
# pass
def get_real_weather(new_url, num=None):
"""
获取实时天气
:param new_url:
:param num:获取最近多少天的天气,后面几天的天气将从weather15DayData列表里获取
:return:
"""
headers = {
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 Chrome/103.0.0.0 Safari/537.36'
}
r = requests.get(new_url, headers=headers)
soup = BeautifulSoup(r.text, 'lxml').findAll('script')
# var_soup[5],获取当前日期具体气候状况
global simple_text, after_weather
weather = re.findall(r'data\["weather"]=(.+)', str(soup[5]))
weather = json.loads(weather[0].replace(';', ''))
base = re.findall(r'data\["base"]=(.+);', str(soup[5]))
base = json.loads(base[0])
date = base['date'] # 当前日期
weekday = base['weekday'] # 当前星期几
lunar = base['lunar'] # 农历多少
feature = re.findall(r'data\["feature"]=(.+);', str(soup[5]))
feature = json.loads(feature[0])
sunriseTime = feature['sunriseTime'] # 日出时间
sunsetTime = feature['sunsetTime'] # 日落时间
weather15DayData = re.findall(r'data\["weather15DayData"]=(.+);', str(soup[5]))
weather15DayData = json.loads(weather15DayData[0])
if num and int(num) < 15:
# 获取明后天天气字典
after_weather = []
for i in range(int(num)):
w_date = weather15DayData[i + 1]['date'] # 日期
formatWeek = weather15DayData[i + 1]['formatWeek'] # 属于哪一天:今明后
if i + 1 == int(num):
weatherPm25 = weather15DayData[i + 1]['weatherPm25'] + '。\n\n\n' # pm空气质量
else:
weatherPm25 = weather15DayData[i + 1]['weatherPm25'] + ',' # pm空气质量
weatherText = weather15DayData[i + 1]['weatherText'] # 天气情况
after_weather.append(w_date + ' ' + formatWeek + '天气:' + weatherText + ' 空气质量' + weatherPm25)
else:
only_date = weather15DayData[1]['date'] # 日期
only_formatWeek = weather15DayData[1]['formatWeek'] # 属于哪一天:今明后
only_weatherPm25 = weather15DayData[1]['weatherPm25'] + '。' # pm空气质量
only_weatherText = weather15DayData[1]['weatherText'] # 天气情况
simple_text = '日期' + only_date + ' ' + only_formatWeek + '天气:' + only_weatherText + ' 空气质量' + only_weatherPm25
# print(simple_text)
temperature_night = weather['temperature_night'] # 晚间温度
temperature_day = weather['temperature_day'] # 白天温度
weather_day = weather['weather_day'] # 白天天气
wind_direction_day = weather['wind_direction_day'] # 风向趋势
wind_power_day = weather['wind_power_day'] # 白天风力等级
temperature = weather['temperature'] # 当前气温是多少
real_weather = weather['weather'] # 当前天气
wind_direction = weather['wind_direction'] # 当前风向
wind_power = weather['wind_power'] # 当前风力
humidity = weather['humidity'] # 空气湿度
uv = weather['uv'] # 紫外线强弱
todayContent = f'{locate[:-2]}\n' \
f'{date} {weekday} 农历:{lunar},当前气温为:{temperature}°\n' \
f'湿度{humidity}%,紫外线{uv},日出{sunriseTime},日落{sunsetTime}\n' \
f'总体来说,今天:{weather_day},{temperature_night}°~{temperature_day}℃ {wind_direction_day}{wind_power_day}\n' \
f'实时:{real_weather} {wind_direction}{wind_power}\n'
return todayContent + '\n介天是:\n' + simple_text if not num else todayContent + '\n后面几天:\n' + '\n'.join(
text for text in after_weather) # + '。\n'
# print(f'打印完成,内容为:\n{weather}')
# print(weather15DayData)
def search_weather():
res = requests.get(simple_url, headers=headers)
print(res.text) # No result we want.
def send_mail(weather_get):
# 连接邮箱服务器,smtp里password输入的是授权码
yag = yagmail.SMTP(user=user, password=password, host='smtp.qq.com') # smtp.qq.com
if isinstance(weather_get, list):
weather_get.append('\n\n作者:HuZk')
# return 'pm is shayu de shoubi.'
# 发送带附件的邮件,最后1个参数为附件地址
# 接收邮件的邮箱和附件地址可以为列表,即发送给多个邮箱,发送多个附件
receive_address = ['917619381@qq.com'] # 多个收件地址
try:
yag.send(receive_address, '天气定制_专属', weather_get, [r"C:\Users\Administrator\Pictures\无非动心.jpeg"])
finally:
pass
return '您的心意发送完成,对方已成功接收!'
# if True:
# yag.send(receive_address, '亲爱的,请收下您的天气!', contents, [r"C:\Users\Administrator\Pictures\无非动心.jpeg"])
def run():
input_first = None # 我的家乡:湖北黄冈天气
global locate
if input_first:
locate = input_first
else:
locate = '广东深圳天气'
new_url = url + locate
# simple_url = s_url + locate
# 控制查询地:locate → new_url → out_content
input_num = '3' # 展示未来几天的天气,默认3天
content = get_real_weather(new_url, input_num)
# 再加个地址,展示该地址天气
locate = '湖北武穴天气'
another_url = url + locate
second_content = get_real_weather(another_url, input_num)
print(f'check ready-contents:{[content, second_content]=}')
# 天气内容获取完毕,现在来发送邮件
print(send_mail([content, second_content]))
run()
点击Sublime Text的插件F5调试,或者pycharm的运行,发送成功!
以后你喜欢的、敬重的人每天都能收到你的关切和推送了!快去试一下吧!