前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >PYTHON初学之API爬取天气预报数据

PYTHON初学之API爬取天气预报数据

作者头像
布衣者
发布于 2021-09-07 03:18:14
发布于 2021-09-07 03:18:14
81400
代码可运行
举报
文章被收录于专栏:布衣者博客布衣者博客
运行总次数:0
代码可运行

一直看到python好多人学,终于自己耐不住性子,还是开始学习起来了。 初学python,看到了这个经典的项目,于是就开始进行学习。并进行了相应的改(乱)善(改),将原本项目采用的储存数据库改为mysql,只储存近三天的天气情况,增加定时执行,成功之后邮件提醒等。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import requests
import time
import json
import pymysql
import smtplib
from email.mime.text import MIMEText
from email.utils import formataddr
from apscheduler.schedulers.blocking import BlockingScheduler 
def mail(nownew,nowup,nowok):
    mailtime=str(time.strftime('%Y-%m-%d %H:%M:%S',time.localtime()))
    ret=True
    my_sender='******@126.com'    # 发件人邮箱账号
    my_pass = '******'              # 发件人邮箱密码
    my_user='halfye@163.com'      # 收件人邮箱账号,我这边发送给自己
    emailtext=("%s,执行结束\n 新增:%s \n现在更新:%s\n 原更新:%s"%(mailtime,str(nownew),str(nowup),str(nowok)))
    try:
        msg=MIMEText(emailtext,'plain','utf-8')
        msg['From']=formataddr(["天气抓取信息",my_sender])  # 括号里的对应发件人邮箱昵称、发件人邮箱账号
        msg['To']=formataddr(["半叶子接信人",my_user])              # 括号里的对应收件人邮箱昵称、收件人邮箱账号
        msg['Subject']=("%s天气执行结束"%(mailtime))         # 邮件的主题,也可以说是标题
 
        server=smtplib.SMTP_SSL("smtp.126.com", 465)  # 发件人邮箱中的SMTP服务器,端口是25
        server.login(my_sender, my_pass)  # 括号中对应的是发件人邮箱账号、邮箱密码
        server.sendmail(my_sender,[my_user,],msg.as_string())  # 括号中对应的是发件人邮箱账号、收件人邮箱账号、发送邮件
        server.quit()  # 关闭连接
    except Exception:  # 如果 try 中的语句没有执行,则会执行下面的 ret=False
        ret=False
        file2 = open(("%s天气执行结束.txt"%(mailtime)),"w")
        file2.write(emailtext)
        file2.close()
    return ret
 



#链接数据库
def weathers():
    print("执行中")
    nowup=0
    nowok=0
    nownew=0
    tiee=1
    db=pymysql.connect("localhost","py","pythonpy0202","python" )
    cursor = db.cursor()
    #数据库判断是否存在,不存在则创建
    sql = '''CREATE TABLE IF NOT EXISTS `weather`(
            `id` INT,
           `cid` VARCHAR(40) NOT NULL,
           `location` VARCHAR(40) NOT NULL,
           `weatherd1` VARCHAR(40) NOT NULL,
           `weatherd2` VARCHAR(40) NOT NULL,
           `weatherd3` VARCHAR(40) NOT NULL,
           `weathern1` VARCHAR(40) NOT NULL,
           `weathern2` VARCHAR(40) NOT NULL,
           `weathern3` VARCHAR(40) NOT NULL,
           `date` DATE,
           PRIMARY KEY ( `cid` )
        )ENGINE=InnoDB DEFAULT CHARSET=utf8;'''
    #执行sql语句
    cursor.execute(sql)
    db.commit()
    #获取本地时间
    nowtime=time.strftime("%Y-%m-%d", time.localtime())
    #获取城市的cid
    url='https://cdn.heweather.com/china-city-list.txt'
    strhtml=requests.get(url)
    strhtml.encoding = 'utf8' 
    data=strhtml.text
    #以换行符来分割,建立数组
    data1=data.split("\n")
    #删去前五行
    for i in range(6):
        data1.remove(data1[0])
    #初始化id和天气白和天气黑
    id=0
    weatherd=['','','']
    weathern=['','','']
    #进行循环查询
    for it in data1:
        #查询cid是否存在
        sql=("SELECT `cid` FROM `weather` WHERE cid='%s'"%(it[2:13]))
        cursor.execute(sql)
        db.commit()
        exist = cursor.fetchone()
        #如果不存在则执行
        if exist==None:
            nownew+=1
            url='https://free-api.heweather.net/s6/weather?location='+it[2:13]+'&key=cc33b9a52d6e48de852477798980b76e'  
            time.sleep(tiee)
            #获取请求并转为json格式
            strhtml=requests.get(url)
            dic=strhtml.json()
            #判断返回值是否正常,正常则执行
            if dic['HeWeather6'][0]['status']=='ok':
                #获取城市cid和城市名称以及近三天天气情况
                cid=dic['HeWeather6'][0]['basic']['cid']
                location=dic['HeWeather6'][0]['basic']['location']
                i=0
                for it in dic['HeWeather6'][0]['daily_forecast']:
                    weatherd[i]=it['cond_txt_d']
                    weathern[i]=it['cond_txt_n']
                    i+=1
                    if i==3 :
                        break
                # 输出三天天气
                print(id,cid,location,'三白:',weatherd[0],weatherd[1],weatherd[2],'三黑: ',weathern[0],weathern[1],weathern[2])
                strid=str(id)
                sql=("INSERT INTO `weather`(`id`,`cid`, `location`, `weatherd1`, `weatherd2`, `weatherd3`, `weathern1`, `weathern2`, `weathern3`,`date`)VALUES ('%s','%s', '%s', '%s', '%s', '%s','%s', '%s', '%s','%s')"%(strid,cid,location,weatherd[0],weatherd[1],weatherd[2],weathern[0],weathern[1],weathern[2],nowtime))
                cursor.execute(sql)
                db.commit()

            else:
                print("失败,请检查1")
                break
            
        else:
            #查询cid并获取返回的日期
            sql=("SELECT `date` FROM `weather` WHERE cid='%s'"%(it[2:13]))
            cursor.execute(sql)
            db.commit()
            lastday = (cursor.fetchone())[0]
            #如果返回日期和本地时间不同则执行
            if str(lastday)!=nowtime:
                url='https://free-api.heweather.net/s6/weather?location='+it[2:13]+'&key=cc33b9a52d6e48de852477798980b76e'  
                #b70895c4a6e848af86ae320da3cda0e3
                time.sleep(tiee)
                strhtml=requests.get(url)
                dic=strhtml.json()
                if dic['HeWeather6'][0]['status']=='ok':
                    nowup+=1
                    i=0
                    cid=dic['HeWeather6'][0]['basic']['cid']
                    location=dic['HeWeather6'][0]['basic']['location']
                    for it in dic['HeWeather6'][0]['daily_forecast']:
                        weatherd[i]=it['cond_txt_d']
                        weathern[i]=it['cond_txt_n']
                        i+=1
                        if i==3 :
                            break
                    print(id,cid,location,'三白天:',weatherd[0],weatherd[1],weatherd[2],'三黑天: ',weathern[0],weathern[1],weathern[2])
                    sql=("UPDATE `weather` SET `weatherd1`='%s', `weatherd2`='%s', `weatherd3`='%s', `weathern1`='%s', `weathern2`='%s', `weathern3`='%s',`date`='%s' WHERE cid='%s'"%(weatherd[0],weatherd[1],weatherd[2],weathern[0],weathern[1],weathern[2],nowtime,cid))
                    cursor.execute(sql)
                    db.commit()
                else:
                    print("失败,请检查2")
                    break
            else: 
                print(id,"已经最新")
                nowok+=1
        id+=1
    #测试用,方便中断。
        if id==-1:
            break  
    db.close()
    ret=mail(nownew,nowup,nowok)
    if ret:
        print("邮件发送成功")
    else:
        print("邮件发送失败")
        
weathers()
#定时启动,每天早上6if __name__ == '__main__':
    scheduler = BlockingScheduler()
    scheduler.add_job(weathers,'cron',day_of_week ='0-6',hour = 6,minute = 00,second = 00)
    print("s1")

    try:
        scheduler.start()
    except (KeyboardInterrupt, SystemExit):
        pass
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020年03月16日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
zabbix邮件报警python脚本
下面是两个不同的python脚本,只是连接邮件服务器的方法不同,其他方法还是相同的
py3study
2020/01/08
8630
还在担心明天的天气吗?----API爬取各城市天气预报数据
国内城市ID : http://cdn.heweather.com/china-city-list.txt
Python研究者
2020/10/29
1.3K0
还在担心明天的天气吗?----API爬取各城市天气预报数据
用Python写了一个不起床让你后悔的闹钟,周末还敢赖床吗
导读 哎 😡 ,别提了自从回到家整个人都懒散了,总被人嫌弃不说还觉得生活没有了盼头,还好在社区认识了一些大佬让我想重新来过做回自己,不在做小丑,于是乎我就想用个东西来提醒我别睡懒觉,然后这篇文章就诞生了。 来吧看看今天的故事。 闹钟 有人说程序员的日常就是反复造轮子,我觉得能在原来的基础上玩出新花样来帮到一些人,做这些事还是挺有趣的。 没有什么高深的学问就是给大家在枯燥的夏日带来一点欢愉。 使用的模块 import time from datetime import datetime from playso
周萝卜
2022/09/28
5510
python3发送邮件
#163邮箱发送邮件 import smtplib from email.mime.text import MIMEText from email.utils import formataddr
py3study
2020/01/03
4270
python3.x下 smtp发送htm
综合网络上的文章以及自己的实验,在python的IDEL下成功的通过SMTP发送出去了邮件。现将过程记录如下:
py3study
2020/01/03
7600
python3.x下 smtp发送htm
qq邮箱日发5万邮件群发技术(qq邮箱怎样定时发送邮件)
有不少杠精小婊贝留言说本文章没有用,因为天气预报直接打开手机就可以收到了,为何要多此一举发送到邮箱呢!!!那我在这里只能说:因为你没用,所以你没用!!!
全栈程序员站长
2022/08/02
2.5K0
qq邮箱日发5万邮件群发技术(qq邮箱怎样定时发送邮件)
python自动发邮件总结及实例说明
python发邮件需要掌握两个模块的用法,smtplib和email,这俩模块是python自带的,只需import即可使用。smtplib模块主要负责发送邮件,email模块主要负责构造邮件。
周小董
2019/03/25
1.4K0
python自动发邮件总结及实例说明
【Python实用工具】巧妙利用Python实现发送带附件的邮件
SMTP(Simple Mail Transfer Protocol)即简单邮件传输协议,它是一组用于由源地址到目的地址传送邮件的规则,由它来控制信件的中转方式。
天道Vax的时间宝藏
2021/08/11
2.5K0
Android 天气APP(五)天气预报、生活指数的数据请求与渲染
天气预报是预测未来几天的天气,常用列表显示,实现这个功能的业务逻辑是:访问API、获取返回值、列表配置、数据渲染。首先是API接口。
晨曦_LLW
2020/09/25
1.6K0
Android  天气APP(五)天气预报、生活指数的数据请求与渲染
SAS-爬取帖子下的邮箱,给他们发一封邮件(续1)...
如果想用SAS发邮件,还是需要在邮箱中配置一下的,比如开启SMTP,这个就需要登录网页版邮箱去开启,其实本来打算用网易邮箱为例,不过最近登录网易邮箱进行设置我一直点不动...所以就以新浪、搜狐、QQ邮箱为例...
Setup
2019/10/21
1.2K0
SAS-爬取帖子下的邮箱,给他们发一封邮件(续1)...
用python实现自动发送天气预报
假如我们给多个人发送天气情况,这几个人来自不同的城市,那么我们不可能每次都要输入城市名,然后查找城市码,然后再访问接口,获取天气情况,这样会非常的麻烦,所以我们需要考虑将城市名跟城市码一一对应起来,说到一一对应,首先想到的数据结构便是字典,所以我们可以将这些信息存入一个字典里,然后持久化到一个文件中,这样便方便很多
dogfei
2020/07/31
1K0
Scrapy框架之爬取城市天气预报
1.项目初始化2.提取数据 2.1 原理分析 2.2 数据抽取 2.3 自定义spider3.存储数据 3.1 修改settings.py 3.2 数据存储4.结果展示5.作者的话
公众号guangcity
2019/09/20
1.8K1
Scrapy框架之爬取城市天气预报
Android 天气APP(十一)未来七天的天气预报、逐小时预报、UI优化
如果你看到这里那么你应该看过前面十篇文章了,这是第十一篇,其实写作的原意,并不是我想分这么多章节的,但是不得不分章节,我不能只考虑自己不考虑阅读的人,试问,我这里有一篇20万字的博客,你要不要看一下呢?你可能会望而却步吧,从而失去兴趣,故分章节,但请放心,我不是标题党,也不做无意义的分章节,标题肯定是要对应里面的内容的,现在有些博主写文章花里胡哨的,就靠标题吸引人,里面的内容都在胡扯,没有一点意义,题不对意,别人提问也不回复,这样就是不负责任,对此,我表示强烈的谴责和抗议。
晨曦_LLW
2020/09/25
9370
Android 天气APP(三)访问天气API与数据请求
注册用邮箱就可以了,这里没有什么好讲解的,我是已经注册过了,所以我登录就可以了,然后进入控制台,创建应用。
晨曦_LLW
2020/09/25
3.9K0
Android  天气APP(三)访问天气API与数据请求
python邮件发送和图片
​ 上班时间干别的事情是不太好的,如果被别人看到的话会很大程度上影响个人的前进的步伐。但是如果工作做的差不多了,那么闲着也是闲着。反正cpu资源浪费一天就是一天的折旧,那还不如多学点东西。我们之前的过程都需要点击运行,然后出来一个图。这种方式目标太大,容易被人发现。那么我们做个定时任务。然后把图片不显示,而是保存为图片。运营结束之后将图片放到邮件里,然后发送到手机。相对短信需要花费金钱来说,邮件最好了。
写一点笔记
2020/11/27
9730
Pyhton爬虫爬取天气情况以及情话
参考:https://blog.csdn.net/blowfire123/article/details/99173295
cuijianzhe
2022/06/14
3590
Pyhton爬虫爬取天气情况以及情话
python发送邮件(二)——smtplib模块和email模块
一、模块介绍 1、smtplib 模块(用于邮件的发送) ①理论解释 smtplib.SMTP([host[, port[, local_hostname[, timeout]]]]) 通过这个语句,可以向SMTP服务器发送指令,执行相关操作(如:登陆、发送邮件)。所有的参数都是可选的。 host:smtp服务器主机名 port:smtp服务的端口,默认是25;端口号可以省略。 但是使用25号端口有一个问题,就是保密性不够好,数据都是明文传输,没有加密。 现在一般都推荐使用SSL,Secure So
Elsa_阿尼
2021/07/27
5.6K0
python发送邮件(二)——smtplib模块和email模块
Python爬虫 --- 2.4 Scrapy之天气预报爬虫实践
写一个真正意义上一个爬虫,并将他爬取到的数据分别保存到txt、json、已经存在的mysql数据库中。
緣來
2018/09/18
6890
Python爬虫 --- 2.4 Scrapy之天气预报爬虫实践
Python爬虫项目--爬取某宝男装信息
1) 找到对应的URL, URL里的参数正是Query String Parameters的参数, 且请求方式是GET
py3study
2020/01/19
9210
Python爬虫项目--爬取某宝男装信息
爬虫实例八:爬取天气预报数据,并实现数据可视化
在爬取数据时,有些数据,如图片、视频等等,爬到就是赚到;而有时候,我们爬到的可能只是一些数字,表面上,看上去没什么意义,但当我们换一种角度来看待问题的话,可能又是一个崭新的世界。于是,我今天学习了一下数据的可视化。
远方的星
2021/03/02
8.8K1
爬虫实例八:爬取天气预报数据,并实现数据可视化
推荐阅读
相关推荐
zabbix邮件报警python脚本
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验