zoukankan      html  css  js  c++  java
  • 自动定位获取定位城市天气信息

    1、获取定位城市

    定位url:http://ip-api.com/json/?lang=zh-CN

    数据格式为json

    # get_city.py
    
    import requests
    import sys
    
    
    def get_CityName():
        try:
            res = requests.post(url='http://ip-api.com/json/?lang=zh-CN', data={'ip': 'myip'}, timeout=10)
            result = res.json()['city']
        except:
            print(" [!]正在进行网络自检并重试")
            try:
                res = requests.post(url='http://ip-api.com/json/?lang=zh-CN', data={'ip': 'myip'}, timeout=15)
                result = res.json()['city']
            except:
                print(" [!]无法从相关网站获得请求(请求总时长:25s),退出脚本")
                sys.exit(1)
    
        if len(result) == 0:
            print(' [!] 未自动匹配到你所在地的地区信息:' + result)
        return result

    2、根据定位城市查询天气信息

    # weather_utils.py
    
    import sys
    import re
    import requests
    import bs4
    import json
    import time
    import urllib as urlparse
    import http.client
    from get_city import get_CityName
    
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:66.0) Gecko/20100101 Firefox/66.0'
    }
    
    
    def get_weather_li():
    
        def get_city_code(city):
            try:
                parameter = urlparse.parse.urlencode({'cityname': city})
                conn = http.client.HTTPConnection('toy1.weather.com.cn', 80, timeout=5)
                conn.request('GET', '/search?' + parameter)
                r = conn.getresponse()
                data = r.read().decode()[1:-1]
                json_data = json.loads(data)
                code = json_data[0]['ref'].split('~')[0]
                return code
            except:
                print(' [!] 错误,未能找到该地区信息')
                print(" [#] 退出脚本")
                sys.exit()
    
        def get_weaPage(url, headers):
            res = requests.get(url, headers=headers)
            s = res.content
            s.decode('ISO-8859-1')
            bs = bs4.BeautifulSoup(s, "html.parser")
            html = bs.prettify()
            return html
    
        def GetItem(name, list):
            name = re.findall(r'"' + list + '":"(.*?)"', name)
            name = "".join(name)
            return name
    
        def get_weather(City_code, li):
    
    
            headers1 = {
                'Referer': "http://www.weather.com.cn",
                'Cookie': '',
                'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:66.0) Gecko/20100101 Firefox/66.0'
            }
    
            t = time.time()
            timestamp = str(int(round(t * 1000)))
            port = "http://d1.weather.com.cn/weather_index/" + City_code + ".html?_=" + timestamp
            html = get_weaPage(port, headers1)
    
            wea_list_all = html.split("var")
            html1 = wea_list_all[1]
            wea_list1 = html1.split(",")
    
            # 城市英文
            city_en = wea_list1[1]
            city_en = GetItem(city_en, "cityname")
            # 温度区间
            maxtemp = wea_list1[2]
            maxtemp = GetItem(maxtemp, "temp")
    
            mintemp = wea_list1[3]
            mintemp = GetItem(mintemp, "tempn")
            # 实时天气
            wea_now = wea_list1[4]
            wea_now = GetItem(wea_now, "weather")
    
            # alarmDZ
            # -----------------------------------------------------
            wea_list2 = wea_list_all[2]
            wea_alarm_all = re.findall(r'alarmDZ ={"w":[(.*?)]};', wea_list2)
            warning = 0
            EmptyList = ['']
            if wea_alarm_all == EmptyList:
                pass
            else:
                warning = 1
    
            # dataSK
            # -----------------------------------------------------
            html3 = wea_list_all[3]
            wea_list3 = html3.split(",")
            # 城市
            cityname = wea_list3[1]
            cityname = GetItem(cityname, "cityname")
            # 当前温度
            temp_now = wea_list3[3]
            temp_now = GetItem(temp_now, "temp")
            # 湿度
            wet = wea_list3[9]
            wet = GetItem(wet, "SD")
            # 时间
            update = wea_list3[13]
            update = GetItem(update, "time")
            # 空气质量
            aqi = wea_list3[16]
            aqi = GetItem(aqi, "aqi")
            # PM2.5
            aqi_pm25 = wea_list3[17]
            aqi_pm25 = GetItem(aqi_pm25, "aqi_pm25")
            # 日期
            date = wea_list3[22]
            date = GetItem(date, "date")
            # dataZS
            wea_list4 = wea_list_all[4]
            umbrella = GetItem(wea_list4, "ys_des_s")
            # 和风天气
            qwea_url = "https://www.qweather.com/weather/" + city_en + "-" + City_code + ".html"
            qwea_html = get_weaPage(qwea_url, headers)
            wea_comment = re.findall(r'<p class="c-city-weather-current__abstract">(.*?)</p>'
                                     , qwea_html, flags=16)
            wea_comment = "".join(wea_comment)
            aqi_level = re.findall(r'<p class="air-chart-container__aqi-level">(.*?)</p>'
                                   , qwea_html, flags=16)
            aqi_level = aqi_level[0].replace("
    ", "")
            aqi_level = aqi_level.replace(" ", "")
            # wea_comment = wea_comment.strip('
    ')
            wea_comment = wea_comment.replace(" ", "").replace("
    ", "")
    
            res_weather_lines = li
    
            res_weather_lines.append(wea_comment)
    
            res_weather_lines.append(" ==================================")
            res_weather_lines.append(" 定位城市:  " + cityname)
            res_weather_lines.append(" 实时天气:  " + wea_now)
            res_weather_lines.append(" 实时温度:  " + temp_now + "")
            res_weather_lines.append(" 温度区间:  " + maxtemp + "℃ - " + mintemp + "")
            res_weather_lines.append(" 空气湿度:  " + wet)
            res_weather_lines.append(" 空气质量:  " + aqi + "(" + aqi_level + "),PM2.5: " + aqi_pm25)
            res_weather_lines.append(" 雨具携带:  " + umbrella)
            res_weather_lines.append(" [更新时间: " + date + " " + update + "]")
            res_weather_lines.append(" ==================================")
            if warning == 1:
                wea_alarm_all = "".join(wea_alarm_all)
                wea_alarm = re.findall(r'"w9":"(.*?)"', wea_alarm_all)
                wea_counter = len(wea_alarm)
                if wea_counter == 1:
                    res_weather_lines.append(" [!]气象部门发布预警,请注意:")
                else:
                    res_weather_lines.append(" [!]气象部门发布" + str(wea_counter) + "则预警,请注意:")
                if wea_alarm == "":
                    res_weather_lines.append(" [!]无法获取气象预警详情")
                else:
                    i = 1
                    for alarm in wea_alarm:
                        alarm = alarm.replace("\", "")
                        alarm = alarm.replace("", ":
     ", 1)
                        if wea_counter == 1:
                            res_weather_lines.append(" " + alarm)
                        else:
                            res_weather_lines.append(" [" + str(i) + "]" + alarm)
                            i = i + 1
            return res_weather_lines
    
        try:
            address = get_CityName()
            li = []
            li.append(" [+] 自动定位位置:" + address)
            code = get_city_code(address)
            li = get_weather(code, li)
    
            return li
        except Exception as Error:
            raise Error

    3、发送邮件

    # send_mail.py
    
    import smtplib
    from email.mime.text import MIMEText
    from weather_utils import get_weather_li
    from get_city import get_CityName
    
    
    mailto_list = ["xxx@sina.com", "xxx@qq.com"] # 接收人邮箱
    mail_host = "smtp.sina.cn"  # 设置服务器
    mail_user = "xxxx@sina.com"    # 用户名
    mail_pass = "passwd"   # 密码
    
    # 输出格式
    def html_table(lol):
        html_str = "<table>"
        for sub in lol:
            html_str += '<tr><td>'
            html_str += '</td><td>'.join(sub)
            html_str += '</td></tr>'
        html_str += "</table>"
        return html_str
    
    
    def send_mail(to_list, sub, content):     # 定义一个函数,收件人、标题、邮件内容
        me = "xxx@sina.com"+"<"+mail_user+">"   # 发件人定义,这里要和认证帐号一致才行的
        msg = MIMEText(content, _subtype='html', _charset='utf-8')  # 这里看email模块的说明,这里构造内容
        msg['Subject'] = sub
        msg['From'] = me
        msg['To'] = ",".join(mailto_list)
        try:
            server = smtplib.SMTP()
            server.connect(mail_host)
            server.login(mail_user, mail_pass)
            server.sendmail(me, to_list, msg.as_string())
            server.close()
            return True
        except Exception as e:
            print(str(e))
            return False
    
    
    if __name__ == '__main__':
        count = html_table(get_weather_li())
        if send_mail(mailto_list, get_CityName() + "天气", count):
            print("发送成功")
        else:
            print("发送失败")

    4、执行效果

    5 、计划任务每天早上7点执行

    0 7 * * * python3 /data/scripts/weather/send_mail.py

     【参考:https://github.com/whitejoce/Get_Weather】

  • 相关阅读:
    MAC OpenGL 环境搭建
    C++中调用OC代码
    XCode快捷键使用
    【iOS】史上最全的iOS持续集成教程 (下)
    【iOS】史上最全的iOS持续集成教程 (上)
    pod 指令无效
    iOS面试题总结(持续更新)
    数据结构与算法思维导图
    Swift编码规范总结
    同步异步执行问题
  • 原文地址:https://www.cnblogs.com/sxFu/p/15272233.html
Copyright © 2011-2022 走看看