Python爬蟲監(jiān)控(郵件和釘釘)

一、監(jiān)控的意義

爬蟲腳本是基于網(wǎng)站的結(jié)構(gòu)去寫的,但是隨著互聯(lián)網(wǎng)的發(fā)展环壤,很多公司的頁面結(jié)構(gòu)會發(fā)生變化,發(fā)生的變化就會導(dǎo)致我們寫的爬蟲失效钞诡,最主要的失效方式是xpath的失效镐捧。隨著我們寫的爬蟲越來越多,越就越來越難以發(fā)現(xiàn)這些失效的腳本臭增,導(dǎo)致數(shù)據(jù)更新失敗懂酱,不及時,或者不滿足抓取的質(zhì)量和數(shù)量要求誊抛。這就需要對爬蟲的腳本進行監(jiān)控列牺。

監(jiān)控的目的是讓數(shù)據(jù)及時的更新,腳本及時的發(fā)現(xiàn)bug以及解決bug拗窃。提高我們的工作效率瞎领。更好的保證線上數(shù)據(jù)產(chǎn)品的優(yōu)質(zhì)性。

我們需要介紹兩種常見的監(jiān)控方式:1随夸、郵件 2九默、釘釘

二、Python郵件監(jiān)控(SMTP)

1. SMTP簡介

SMTP(Simple Mail Transfer Protocol)即簡單郵件傳輸協(xié)議,它是一組用于由源地址到目的地址傳送郵件的規(guī)則宾毒,由它來控制信件的中轉(zhuǎn)方式驼修。
python的smtplib提供了一種很方便的途徑發(fā)送電子郵件。它對smtp協(xié)議進行了簡單的封裝。

Python創(chuàng)建 SMTP 對象語法如下

import smtplib
smtpObj = smtplib.SMTP( [host [, port [, local_hostname]]] )

參數(shù)說明:

  • host: SMTP 服務(wù)器主機乙各。 你可以指定主機的ip地址或者域名如: runoob.com墨礁,這個是可選參數(shù)。
  • port: 如果你提供了 host 參數(shù), 你需要指定 SMTP 服務(wù)使用的端口號耳峦,一般情況下 SMTP 端口號為25恩静。
  • local_hostname: 如果 SMTP 在你的本機上,你只需要指定服務(wù)器地址為 localhost 即可蹲坷。

Python SMTP 對象使用 sendmail 方法發(fā)送郵件驶乾,語法如下:

SMTP.sendmail(from_addr, to_addrs, msg[, mail_options, rcpt_options])

參數(shù)說明:

  • from_addr: 郵件發(fā)送者地址。
  • to_addrs: 字符串列表循签,郵件發(fā)送地址轻掩。
  • msg: 發(fā)送消息

這里要注意一下第三個參數(shù),msg 是字符串懦底,表示郵件。我們知道郵件一般由標題罕扎,發(fā)信人聚唐,收件人,郵件內(nèi)容腔召,附件等構(gòu)成杆查,發(fā)送郵件的時候,要注意 msg 的格式臀蛛。這個格式就是 smtp 協(xié)議中定義的格式亲桦。

2. 郵件監(jiān)控五個步驟

 #導(dǎo)入郵件包
 import smtplib
 
 # 1.創(chuàng)建郵件對象
    smtp_obj = smtplib.SMTP()
    
 # 2.連接服務(wù)器
    smtp_obj.connect()
    
  #3.登錄操作
    smtp_obj.login()
    
  #4.發(fā)郵件
     smtp_obj.sendmail()
     
  #5.退出操作
   smtp_obj.quit()

3. 郵件監(jiān)控發(fā)送(代碼)

# 導(dǎo)入發(fā)送郵件包
import smtplib
from email.mime.text import MIMEText  # 用來創(chuàng)建文本格式的郵件體內(nèi)容
from email.mime.multipart import MIMEMultipart
from email.mime.image import MIMEImage

class Send_Email:

    def __init__(self, num):
        self.num = num
        self.smtp = self.get_conn()
        # print(self.smtp)
        self.send_email()

    def get_conn(self):
        # 創(chuàng)建郵件對象
        smtp_obj = smtplib.SMTP()
        # 連接服務(wù)器
        smtp_obj.connect("smtp.163.com")
        # 登錄郵箱
        smtp_obj.login("13349949963@163.com", "zb376100870")
        return smtp_obj

    def send_email(self):
        # 定義發(fā)送郵件的三要素
        sender = "13349949963@163.com"
        receiver = "376100870@qq.com"
        # 獲取發(fā)送郵件的 郵件體
        msg = self.get_msg(sender, receiver)
        # 發(fā)送郵件
        self.smtp.sendmail(from_addr=sender, to_addrs=receiver, msg=msg.as_string())
        print("send success")

    def get_msg(self, sender, receiver):
        # 定義郵件主題
        subject = "恭喜你 你已經(jīng)被阿里巴巴公司錄用 "
        # 獲取郵件體中的 文本內(nèi)容(消息體)
        msg = self.get_content()
        # 生成郵件體的 三要素
        msg["From"] = sender
        msg["To"] = receiver
        msg["Subject"] = subject
        return msg

    def get_content(self):

        if self.num == 1:
            content = "請xx準時報到"
            # 將內(nèi)容寫到面板中  文本格式
            msg = MIMEText(content, "plain", "utf-8")
            return msg
        elif self.num==2:
            # 讀取文件
            # with open("02.html", "r", encoding="utf-8") as f:
            #     content = f.read()
            # print(type(content))
            content = """
            <html>
                <h1>請xx準時報到<h1>
                <a >baidu</a>
            </html>"""
            print(content)
            msg = MIMEText(content, "html", "utf-8")
            return msg
        elif self.num==3:
            #獲取含有內(nèi)嵌圖片資源的HTML格式的郵件體
            msg=self.get_pic()
            return msg
    #獲取圖片信息
    def get_pic(self):
        #通過cid圖片文件關(guān)聯(lián)起來
        content="<b>Some<i>HTML</i>text</b> and an image <br><img src='cid:image1'><br>goood"
        #如果content 中內(nèi)嵌資源,必須定義related字段
        #使用related定義內(nèi)嵌套資源的郵件體
        msgRoot=MIMEMultipart("related")
        #創(chuàng)建HTML格式的郵件體
        msgText=MIMEMultipart(content,"html","utf-8")
        #將msgText中的內(nèi)容附加到MIMEMultipart對象中
        msgRoot.attach(msgText)
        #讀取圖片文件內(nèi)容
        with open("2.jpg","rb")as f:
            result=f.read()
        #使用圖片信息創(chuàng)建一個圖片對象
        msgImage=MIMEImage(result)
        #指定文件的Content-ID 為image1
        msgImage.add_header("Content-ID","image1")
        #將msgImage中的圖片內(nèi)容附加到MIMEMultipart對象的指定image1當中
        msgRoot.attach(msgImage)
        #返回攜帶有內(nèi)嵌套圖片資源的HTML格式郵件的MIMEMultipart對象
        return msgRoot

    def __del__(self):
        # 關(guān)閉
        self.smtp.quit()


if __name__ == '__main__':
    #  1  # 發(fā)送的郵件體是字符串
   2  # 發(fā)送一個html的郵件體
   3 # 發(fā)送一個圖片的郵件體
   num=int(input("請發(fā)送郵件所對應(yīng)的數(shù)字"))
   Send_Email(num)

應(yīng)用場景:

  1. 鏈家租房 每天都要爬取一遍插入數(shù)據(jù)庫的時候 需要增加一個字段 更新插入時間refresh_time如果爬蟲 正常 這樣就可以保證 每天的refresh_time都是最新的

  2. 如何監(jiān)控那些 不正常更新的渠道(例如:鏈家租房),你可以寫sql語句查詢每個渠道的更新時間;浊仆。如果是最新的更新時間則說明是正常客峭;如果不是判斷多久沒有更新,說爬蟲數(shù)據(jù)異常抡柿。這時需要 給指定的負責人發(fā)郵件 讓他修改代碼 使得爬蟲正常運行舔琅。

郵件監(jiān)控和下面的釘釘監(jiān)控一樣,可以根據(jù)釘釘監(jiān)控來改寫

二洲劣、釘釘監(jiān)控

鏈家租房監(jiān)控腳本

import pymysql
import time
import requests
'''
kpi小姐姐的api接口:
https://oapi.dingtalk.com/robot/send?access_token=8daebe660297f090e6839b6a4454ff05382b59f3d515b3d7c14bc07f5fb642dd
'''

class Moniter:

    def __init__(self):
        self.conn_mysql()
        self.get_data()

    def conn_mysql(self):
        # 創(chuàng)建數(shù)據(jù)庫的連接對象
        # 字符集是utf8 不是utf-8
        self.conn = pymysql.connect(host="127.0.0.1", user="root",password='123',
                                    database="0218", charset="utf8")
        # 創(chuàng)建操作數(shù)據(jù)庫的對象
        self.cur = self.conn.cursor()

    def get_data(self):
        # 定義一天前的時間戳
        day_ago = time.time() - 86400

        # 定義查詢出總數(shù)和更新數(shù)量的sql語句
        sql = """
                select count(*) from lianjia
                union 
                select count(*) from lianjia where refresh_time > {}
                union 
                select phone from source_name where source = "lianjia"
                """.format(day_ago)
        # 執(zhí)行sql語句 并獲取sql語句查詢出來的 數(shù)據(jù)
        self.cur.execute(sql)
        self.conn.commit()
        data = self.cur.fetchall()
        # print(data, type(data))

        # 提出數(shù)據(jù) 獲取總數(shù) 和更新數(shù)
        total_count = int(data[0][0])
        refresh_count = int(data[1][0])
        phone = data[2][0]
        # print(total_count, refresh_count, phone)

        # 生成刷新數(shù)量的 百分比
        per_no_refresh = refresh_count / total_count
        # print(per_no_refresh)
        #如果最新數(shù)據(jù)的占比小于80%备蚓,則說明需要提醒
        if per_no_refresh < 0.8:
            per_no_refresh = "%.2f%%" % (per_no_refresh * 100)
            # print(per_no_refresh)

            # 發(fā)送釘釘消息
            self.dingding(phone, per_no_refresh)

    def dingding(self, phone, per_no_refresh):

        dd_api = "https://oapi.dingtalk.com/robot/send?access_token=" \
                 "8daebe660297f090e6839b6a4454ff05382b59f3d515b3d7c14bc07f5fb642dd"
        # print(phone, per_no_refresh)

        dd_json = {
            "msgtype": "text",
            "text": {
                "content": "你的渠道有問題 請及時解決 更新比例為:{}".format(per_no_refresh)
            },
            "at": {
                "atMobiles": [
                    phone,
                    "18679030315"
                ],
                "isAtAll": False
            }
        }

        requests.post(dd_api, json=dd_json)
        print("send success")


    def __del__(self):
        self.cur.close()
        self.conn.close()


if __name__ == '__main__':
    Moniter()

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市囱稽,隨后出現(xiàn)的幾起案子郊尝,更是在濱河造成了極大的恐慌,老刑警劉巖战惊,帶你破解...
    沈念sama閱讀 219,188評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件流昏,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機横缔,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,464評論 3 395
  • 文/潘曉璐 我一進店門铺遂,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人茎刚,你說我怎么就攤上這事襟锐。” “怎么了膛锭?”我有些...
    開封第一講書人閱讀 165,562評論 0 356
  • 文/不壞的土叔 我叫張陵粮坞,是天一觀的道長。 經(jīng)常有香客問我初狰,道長莫杈,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,893評論 1 295
  • 正文 為了忘掉前任奢入,我火速辦了婚禮筝闹,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘腥光。我一直安慰自己关顷,他們只是感情好,可當我...
    茶點故事閱讀 67,917評論 6 392
  • 文/花漫 我一把揭開白布武福。 她就那樣靜靜地躺著议双,像睡著了一般。 火紅的嫁衣襯著肌膚如雪捉片。 梳的紋絲不亂的頭發(fā)上平痰,一...
    開封第一講書人閱讀 51,708評論 1 305
  • 那天,我揣著相機與錄音伍纫,去河邊找鬼宗雇。 笑死,一個胖子當著我的面吹牛莹规,可吹牛的內(nèi)容都是我干的逾礁。 我是一名探鬼主播,決...
    沈念sama閱讀 40,430評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼访惜,長吁一口氣:“原來是場噩夢啊……” “哼嘹履!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起债热,我...
    開封第一講書人閱讀 39,342評論 0 276
  • 序言:老撾萬榮一對情侶失蹤砾嫉,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后窒篱,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體焕刮,經(jīng)...
    沈念sama閱讀 45,801評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡舶沿,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,976評論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了配并。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片括荡。...
    茶點故事閱讀 40,115評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖溉旋,靈堂內(nèi)的尸體忽然破棺而出畸冲,到底是詐尸還是另有隱情,我是刑警寧澤观腊,帶...
    沈念sama閱讀 35,804評論 5 346
  • 正文 年R本政府宣布邑闲,位于F島的核電站,受9級特大地震影響梧油,放射性物質(zhì)發(fā)生泄漏苫耸。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,458評論 3 331
  • 文/蒙蒙 一儡陨、第九天 我趴在偏房一處隱蔽的房頂上張望褪子。 院中可真熱鬧,春花似錦骗村、人聲如沸嫌褪。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,008評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至硫狞,卻和暖如春信轿,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背残吩。 一陣腳步聲響...
    開封第一講書人閱讀 33,135評論 1 272
  • 我被黑心中介騙來泰國打工财忽, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人泣侮。 一個月前我還...
    沈念sama閱讀 48,365評論 3 373
  • 正文 我出身青樓即彪,卻偏偏與公主長得像,于是被迫代替她去往敵國和親活尊。 傳聞我的和親對象是個殘疾皇子隶校,可洞房花燭夜當晚...
    茶點故事閱讀 45,055評論 2 355

推薦閱讀更多精彩內(nèi)容

  • 加入貓叔小灶群三個多月深胳,簡書寫了78篇文,約五萬字铜犬,文字越寫越順舞终,內(nèi)心越寫越充實轻庆,而且,在這期間敛劝,我學習效率大大提...
    孫國飛揚閱讀 408評論 11 18
  • 有人等在旅游階段 風景感受比鄰無界限 有人等在咖啡館 同樣的位置 同樣的咖啡 音樂播放不階段 這樣的習慣 在咖啡館...
    汐的島閱讀 160評論 2 1
  • fetch:從遠程獲取最新版本到本地余爆,不會自動merge 用WebStormGit操作:ctrl+shift+A ...
    Uching閱讀 342評論 0 0
  • 黑夜的貓 特立獨行 卻不喜歡這樣的雨夜 太過感傷 太過寂寞 太過懷念 入秋的一場雨 涼透了 涼透了 遠方的暗黃的...