用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)

 

posted @ 2023-09-11 17:14  TheBlackEagle  阅读(28)  评论(0编辑  收藏  举报