天天看點

hyspider之智能運維監控

scrapyd

借助scrapyd,可以通過http請求遠端排程爬蟲。

#scrapy.cfg中加入deploy配置
[deploy]
url = http://localhost:6800/
project = hyspider
version = 1.0

#scrapyd安裝
pip install scrapyd
#啟動scrapyd,scrapyd-deploy上傳的檔案存放到~
cd ~ && scrapyd
#web ui
http://localhost:6800/

#安裝scrapyd-client
pip install scrapyd-client
cd hyspider
#上傳hyspider到scrapyd
scrapyd-deploy
           

ops

類似crontab,讓爬蟲每天定時執行:

  1. 所有管道電影每天更新一次
  2. 所有管道電影每天比對一次
  3. 所有管道價格每天更新一次,價格資訊請求量大,爬取可能失敗,每間隔5分鐘檢查一次是否還有價格資訊需要重新爬取
  4. 每間隔17分鐘檢視價格是否更新完畢,并進行價格彙總更新price表
  5. 每間隔1小時更新影院最低價
  6. 每天删除一次過期價格

排程采用Apscheduler,并記錄爬取狀态,由于資源有限,隻爬取固定幾個城市的資訊,也可以通過指令行傳參主動啟動爬蟲和比對過程。

ops.py源碼:https://github.com/improvejin/hyspider/tree/master/hyspider/ops/ops.py

Usage: python ops.py [option]
-h or --help:顯示幫助資訊
-s or --schedule: 系統自動排程更新
-m or --movie: 更新電影資訊
--match-movie: 多管道電影比對
-c or --cinema:更新某個城市影院資訊,例如: -c 上海
--match-cinema: 某個城市多管道影院比對,例如: --match-cinema 上海
-p or --price:更新某個城市價格資訊,例如: -p 上海
--match-price:某個城市多管道價格比對,例如: --match-price 上海    
           

monitor

wxpy是微信python接口,借助wxpy可以實作智能監控,通過微信檢視爬蟲狀态、啟動爬蟲等遠端操作。

monitor源碼:https://github.com/improvejin/hyspider/tree/master/hyspider/ops/monitor.py

sys.path.append(os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))))

from hyspider.manager.price import PriceManager

from wxpy import *

# 初始化機器人
bot = Bot()
# group_receiver = ensure_one(bot.groups().search('惠電影'))
me = bot.friends().search('Jin')[0]
logger = get_wechat_logger(bot.file_helper)

sch = BlockingScheduler()
price_manager = PriceManager.clone()

# 每天自動發送爬取狀态到微信
@sch.scheduled_job('cron', hour='6,7,8,9,10', id='notice_price_update_status')
def notice_price_update_status():
    msg = price_manager.get_price_update_status()
    logger.warning(msg)


@bot.register([me, bot.file_helper], TEXT,  except_self=False)
def get_price_update_status(msg):
    print(msg)
    if msg.text == 'h':
        logger.warning("""
h: show help
s: get status
c: crawlers status
rs: restart scrapyd
ro: restart ops.py
        """)
    elif msg.text == 's':
        notice_price_update_status()    # 檢視價格爬取狀态
    elif msg.text == 'c':
        from hyspider.settings import BOT_NAME, SCRAPYD_SERVER
        import requests
        import json
        params = {'project': BOT_NAME}
        rsp = requests.get(SCRAPYD_SERVER + '/listjobs.json', params) # 檢視scrapyd上爬蟲運作狀态
        res = json.loads(rsp.text)
        running = res['running']
        pending = res['pending']
        s = '{} running, {}'.format(len(running), running)
        logger.warning(s)
        s = '{} pending, {}'.format(len(pending), pending)
        logger.warning(s)
    elif msg.text == 'rs':
        ret_code = restart_process('scrapyd')
        logger.warning(ret_code)

# 重新開機scrapyd
def restart_process(process_name):
    """根據程序名重新開機程序"""
    import psutil
    pid_list = psutil.pids()
    for pid in pid_list:
        try:
            each_pro = psutil.Process(pid)
            if process_name.lower() in each_pro.name().lower():
                each_pro.terminate()
                each_pro.wait(timeout=3)
        except psutil.NoSuchProcess:
            pass
    cmd = 'start scrapyd -d {}'.format(os.path.expanduser('~'))
    return os.system(cmd)


if __name__ == '__main__':
    sch.start()
           

這樣,手機在手,就可以控制爬蟲了。