美文网首页
python爬虫---短信通知(二)

python爬虫---短信通知(二)

作者: icessun | 来源:发表于2018-07-31 23:09 被阅读38次

    发送邮件

    from email.mime.text import MIMEText
    message = MIMEText('Gitchat is funny!', 'plain', 'utf-8')
    

    首先我们导入 email 模块,该模块用来构造我们需要传输的邮件信息。从 email 模块中导入 MIMEText 对象。MIMEText 一共有三个参数:第一个参数为“邮件正文”;第二个参数指定“文本类型”,这里我们指定的是 plain,即文本信息;第三个参数为“正文编码”,即指定我们邮件正文的编码,防止因为编码错误而导致邮件正文乱码的情况出现。

    # 导入smtplib模块,用来发送邮件
    import smtplib
    user_mail = '你本人的邮箱地址'
    password = '你的邮箱授权码'   # 注意不是登录密码是授权密码
    send_mail = '收件人的邮箱地址'
    smtp_server = '你所在邮箱的smtp服务器地址'
    
    server = smtplib.SMTP(smtp_server, 25)  # smtp的端口号默认是25
    server.set_debuglevel(1)
    server.login(user_mail, password)
    # 发送邮件到对方的邮箱
    server.sendmail(user_mail, [send_mail], message.as_string())
    # 结束服务
    server.quit()
    
    smtp服务器地址

    执行上面的代码的时候出现503错误:是因为邮箱的登录密码不是真正的登录密码,而是应该输入授权密码(是用于登录第三方邮件客户端的专用密码),使用python发送邮件时相当于自定义客户端根据用户名和密码登录,然后使用SMTP服务发送邮件,QQ邮箱是默认不开启客户端授权的,因此登录总是被拒绝;解决办法:进入QQ邮箱-设置-客户端授权密码-开启(授权码是用于登录第三方邮件客户端的专用密码),非第三方登录密码不变。

    535报错
    生成授权码

    解决上面的错误后,发送成功


    发送成功
    收到邮件

    实战:某新闻网站重大新闻邮件通知小服务

    前面说明了怎么样爬取网页信息,把收集到的信息存储在数据库中,和发送电子邮件通知;现在结合前面的三个部分,写一个小实战。

    # 封装网络获取的信息
    
    import requests
    from bs4 import BeautifulSoup
    import re
    def getUrlCoding(data):  # 解决网站的编码问题
        charset = 'utf-8'
        if data.encoding.lower() == 'utf-8' or data.encoding == 'utf8':
            return 'utf-8'
        if data.encoding.lower() == 'gb2312':
            return 'gb2312'
        if data.encoding.lower() == 'gbk':
            return 'gbk'
        if data.encoding.lower() == 'gb18030':
            return 'GB18030'
        m = re.compile('<meta .*(http-equiv="?Content-Type"?.*)?charset="?([a-zA-Z0-9_-]+)"?', re.I).search(data.text)
        if m and m.lastindex == 2:
            charset = m.group(2).lower()
        return charset
    def get_info(url):
        response = requests.get(url)
        if response.status_code == 200:
            response.encoding = getUrlCoding(response)
            soup = BeautifulSoup(response.text, 'lxml')
            big_news = soup.select('#js_top_news > h2:nth-of-type(1) > a')[0].get_text()
            url = soup.select('#js_top_news > h2:nth-of-type(1) > a')[0].get('href')
            return "新闻标题:"+big_news+"\n新闻地址:"+url
    

    上面爬取网页信息之后,需要发送邮件去通知;现在配置邮件通知服务:

    # 发送邮件至对应的邮箱
    
    from email import encoders
    from email.header import Header
    from email.mime.text import MIMEText
    from email.utils import parseaddr, formataddr
    import smtplib
    def _format_addr(s):
        name, addr = parseaddr(s)
        return formataddr((Header(name, 'utf-8').encode(), addr))
    def send_mail(text):
        from_addr = '你的邮箱地址'
        password = '邮箱授权密码,不是登录密码'
        to_addr = '收件人的邮箱地址'
        smtp_server ='你邮箱的smtp服务器地址'
        msg = MIMEText(text, 'plain', 'utf-8')
        msg['From'] = _format_addr('XX大新闻 <%s>' % from_addr)
        msg['To'] = _format_addr('收件人 <%s>' % to_addr)
        msg['Subject'] = Header('XX新闻提醒', 'utf-8').encode()
        server = smtplib.SMTP(smtp_server, 25)
        server.set_debuglevel(1)
        server.login(from_addr, password)
        server.sendmail(from_addr, [to_addr], msg.as_string())
        server.quit()
    

    服务运行入口:

    if __name__ == '__main__':
        crawl_url = "https://news.163.com/"
        content = get_info(crawl_url)
        send_mail(content)
    

    在主函数中,首先我们指定了待爬取页面的 URL,然后将该 URL 传送至 get_info 函数中,获取到网页对应的新闻内容,然后将新闻内容传送到 send_mail 函数中,发送至对应的邮箱;运行的效果:


    image.png

    短信通知

    • 使用 API 接口发送短信
      常见的 API 接口文档一般分为两种:一种是基于 Token 验证的 API 接口;一种是直接提供 SDK。
    • 基于 Token 验证的 API 接口
      基于 Token 验证的 API 接口目前广泛应用于各个服务提供商提供的服务中,比如我们经常使用的百度地图 AP接口:
    http://api.map.baidu.com/geocoder/v2/?address=北京市海淀区上地十街10号&output=json&ak=您的ak&callback=showLocation //GET请求
    

    在上述的 API 地址中,ak 就是我们用来验证用户信息的 Token。系统在后台为每个用户的不同应用都提供了一个独一无二的 ak 字符串。只有用户提供了正确的 ak 字符串,系统才会返回正确的结果。

    • SDK 方式的 API 接口

    使用 Token 验证的方法提供 API 接口,的确大大方便了开发者的开发过程,但是也随之带来了很多的问题,比如编码错误、请求的文字太多系统无法处理等等。

    这个时候,各大厂商便提供了第二种方法:使用厂商提供的 SDK 进行短信发送。目前比较常见的短信服务提供商,例如阿里巴巴、腾讯、百度等,大都推出各自的短息 SDK,向开发者提供短信发送服务。

    天气预报的短信通知服务小实战

    • 申请天气预报 API 接口
      首先登陆百度开放平台首页,进入控制台。第一次进入控制台时会要求进行验证,大家直接输入相应的信息即可。然后点击“创建新应用”,输入应用名称这里我们称它为“天气预报”,下面不要做改动,直接点击确认即可。
    百度开发平台

    返回控制台页面,我们可以看到“天气预报”所对应的 ak 值。

    百度的天气预报 API 请求接口为:http://api.map.baidu.com/telematics/v3/weather?location=点&output=json&ak=你的ak值

    这里我们选择城市为杭州,输入上面的 ak 值,使用浏览器访问,得到的返回结果如下:

    {"error":0,"status":"success","date":"2018-06-28","results":[{"currentCity":"杭州","pm25":"42","index":[{"des":"天气炎热,建议着短衫、短裙、短裤、薄型T恤衫等清凉夏季服装。","zs":"炎热","tipt":"穿衣指数","title":"穿衣"},{"des":"较适宜洗车,未来一天无雨,风力较小,擦洗一新的汽车至少能保持一天。","zs":"较适宜","tipt":"洗车指数","title":"洗车"},{"des":"各项气象条件适宜,发生感冒机率较低。但请避免长期处于空调房间中,以防感冒。","zs":"少发","tipt":"感冒指数","title":"感冒"},{"des":"天气较好,但风力较强,在户外要选择合适的运动,另外考虑到天气炎热,建议停止高强度运动。","zs":"较不宜","tipt":"运动指数","title":"运动"},{"des":"属中等强度紫外线辐射天气,外出时建议涂擦SPF高于15、PA+的防晒护肤品,戴帽子、太阳镜。","zs":"中等","tipt":"紫外线强度指数","title":"紫外线强度"}],"weather_data":[{"date":"周四 06月28日 (实时:30℃)"}]}]}
    

    相关文章

      网友评论

          本文标题:python爬虫---短信通知(二)

          本文链接:https://www.haomeiwen.com/subject/ysykvftx.html