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,讓爬蟲每天定時執行:
- 所有管道電影每天更新一次
- 所有管道電影每天比對一次
- 所有管道價格每天更新一次,價格資訊請求量大,爬取可能失敗,每間隔5分鐘檢查一次是否還有價格資訊需要重新爬取
- 每間隔17分鐘檢視價格是否更新完畢,并進行價格彙總更新price表
- 每間隔1小時更新影院最低價
- 每天删除一次過期價格
排程采用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()
這樣,手機在手,就可以控制爬蟲了。