Python + Selenium + Jenkins完成每日自定义天气邮件订阅

Selenium入门

Posted by Zero on July 12, 2019

科技让生活更美好

困扰: 福州这天气,阴晴不定,变化莫测,太阳雨,晴天霹雳,怎么变态怎么来 经常下了楼,下雨没带伞,大日没带防晒衣。所以我在想,做个定时提醒,比如上班前5分钟告诉我, 天气情况,下班前5分钟告诉我下没下雨。。。

中央气象局的界面就做的很好啊,还有可视化图表!!!

说搞就搞

  • 温习了一下Scrapy,对这个框架的理解,比一年前玩的时候好多了,这就是一个很好的面对对象的框架典范
  • 把爬取的数据存到item里,
  • 用PrettyTable打印出表格,心满意足,
  • 但是发送到邮件,就不尽人意了,文本有长度限制,然后换行,在邮件中的显示就很糟糕,可读性几乎为0。
    +----------+--------+--------+----------+-----------+----------+----------+----------+
    | 精细预报 | 17:00  | 20:00  |  23:00   | 18日02:00 |  05:00   |  08:00   |  11:00   |
    +----------+--------+--------+----------+-----------+----------+----------+----------+
    |   气温   | 32.3℃  | 30.4℃  |  28.6℃   |   27.6℃   |  27.2℃   |  29.8℃   |  31.6℃   |
    |   降水   | 无降水 | 无降水 | 0.5毫米  |  0.8毫米  | 0.6毫米  | 0.4毫米  |  无降水  |
    |   风速   | 3米/秒 | 2米/秒 | 2.3米/秒 |  2.7米/秒 | 1.9米/秒 | 2.1米/秒 | 3.1米/秒 |
    |   风向   | 东北风 | 东北风 |  东北风  |   东北风  |  东北风  |  东北风  |  东北风  |
    | 相对湿度 | 75.8%  | 81.1%  |  83.7%   |   84.2%   |  85.9%   |  84.8%   |  66.2%   |
    |   云量   | 69.9%  | 79.9%  |  83.3%   |    100%   |  93.2%   |  94.8%   |  58.3%   |
    +----------+--------+--------+----------+-----------+----------+----------+----------+
    
  • 于是乎,我转念一想,这个网站的界面做得已经很美了,我为啥要把数据整出来自己做画面呢,直接用他的界面不就好了。
  • 然后就搞起了截图的勾当。。。
  • 之前的爬取就前功尽弃了,写到这里,我在想,我们做事情还是要想好再开始搞,不能像我这样,想一步做一步,效率太低下了。
  • 这个道理太重要了!!!划重点。 三思而后行,凡事预则立不预则废!!<\b>

  • selenium 有提供截屏的功能,并且可以可以对指定元素进行截图。真是太好用了。
  • 找到指定元素,截图,
  • 然后用smtplib 发送邮件,相关代码网上都很齐全,然后在发图片的时候有遇到一个麻烦的,就是图片怎么当成正文发
  • emmm markdown在代码块里输入html各种miss,不懂怎么处理
      @staticmethod
      def AttachOneImageInBody(msg, fileName):
          with open(fileName, 'rb') as f:
              msgImage = MIMEImage(f.read())
              # 定义图片 ID,在 HTML 文本中引用
              msgImage.add_header('Content-ID', '丢失部分1')
              msg.attach(msgImage)
              #正文显示附件图片
              msg.attach(MIMEText('丢失部分', 'html', 'utf-8'))
    
    • 丢失部分 = <html><body><p><img src=”cid:image1”></p></body></html>
    • 丢失部分1 = <image1>
  • 还有就是 怎么在正文发多个图片
    # 调试发送多张图片的时候遇到的最蛋疼的问题:
    # 用for循环生成的mail_msg,不能直接attach,需要和content一起attach
    @staticmethod
    def AttachMultipleImageInBody(msg, *args):
        body = '丢失部分1'
        for fileName in args:
            with open(fileName, 'rb') as f:
                msgImage = MIMEImage(f.read())
                # 定义图片 ID,在 HTML 文本中引用
                msgImage.add_header('Content-ID', '丢失部分2' % fileName)
                msg.attach(msgImage)
                body = body + '丢失部分3' % fileName
        #正文显示附件图片
        body = body + '丢失部分4'
        msg.attach(MIMEText(body, 'html', 'utf-8'))
  • 丢失部分1 = <html><body>
  • 丢失部分2 = <%s>
  • 丢失部分3 = </body></html>
  • 丢失部分4 = <p><img src=”cid:%s”></p>

####解决了以上问题,然后部署到jenkins上,定时构建,再不不用担心这鬼天气了,每天上下班定时定点告诉我天气情况!!!