Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 韩国色三级伦不卡高清在线观看,久久亚洲精品中文字幕60分钟,久操视频在线观看免费

          整合營銷服務商

          電腦端+手機端+微信端=數據同步管理

          免費咨詢熱線:

          如何用python生成簡單的html report報告

          提:

          用python寫了一個簡單的log分析,主要也就是查詢一些key,value出來,后面也可以根據需求增加。查詢出來后,為了好看,搞個html 表格來顯示。

          需要的組件: jinja2 flask 的模板。

          先說下設計思路,主要是練習python代碼玩,高手略過

          模擬scrapy,搞個管線


          每個管線分預處理,分析器,和后處理。預處理的話,可以篩選下數據,分析器提取關鍵信息,然后把結果丟給后處理。html報表就是在后處理生成。

          再搞個manger類,管理很多個管線,雖然現在單路pipeLine就完成了,說不定以后還能擴展呢。



          我們可以定義預處理,比如過濾一些不關注的關鍵字,或者關注一些特定關鍵字的行


          預處理的話,只處理QtiDCT-C關鍵字的日志行。

          然后把經過預處理后的數據丟給分析器

          主要查詢行數據行里面是否有keyword,然后根據分隔符,和結束符來提取內容

          keyword delimiter xxxxxendwith 這樣個模式

          獲取最終結果存儲到字典里面 result[keyword]=xxxx。這里會trim,去掉 \r\n.

          這樣就有了結果集result.最后丟給posthandler 后處理。完成報表輸出。


          后處理主要是用jinja2的模板,然后傳遞參數,生成最終的html文件。

          這里的jinja_template.temple, 內容如下



          有了模板,就可以在渲染模板的時候提供字典,變量,在模板里面顯示。最終完成報表的輸出。


          最終使用


          最終在main 方法中,通過-d參數傳入log所在目錄,然后迭代所有的文件,使用input 把文本文件轉換成行數據的list,丟給管線,最后把管線丟給manager,調用process ,完成txt日志的分析,到最后html的生產。

          碼功能:

          每周一、每周五會有一個shell從數據庫中查詢相關數據統計報告到一個record記錄中,這個python程序就是負責分析record并以表格形式發送郵件給相關人員。

          用的時候需要修改的地方:file_mon/file_fri 這兩個文件路徑,還有發送郵件的郵件服務器賬號密碼,以及收件人列表

          效果預覽:正常狀態(復制代碼時注意縮進,頭條這個地方比較坑,發的時候是帶縮進的,但是發布成功縮進就沒了)

          非正常狀態,郵件中會提示異常原因(檢測爬蟲采集數據的變化量)

          正常狀態請點擊此處輸入圖片描述

          # -*- coding:utf-8 -*-
          import os
          from datetime import datetime, time
          from datetime import timedelta
          from email.mime.multipart import MIMEMultipart
          from email.mime.multipart import MIMEBase
          from email.mime.text import MIMEText
          import smtplib
          """
           AUTHOR: tommy.yu
           Email: xxx 下面str_mon/str_fri 分別是每周一跟每周五記錄的數據格式,放到服務器上的時候就可以用文件來記錄,這里方便調試用的變量
          """
          str_mon = "2123332,11,2017-12-16 10:00:00,2017-12-16 10:00:11"
          str_fri = "8804324,2223332,11,2017-12-18 10:00:00,2017-12-19 10:00:11"
          file_mon = "/mnt/167_tmp/data_Monday"
          file_fri = "/mnt/167_tmp/data_Friday"
          if os.path.exists(file_mon):
          str_mon = open(file_mon).read().split("\n")[1]
          else:
          print("%s不存在" % file_mon)
          if os.path.exists(file_fri):
          str_fri = open(file_fri).read().split("\n")[1]
          else:
          print("%s不存在" % file_fri)
          now = datetime.now()
          list_mon = str_mon.split(",")
          list_fri = str_fri.split(",")
          # 周一統計的url提交數量
          data_mon = list_mon[0]
          # 周五統計的url提交數量
          data_fri = list_fri[1]
          # 本周工作日提交數量
          data_diff = int(data_fri) - int(data_mon)
          if len(list_fri) == 5:
          # 輿情臨時庫記錄總量
          content = list_fri[0]
          # 獲取從數據庫中查出來的最近記錄寫入時間
          end = list_fri[3].split(" ")[0]
          # 獲取當前周的周五
          # 0,1,2,3,4,5,6 分別代表周一到周日
          cur_monday = now - timedelta(datetime.now().weekday() - 0)
          cur_friday = now - timedelta(datetime.now().weekday() - 4)
          monday = cur_monday.strftime("%Y-%m-%d")
          friday = cur_friday.strftime("%Y-%m-%d")
          print("時間范圍:%s~%s" % (monday, friday))
          if friday != end:
          spider_status = "異常"
          weekday = now.strftime("%A")
          spider_status_content = "異常原因:爬蟲狀態不正常,數據庫中存儲的最近一條信息創建時間為: " + str(list_fri[3]) + " 當前時間為: " + str(now) + weekday
          else:
          spider_status = "正常"
          spider_status_content = ""
          print("爬蟲狀態正常")
          def send_mail(to_list, sub):
          me = mail_user
          msg = MIMEMultipart()
          msg['Subject'] = sub
          msg['From'] = me
          msg['To'] = ",".join(to_list)
          # 構造html
          html = """\
          <html xmlns="http://www.w3.org/1999/xhtml">
          <head>
          <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
          <title>運維日常數據統計報告</title>
          <body>
          <div id="container">
           <p><strong>運維日常數據統計報告</strong></p>
           <p>采集時間: """ + monday + "~" + friday + """</p>
           <div id="content">
           <table border="1" bordercolor="black" >
           <tr>
           <td>輿情臨時庫記錄總量(截止到周末的數量)</td>
           <td>關鍵詞導入狀態</td>
           <td>URL提交數量(周一)</td>
           <td>URL提交數量(周五)</td>
           <td>本周提交url總數</td>
           <td>本周工作日平均url數量</td>
           </tr>
           <tr>
           <td>""" + content + """</td>
           <td>""" + spider_status + """</td>
           <td>""" + data_mon + """</td>
           <td>""" + data_fri + """</td>
           <td>""" + str(data_diff) + """</td>
           <td>""" + str(data_diff / 5) + """</td>
           </tr>
          </table>
           </div>
          </div>
          <p><strong>""" + spider_status_content + """</strong> </p>
          </div>
          </body>
          </html>
           """ context = MIMEText(html, _subtype='html', _charset='utf-8') # 解決亂碼
          msg.attach(context)
          try:
          send_smtp = smtplib.SMTP()
          send_smtp.connect(mail_host)
          send_smtp.login(mail_user, mail_pass)
          send_smtp.sendmail(me, to_list, msg.as_string())
          send_smtp.close()
          return True
           except Exception as e:
          print(e)
          return False
          """"""
          if __name__ == '__main__':
          # 設置服務器名稱、用戶名、密碼以及郵件后綴
          mail_host = 'xxx'
          mail_user = 'xxx'
          mail_pass = '123456'
          # mailto_lists = sys.argv[1]
           # mailto_list = mailto_lists.split(',') #發送多人
           # sub= sys.argv[2]
          mailto_list = ['xxx@xxx.com', ]
          sub = "運維日常數據統計報告--" + "采集時間:" + monday + "~" + friday
          # send_mail(mailto_list, sub)
          if send_mail(mailto_list, sub):
          print("Send Mail Success !!!")
          else:
          print("Send mail Failed !!!")

          歡迎指正。

          今天筆者想和大家聊聊Python+selenium自動化生成測試報告,批量執行完用例后,生成的測試報告是文本形式的,不夠直觀,為了更好的展示測試報告,最好是生成HTML格式的。

          unittest里面是不能生成html格式報告的,需要導入一個第三方的模塊:HTMLTestRunner

          一、導入HTMLTestRunner

          1.這個模塊下載不能通過pip安裝了,只能下載后手動導入。

          2.Download下HTMLTestRunner.py文件就是我們需要下載的包。

          3.下載后復制到Python安裝文件的Lib目錄下

          二、生成html測試報告

          1.這里主要有三個參數:

          stream:測試報告寫入文件的存儲區域

          title:測試報告的主題

          description:測試報告的描述

          2. report_path是存放測試報告的地址

          運行腳本后在F盤指定位置就能找到這個測試報告文件,這時候如果文件多了,不知道測試報告在哪天生成的?能否在文件名上顯示一個日期和時間呢?當然是可以的

          備注:

          %Y-%m-%d為年月日

          %H-%M為時分 注意:時間之間不能使用冒號(:)因為文件名不能使用冒號

          三、測試報告詳情

          1.找到測試報告文件,用瀏覽器打開,點開View里的Detail可以查看詳情描述。

          紅框中內容顯是英文,我們不能直觀看出是什么測試用例,可以在測試代碼中添加中文注釋,注釋前面要加字母u,代碼修改如下:

          四、再次運行run_all_case腳本文件后,查看HTML測試報告

          五 unittest斷言

          Python在 unittest.TestCase 類中提供了很多斷言方法。斷言方法檢查你認為應該滿足的條件是否確實滿足。如果該條件確實滿足,你對程序行為的假設就得到了確認,你就可以確信其中沒有錯誤。如果你認為應該滿足的條件實際上并不滿足,Python將引發異常。下表描述了6個常用的斷言方法。使用這些方法可核實返回的值等于或不等于預期的值、返回的值為 True 或 False 、返回的值在列表中或不在列表中。你只能在繼承 unittest.TestCase 的類中使用這些方法。

          unittest常用的斷言方法

          方法

          用途

          assertEqual(a, b)

          核實 a == b

          assertNotEqual(a, b)

          核實 a != b

          assertTrue(x)

          核實 x 為 True

          assertFalse(x)

          核實 x 為 False

          assertIn( item , list )

          核實 item 在 list 中

          assertNotIn( item , list )

          核實 item 不在 list 中

          六、unittest常用的斷言方法

          1.assertEqual(self, first, second, msg=None)

          --判斷兩個參數相等:first == second

          2.assertNotEqual(self, first, second, msg=None)

          --判斷兩個參數不相等:first != second

          3.assertIn(self, member, container, msg=None)

          --判斷是字符串是否包含:member in container

          4.assertNotIn(self, member, container, msg=None)

          --判斷是字符串是否不包含:member not in container

          5.assertTrue(self, expr, msg=None)

          --判斷是否為真:expr is True

          6.assertFalse(self, expr, msg=None)

          --判斷是否為假:expr is False

          7.assertIsNone(self, obj, msg=None)

          --判斷是否為None:obj is None

          8.assertIsNotNone(self, obj, msg=None)--判斷是否不為None:obj is not None

          實例:assertEqual(a, b),其它的斷言方法請自行嘗試)

          總結

          今天的這篇文章就分享到這里了,喜歡的小伙伴記得點贊評論收藏加關注喲,關注我每天給大家不同的驚喜。


          主站蜘蛛池模板: 国产成人精品无码一区二区| 亚洲国产成人一区二区三区| 精品三级AV无码一区| 亚洲国产一区国产亚洲| 日本一区免费电影| 久久99精品一区二区三区| 国产高清精品一区| 无码一区二区三区亚洲人妻 | 色婷婷香蕉在线一区二区| 久久精品无码一区二区app| 波多野结衣一区二区三区88| 亚洲欧美日韩中文字幕在线一区| 亚洲AV无码一区东京热久久| 亚洲日韩国产一区二区三区| 视频一区在线免费观看| 香蕉久久AⅤ一区二区三区| 无码中文字幕乱码一区| 精品无码一区在线观看| 人妻无码久久一区二区三区免费| 寂寞一区在线观看| 久久中文字幕一区二区| 中文无码精品一区二区三区| 91福利国产在线观看一区二区 | 精品无人区一区二区三区| 日韩电影一区二区三区| 色欲综合一区二区三区| 日韩内射美女人妻一区二区三区| 久久久精品人妻一区二区三区| 国产亚洲欧洲Aⅴ综合一区| а天堂中文最新一区二区三区| 麻豆一区二区三区蜜桃免费| 男人的天堂精品国产一区| 一区二区三区电影网| 综合无码一区二区三区| 综合久久一区二区三区| 亚欧色一区W666天堂| 中文字幕av日韩精品一区二区| 欧美日本精品一区二区三区| 色欲AV无码一区二区三区| 国产在线精品一区二区三区不卡| 久久久国产精品一区二区18禁|