用python爬取天气
之前做过这么个小网站,能够爬取天气,然后感觉没什么用,有上网站的时间用手机都看完了,然后就寻思能不能发到自己微信或者qq或者邮箱里
先写下怎么把数据提出来
import requests import json url =你自己的网址 result = requests.get(url) #print(result.text) data = json.loads(result.text) for day_data in data["daily"]: fxDate = day_data["fxDate"] tempMax = day_data["tempMax"] tempMin = day_data["tempMin"] textDay = day_data["textDay"] windDirDay = day_data["windDirDay"] windScaleDay = day_data["windScaleDay"] windSpeedDay = day_data["windSpeedDay"] humidity = day_data["humidity"] precip = day_data["precip"] pressure = day_data["pressure"] vis = day_data["vis"] cloud = day_data["cloud"] # 这里就可以对数据进行处理,发送到微信或者邮箱等等 print(f"日期: {fxDate}") print(f"最高温度: {tempMax} °C") print(f"最低温度: {tempMin} °C") print(f"天气: {textDay}") print(f"风向: {windDirDay}") print(f"风力等级: {windScaleDay}") print(f"风速: {windSpeedDay} km/h") print(f"湿度: {humidity}%") print(f"降水量: {precip} mm") print(f"大气压: {pressure} hPa") print(f"可见度: {vis} km") print(f"云量: {cloud}%") print("\n")
用之前需要申请天气网站的api,这里用的是和风天气的api,具体的url怎么写在官网的使用手册中会给
微信和qq等可能要注册两个号才能达到提醒的作用,邮箱看起来又有点麻烦,等我再瞅瞅
最后决定使用linux中的swaks来发送
大致格式为swaks --to 自己的邮箱 --from 想用的源邮箱 --body 要发送的数据
这里使用格式化字符串来放入这几个数据,尤其是body,处理数据可以用这种方式:
效果图如下:
然后是怎么定时跑的问题,毕竟电脑不能整天开着,这里还是强烈推荐一下华为的这个云服务器,贼便宜,要是不干什么别的事可以买那个39块钱一年的,1核2g:https://activity.huaweicloud.com/discount_area_v5/index.html?fromacct=ba15c8d3-879a-4625-aa80-d0ca50a0b43b&utm_source=aGlkX2UwdjJxbm9lbnZ0YWI4ag===&utm_medium=cps&utm_campaign=201905
有了服务器之后就可以设置定时任务,这里用的是crontab
网上一堆说什么crontab -e的,也不知道有什么用,试了之后不好使而且很麻烦,这里用的方式是创建一个文件如weather.cron(这个后缀我也不知道是不是必须的),然后写上crontab格式的语句
crontab的格式如下:
分 时 日 月 周 命令
比如想要每天早上7点50发送邮件到我们的邮箱,就是50 7 * * * python3 /xxx/xxx.py,这里的python路径应该要用绝对路径,咱也不知道它的执行路径在哪,反正用绝对路径肯定没错
写好了之后输入crontab weather.cron,就能够成功添加定时任务,通过crontab -l来查看当前的定时任务
这里的文件是支持多行的,比如想早上7.50和晚上17.50发送,可以直接写两行
附最终代码(需自行修改某些相关数据):
import requests import json import subprocess url = 'https://devapi.qweather.com/v7/weather/3d?location=要查询的城市拼音或者经纬度坐标&key=自己的key&language=zh' result = requests.get(url) data = json.loads(result.text) email_content = "" for day_data in data["daily"]: fxDate = day_data["fxDate"] tempMax = day_data["tempMax"] tempMin = day_data["tempMin"] textDay = day_data["textDay"] windDirDay = day_data["windDirDay"] windScaleDay = day_data["windScaleDay"] windSpeedDay = day_data["windSpeedDay"] humidity = day_data["humidity"] precip = day_data["precip"] pressure = day_data["pressure"] vis = day_data["vis"] cloud = day_data["cloud"] email_content += f"日期: {fxDate}\n" email_content += f"最高温度: {tempMax} °C\n" email_content += f"最低温度: {tempMin} °C\n" email_content += f"天气: {textDay}\n" email_content += f"风向: {windDirDay}\n" email_content += f"风力等级: {windScaleDay}\n" email_content += f"风速: {windSpeedDay} km/h\n" email_content += f"湿度: {humidity}%\n" email_content += f"降水量: {precip} mm\n" email_content += f"大气压: {pressure} hPa\n" email_content += f"可见度: {vis} km\n" email_content += f"云量: {cloud}%\n" email_content += "\n" # 使用swaks发送邮件 email_subject = "天气预报" email_recipient = "自己的邮箱" email_from = "weather@weather.com" swaks_command = f"swaks --to {email_recipient} --from your_email@example.com --from '{email_from}' --body '{email_content}'" subprocess.run(swaks_command, shell=True)