zoukankan      html  css  js  c++  java
  • python分布式抓取网页

    呵呵,前两节好像和python没多大关系。。这节完全是贴代码,

    这是我第一次写python,很多地方比较乱,主要就看看逻辑流程吧。

    对于编码格式确实搞得我头大。。取下来页面不知道是什么编码,所以先找charset,然后转unicode。统一在unicode下操作,但是数据库是utf8的,WINDOWS的控制台又必须是gbk的,但是我IDE控制台必须是utf8的。。所以才会有DEBUG这个变量存在。。。主要是为了控制输出编码。

    本程序连跑了24小时,然后分布式在10台机器上部署,长时间续航基本没有问题。

    之后每天将进行10万次网页的爬取。

    源码如下:

    内容爬取及工具

    1. ''''' 
    2. Created on 2010-9-15 
    3.  
    4. @author: chenggong 
    5. '''  
    6.   
    7. import urllib2  
    8. import re  
    9. import socket  
    10.   
    11.   
    12. DEBUG = 0  
    13.   
    14. ''''' 
    15. 工具类 
    16. '''  
    17. class Tools():  
    18.     #log函数  
    19.     @staticmethod   
    20.     def writelog(level,info,notify=False):  
    21.         if DEBUG == 0:  
    22.             try:  
    23.                 print "["+level+"]"+info.decode('UTF-8').encode('GBK')   
    24.             except:  
    25.                 print "["+level+"]"+info.encode('GBK')   
    26.         else:  
    27.             print "["+level+"]"+info  
    28.         #if notify:  
    29.         #    print "[notify]报告管理员!!"  
    30.           
    31.     #转unicode  
    32.     @staticmethod   
    33.     def toUnicode(s,charset):  
    34.         if( charset == "" ):  
    35.             return s  
    36.         else:  
    37.             try:  
    38.                 u = unicode( s, charset )  
    39.             except:  
    40.                 u = ""  
    41.         return u   
    42.       
    43.     #正则抓取  
    44.     #@param single 是否只抓取一个  
    45.     @staticmethod   
    46.     def getFromPatten(patten,src,single=False):  
    47.         rst = "";  
    48.         p = re.compile(patten,re.S)  
    49.         all = p.findall(src)  
    50.         for matcher in all:  
    51.             rst += matcher + " "  
    52.             if( single ):  
    53.                 break  
    54.         return rst.strip()  
    55.   
    56. ''''' 
    57. 网页内容爬虫 
    58. '''  
    59. class PageGripper():  
    60.     URL_OPEN_TIMEOUT = 10 #网页超时时间  
    61.     MAX_RETRY = 3 #最大重试次数  
    62.       
    63.     def __init__(self):  
    64.         socket.setdefaulttimeout(self.URL_OPEN_TIMEOUT)  
    65.       
    66.     #获取字符集  
    67.     def getCharset(self,s):  
    68.         rst = Tools.getFromPatten(u'charset=(.*?)"',s,True)  
    69.         if rst != "":  
    70.             if rst == "utf8":  
    71.                 rst = "utf-8"  
    72.         return rst  
    73.       
    74.     #尝试获取页面  
    75.     def downloadUrl(self,url):  
    76.         charset = ""  
    77.         page = ""  
    78.         retry = 0  
    79.         while True:  
    80.             try:  
    81.                 fp = urllib2.urlopen(url)  
    82.                 break  
    83.             except urllib2.HTTPError,e: #状态错误  
    84.                 Tools.writelog('error','HTTP状态错误 code='+e.code)  
    85.                 raise urllib2.HTTPError  
    86.             except urllib2.URLError,e: #网络错误超时  
    87.                 Tools.writelog('warn','页面访问超时,重试..')  
    88.                 retry+=1  
    89.                 if( retry > self.MAX_RETRY ):  
    90.                     Tools.writelog('warn','超过最大重试次数,放弃')  
    91.                     raise urllib2.URLError  
    92.       
    93.         while True:  
    94.             line = fp.readline()  
    95.             if charset == "":  
    96.                 charset = self.getCharset(line)  
    97.             if not line:  
    98.                 break  
    99.             page += Tools.toUnicode(line,charset)  
    100.         fp.close()  
    101.         return page  
    102.       
    103.     #获取页面  
    104.     def getPageInfo(self,url):  
    105.         Tools.writelog( "info","开始抓取网页,url= "+url)  
    106.         info = ""  
    107.         try:  
    108.             info = self.downloadUrl(url)  
    109.         except:  
    110.             raise          
    111.         Tools.writelog("debug","网页抓取成功")  
    112.         return info  
    113.   
    114. ''''' 
    115. 内容提取类 
    116. '''  
    117. class InfoGripper():  
    118.     pageGripper = PageGripper()  
    119.       
    120.     def __init__(self):  
    121.         Tools.writelog('debug',"爬虫启动")  
    122.     
    123.     #抓取标题  
    124.     def griptitle(self,data):  
    125.         title = Tools.getFromPatten(u'box2t sp"><h3>(.*?)</h3>', data, True)  
    126.         if title == "":  
    127.             title = Tools.getFromPatten(u'<title>(.*?)[-<]',data,True)  
    128.         return title.strip()  
    129.       
    130.     #抓取频道  
    131.     def gripchannel(self,data):  
    132.         zone = Tools.getFromPatten(u'频道:(.*?)</span>',data,True)  
    133.         channel = Tools.getFromPatten(u'<a.*?>(.*?)</a>',zone,True)  
    134.         return channel  
    135.       
    136.     #抓取标签  
    137.     def griptag(self,data):  
    138.         zone = Tools.getFromPatten(u'标签:(.*?)</[^a].*>',data,True);  
    139.         rst = Tools.getFromPatten(u'>(.*?)</a>',zone,False);  
    140.         return rst  
    141.       
    142.     #抓取观看次数  
    143.     def gripviews(self,data):  
    144.         rst = Tools.getFromPatten(u'已经有<em class="hot" id="viewcount">(.*?)</em>次观看',data);  
    145.         return rst  
    146.       
    147.     #抓取发布时间  
    148.     def griptime(self,data):  
    149.         rst = Tools.getFromPatten(u'在<em>(.*?)</em>发布',data,True)  
    150.         return rst  
    151.       
    152.     #抓取发布者  
    153.     def gripuser(self,data):  
    154.         rst = Tools.getFromPatten(u'title="点击进入(.*?)的用户空间"',data,True)  
    155.         return rst  
    156.       
    157.     #获取页面字符集  
    158.     def getPageCharset(self,data):  
    159.         charset = Tools.getFromPatten(u'charset=(.*?)"',data,True)  
    160.           
    161.         if( charset == "utf8" ):  
    162.             charset = "utf-8"  
    163.         return charset  
    164.       
    165.     #获取CC相关数据  
    166.     def getCCData(self,data):  
    167.           
    168.         zone = Tools.getFromPatten(u'SWFObject(.*?)</script>',data,True)  
    169.           
    170.         #判断是否使用bokecc播放  
    171.         isFromBokeCC = re.match('.*bokecc.com.*', zone)  
    172.         ifnot isFromBokeCC ):  
    173.             return "",""  
    174.               
    175.         ccSiteId = Tools.getFromPatten(u'siteid=(.*?)[&,"]',zone,True)  
    176.         ccVid = Tools.getFromPatten(u'vid=(.*?)[&,"]',zone,True)  
    177.         return ccSiteId,ccVid  
    178.       
    179.     #获取站内vid  
    180.     def gripVideoId(self,data):  
    181.         vid = Tools.getFromPatten(u'var vid = "(.*?)"',data,True)  
    182.         return vid  
    183.       
    184.     #获取点击量  
    185.     def gripViewsAjax(self,vid,url,basedir):  
    186.         host = Tools.getFromPatten(u'http://(.*?)/',url,True)  
    187.         ajaxAddr = "http://" + host + basedir + "/index.php/ajax/video_statistic/" + vid  
    188.         ''''' 
    189.         try: 
    190.             content = self.pageGripper.getPageInfo(ajaxAddr) 
    191.         except Exception,e: 
    192.             print e 
    193.             Tools.writelog ("error", ajaxAddr+u"抓取失败") 
    194.             return "error" 
    195.         '''  
    196.         Tools.writelog('debug', u"开始获取点击量,url="+ajaxAddr)  
    197.         while True:  
    198.             try:  
    199.                 fp = urllib2.urlopen(ajaxAddr)  
    200.                 break  
    201.             except urllib2.HTTPError,e: #状态错误  
    202.                 Tools.writelog('error','HTTP状态错误 code='+"%d"%e.code)  
    203.                 return ""  
    204.             except urllib2.URLError,e: #网络错误超时  
    205.                 Tools.writelog('warn','页面访问超时,重试..')  
    206.                 retry+=1  
    207.                 if( retry > self.MAX_RETRY ):  
    208.                     Tools.writelog('warn','超过最大重试次数,放弃')  
    209.                     return ""  
    210.         content = fp.read()  
    211.         fp.close()  
    212.         views = Tools.getFromPatten(u'"viewcount":(.*?),',content,True)  
    213.         views = views.replace('"','')  
    214.         return views  
    215.       
    216.     #从网页内容中爬取点击量   
    217.     def gripViewsFromData(self,data):  
    218.         views = Tools.getFromPatten(u'已经有<.*?>(.*?)<.*?>次观看',data,True)  
    219.         return views  
    220.   
    221.     def gripBaseDir(self,data):  
    222.         dir = Tools.getFromPatten(u"base_dir = '(.*?)'",data,True)  
    223.         return dir  
    224.   
    225.     #抓取数据  
    226.     def gripinfo(self,url):   
    227.           
    228.         try:  
    229.             data = self.pageGripper.getPageInfo(url)  
    230.         except:  
    231.             Tools.writelog ("error", url+" 抓取失败")  
    232.             raise  
    233.           
    234.         Tools.writelog('info','开始内容匹配')  
    235.         rst = {}  
    236.         rst['title'] = self.griptitle(data)  
    237.         rst['channel'] = self.gripchannel(data)  
    238.         rst['tag'] = self.griptag(data)  
    239.         rst['release'] = self.griptime(data)  
    240.         rst['user'] = self.gripuser(data)  
    241.         ccdata = self.getCCData(data)  
    242.         rst['ccsiteId'] = ccdata[0]  
    243.         rst['ccVid'] = ccdata[1]  
    244.         views = self.gripViewsFromData(data)  
    245.         if views =="" or not views:  
    246.             vid = self.gripVideoId(data)  
    247.             basedir = self.gripBaseDir(data)  
    248.             views = self.gripViewsAjax(vid,url,basedir)  
    249.             if( views == "" ):  
    250.                 views = "error"  
    251.             if( views == "error"):  
    252.                 Tools.writelog("error","获取观看次数失败")  
    253.         Tools.writelog("debug","点击量:"+views)  
    254.         rst['views'] = views  
    255.         Tools.writelog('debug','title=%s,channel=%s,tag=%s'%(rst['title'],rst['channel'],rst['tag']))  
    256.         return rst  
    257.   
    258. ''''' 
    259. 单元测试 
    260. '''  
    261. if __name__ == '__main__':  
    262.     list = [  
    263.             'http://008yx.com/xbsp/index.php/video/index/3138',  
    264.             'http://vblog.xwhb.com/index.php/video/index/4067',  
    265.             'http://demo.ccvms.bokecc.com/index.php/video/index/3968',  
    266.             'http://vlog.cnhubei.com/wuhan/20100912_56145.html',  
    267.             'http://vlog.cnhubei.com/html/js/30271.html',  
    268.             'http://www.ddvtv.com/index.php/video/index/15',  
    269.             'http://boke.2500sz.com/index.php/video/index/60605',  
    270.             'http://video.zgkqw.com/index.php/video/index/334',  
    271.             'http://yule.hitmv.com/html/joke/27041.html',  
    272.             'http://www.ddvtv.com/index.php/video/index/11',  
    273.             'http://www.zgnyyy.com/index.php/video/index/700',  
    274.             'http://www.kdianshi.com/index.php/video/index/5330',  
    275.             'http://www.aoyatv.com/index.php/video/index/127',  
    276.             'http://v.ourracing.com/html/channel2/64.html',  
    277.             'http://v.zheye.net/index.php/video/index/93',  
    278.             'http://vblog.thmz.com/index.php/video/index/7616',  
    279.             'http://kdianshi.com/index.php/video/index/5330',  
    280.             'http://tv.seeyoueveryday.com/index.php/video/index/95146',  
    281.             'http://sp.zgyangzhi.com/html/ji/2.html',  
    282.             'http://www.xjapan.cc/index.php/video/index/146',  
    283.             'http://www.jojy.cn/vod/index.php/video/index/399',  
    284.             'http://v.cyzone.cn/index.php/video/index/99',  
    285.             ]  
    286.       
    287.     list1 = ['http://192.168.25.7:8079/vinfoant/versionasdfdf']  
    288.   
    289.     infoGripper = InfoGripper()  
    290.     for url in list:  
    291.         infoGripper.gripinfo(url)  
    292.     del infoGripper  

    WEB服务及任务调度

    1. ''''' 
    2. Created on 2010-9-15 
    3.  
    4. @author: chenggong 
    5. '''  
    6. # -*- coding: utf-8 -*-  
    7. import string,cgi,time  
    8. from os import curdir,sep  
    9. from BaseHTTPServer import BaseHTTPRequestHandler,HTTPServer  
    10. from InfoGripper import *  
    11. import re  
    12. import MySQLdb  
    13. import time  
    14. import threading  
    15. import urllib  
    16. import urllib2  
    17.   
    18. PORT = 8079  
    19. VERSION = 0.1  
    20. DBCHARSET = "utf8"  
    21. PARAMS = [  
    22.           'callback',  
    23.           'sessionId',  
    24.           'retry',  
    25.           'retryInterval',  
    26.           'dbhost',  
    27.           'dbport',  
    28.           'db',  
    29.           'dbuser',  
    30.           'dbpass',  
    31.           'videoId'  
    32.           ]  
    33.   
    34. DBMAP = ['video_id',  
    35.          'ccsiteid',  
    36.          'ccvid',  
    37.          'desc_url',  
    38.          'site_id',  
    39.          'title',  
    40.          'post_time',  
    41.          'author',  
    42.          'elapse',  
    43.          'channel',  
    44.          'tags',  
    45.          'create_time',  
    46.          'check_time',  
    47.          'status']  
    48.   
    49. ''''' 
    50. ERROR CODE定义 
    51. '''  
    52. ERR_OK = 0  
    53. ERR_PARAM = 1  
    54. ERR_HTTP_TIMEOUT = 5  
    55. ERR_HTTP_STATUS = 6  
    56. ERR_DB_CONNECT_FAIL = 8  
    57. ERR_DB_SQL_FAIL = 9  
    58. ERR_GRIPVIEW = 11  
    59. ERR_UNKNOW = 12  
    60.   
    61. ''''' 
    62. 数据库适配器 
    63. '''  
    64. class DBAdapter(object):  
    65.       
    66.     def __init__(self):  
    67.         self.param = {'ip':'',  
    68.                       'port':0,  
    69.                       'user':'',  
    70.                       'pw':'',  
    71.                       'db':''}  
    72.         self.connect_once = False  #是否连接过数据库  
    73.       
    74.     ''''' 
    75.             创建/更新数据库连接池 
    76.     '''  
    77.     def connect(self,ip,port,user,pw,db):  
    78.         if( ip != self.param['ip'or  
    79.             port != self.param['port'or  
    80.             user != self.param['user'or  
    81.             pw != self.param['pw'or  
    82.             db != self.param['db']):  
    83.             Tools.writelog('info','更换数据库连接池,ip='+ip+',port='+port+',user='+user+',pw='+pw+',db='+db)  
    84.             try:  
    85.                 if self.connect_once == True#释放上次连接  
    86.                     self.cur.close()  
    87.                     self.conn.close()  
    88.                 self.conn=MySQLdb.connect(user=user,passwd=pw,db=db,host=ip,port=int(port))  
    89.                 self.conn.set_character_set(DBCHARSET)  
    90.                 self.connect_once = True  
    91.                 self.cur=self.conn.cursor(MySQLdb.cursors.Cursor)  
    92.                 self.param['ip'] = ip  
    93.                 self.param['port'] = port  
    94.                 self.param['user'] = user  
    95.                 self.param['pw'] = pw  
    96.                 self.param['db'] = db  
    97.             except:  
    98.                 Tools.writelog('error',u'数据库连接失败',True)   
    99.                 raise  
    100.             else:  
    101.                 Tools.writelog('info',u'数据库连接成功')  
    102.       
    103.     ''''' 
    104.             执行SQL语句 
    105.     '''  
    106.     def execute(self,sql):  
    107.         Tools.writelog('debug',u'执行SQL: '+sql)  
    108.         try:  
    109.             self.cur.execute(sql)  
    110.         except:  
    111.             Tools.writelog('error',u'SQL执行错误:'+sql)  
    112.             raise  
    113.                   
    114.     ''''' 
    115.             查询数据库 
    116.     '''  
    117.     def query(self,sql):  
    118.         row = {}  
    119.         self.execute(sql)  
    120.         row=self.cur.fetchall()  
    121.         return row  
    122.       
    123.     ''''' 
    124.             视频错误 
    125.     '''  
    126.     def updateErr(self,videoId):  
    127.         nowtime = time.strftime('%Y-%m-%d-%H-%M-%S',time.localtime(time.time()))  
    128.         sql = "UPDATE videos SET "  
    129.         sql += "check_time='" + nowtime +"',"  
    130.         sql += "status=-1 "  
    131.         sql += "WHERE video_id="+videoId  
    132.         self.execute(sql)  
    133.         self.conn.commit()   
    134.           
    135.     ''''' 
    136.             更新查询结果 
    137.     '''  
    138.     def update(self,obj,videoId,isUpdateTitle=True):  
    139.           
    140.         Tools.writelog('debug','开始更新数据库')  
    141.         try:  
    142.             #更新video表  
    143.             sql = "UPDATE videos SET "  
    144.             if(obj['ccsiteId'] !="" ):  
    145.                 sql += "ccsiteid='" + obj['ccsiteId'] + "',"  
    146.             if(obj['ccVid'] != "" ):  
    147.                 sql += "ccvid='" + obj['ccVid'] + "',"  
    148.             if isUpdateTitle:  
    149.                 sql += "title='" + obj['title'] + "',"  
    150.             sql += "post_time='" + obj['release'] + "',"  
    151.             sql += "author='" + obj['user'] + "',"  
    152.             sql += "channel='" + obj['channel'] + "',"  
    153.             sql += "tags='" + obj['tag'] + "',"  
    154.             nowtime = time.strftime('%Y-%m-%d-%H-%M-%S',time.localtime(time.time()))  
    155.             sql += "check_time='" + nowtime +"',"  
    156.             sql += "status=0 "  
    157.             sql += "WHERE video_id="+videoId  
    158.               
    159.             self.execute(sql)  
    160.       
    161.             #更新count表  
    162.             if( obj['views'] != 'error' ):  
    163.                 nowdate = time.strftime('%Y-%m-%d',time.localtime(time.time()))  
    164.                 sql = "SELECT * FROM counts WHERE "  
    165.                 sql += "date = '" + nowdate + "' and video_id=" + videoId  
    166.                 rst = self.query(sql)  
    167.                 if len(rst) > 0:#如果当天已有记录,则更新  
    168.                     sql = "UPDATE counts SET count="+obj['views']  
    169.                     sql +=" WHERE video_id=" + videoId + " AND date='" + nowdate+ "'"  
    170.                 else:#否则插入  
    171.                     sql = "INSERT INTO counts VALUES"  
    172.                     sql += "(null," +videoId+",'"+nowdate+"',"+obj['views'] + ")"  
    173.             self.execute(sql)                 
    174.             self.conn.commit()       
    175.             Tools.writelog('debug'"db commit ok")  
    176.             return ERR_OK  
    177.         except Exception,e:  
    178.             print e  
    179.             return ERR_DB_SQL_FAIL  
    180.   
    181. ''''' 
    182. 任务线程类 
    183. '''  
    184. class TaskThread(threading.Thread):  
    185.       
    186.     def setTaskTool(self,dbAdapter,gripper):  
    187.         self.dbAdapter = dbAdapter  
    188.         self.gripper = gripper  
    189.       
    190.     def setParam(self,param):  
    191.         self.param = param  
    192.         self.videoId = param['videoId']  
    193.         assert self.videoId != ""  
    194.       
    195.     def init(self):  
    196.         self.views = "0"  
    197.         self.errcode = ERR_OK  
    198.       
    199.     def run(self):  
    200.         Tools.writelog('debug','开始爬虫任务,sessionId='+self.param['sessionId'])  
    201.         self.init()  
    202.         try:  
    203.             #更新数据库连接  
    204.             self.dbAdapter.connect(self.param['dbhost'],self.param['dbport'],self.param['dbuser'],self.param['dbpass'],self.param['db'])  
    205.         except:  
    206.             self.errcode = ERR_DB_CONNECT_FAIL #数据库连接失败  
    207.             callback(self.errcode)  
    208.             return  
    209.           
    210.         #查询该vid的视频  
    211.         sql = "SELECT "  
    212.         for column in DBMAP:  
    213.             sql += column  
    214.             if column != DBMAP[len(DBMAP)-1]:  
    215.                 sql += ","  
    216.   
    217.         sql += " FROM videos"  
    218.         sql += " WHERE video_id="+self.videoId  
    219.         video = self.dbAdapter.query(sql)  
    220.         assert not (len(video)>1 or len(video)==0#有且仅有一条记录  
    221.           
    222.         url = video[0][3]  
    223.         assert url != ""   
    224.         try:  
    225.             rst = self.gripper.gripinfo(url)  
    226.         except urllib2.HTTPError,e:  
    227.             self.errcode = ERR_HTTP_STATUS #HTTP状态错误  
    228.             self.dbAdapter.updateErr(self.videoId)  
    229.         except urllib2.URLError,e:  
    230.             self.errcode = ERR_HTTP_TIMEOUT #HTTP连接超时  
    231.             self.dbAdapter.updateErr(self.videoId)  
    232.         except:  
    233.             self.errcode = ERR_UNKNOW #未知错误  
    234.             self.dbAdapter.updateErr(self.videoId)  
    235.         else:  
    236.             self.views = rst['views']  
    237.             if self.views == "error":  
    238.                 self.views = "-1"  
    239.                 self.errcode = ERR_GRIPVIEW #数据抓取成功,点击量抓取失败  
    240.             #更新数据库(特殊处理,如果原title中有 "-" 则不更新title字段)  
    241.             title = video[0][5]  
    242.             assert title != ""  
    243.             if re.match('.*-.*', title):  
    244.                 self.errocde = self.dbAdapter.update(rst,self.videoId,True)  
    245.             else:  
    246.                 self.errcode = self.dbAdapter.update(rst,self.videoId)  
    247.         self.callback(self.errcode)  
    248.         Tools.writelog('info','任务结束,sessionId='+self.param['sessionId'])  
    249.         return  
    250.       
    251.     def callback(self,errcode):     
    252.         results = {'errorcode':errcode,'count':int(self.views)}  
    253.         results = urllib.urlencode(results)  
    254.         results = results.replace('&''%26')  
    255.         url = self.param['callback']  
    256.         url += "?"  
    257.         url += "sessionId=" + self.param['sessionId']  
    258.         url += "&results=" + results  
    259.         retry = 0  
    260.         while True:  
    261.             try:  
    262.                 Tools.writelog('debug',"回调主控,url="+url)  
    263.                 urllib2.urlopen(url)  
    264.                 Tools.writelog('debug','回调成功')  
    265.                 break  
    266.             except urllib2.URLError, e: #超时、错误  
    267.                 Tools.writelog('debug','回调主控超时,%s秒后重试'%self.param['retryInterval'])  
    268.                 retry+=1  
    269.                 time.sleep(int(self.param['retryInterval']))  
    270.                 if( retry > int(self.param['retry'])):  
    271.                     Tools.writelog('error','回调主控失败')  
    272.                     return   
    273.   
    274. ''''' 
    275. WEB服务类 
    276. '''  
    277. class MyHandler(BaseHTTPRequestHandler):  
    278.       
    279.     dbAdapter = DBAdapter()  
    280.     gripper = InfoGripper()  
    281.       
    282.     def pageSuccess(self):  
    283.         self.send_response(200)  
    284.         self.send_header('Content-type''text/html')  
    285.         self.end_headers()  
    286.           
    287.     def pageFail(self):  
    288.         self.send_error(404"not found")  
    289.       
    290.     def getValue(self,param):  
    291.         src = self.path + '&'  
    292.         reg = param + '=' + '(.*?)&'  
    293.           
    294.         value = Tools.getFromPatten(reg,src,True)  
    295.         return value  
    296.       
    297.     def do_GET(self):  
    298.         isGetVersion = re.match('.*vinfoant/version.*'self.path)  
    299.         isTask = re.match('.*vinfoant/run.*'self.path)  
    300.         if( isGetVersion ):  
    301.             self.pageSuccess()  
    302.             self.wfile.write(VERSION)  
    303.         elif( isTask ):  
    304.             self.pageSuccess()  
    305.             param = {}  
    306.             for p in PARAMS:  
    307.                 param[p] = self.getValue(p) #获取各项参数  
    308.             taskThread = TaskThread()  
    309.             taskThread.setTaskTool(self.dbAdapter, self.gripper)  
    310.             taskThread.setParam(param)  
    311.             taskThread.start()#启动任务线程  
    312.             self.wfile.write("ok")          
    313.         else:  
    314.             self.pageFail()  
    315.         return  
    316.       
    317. ''''' 
    318. 启动WEB服务,全局入口 
    319. '''  
    320. def startHttpd():  
    321.     try:  
    322.         Tools.writelog('debug','httpd start..listen on '+str(PORT))  
    323.         httpd = HTTPServer(('',PORT), MyHandler )  
    324.         Tools.writelog('debug','success')  
    325.         httpd.serve_forever()  
    326.     except KeyboardInterrupt:  
    327.         Tools.writelog('debug','httpd close..')  
    328.         httpd.socket.close()  
    329.           
    330. if __name__ == '__main__':  
    331.     startHttpd() 


  • 相关阅读:
    mongodb的热备工具pbm-agent
    注释
    mongodb的启动配置查询serverCmdLineOpts
    副本集状态
    分片集群的serverStatus监控
    副本集的replSetGetStatus监控
    京东
    副本集的replSetGetConfig监控
    mysql的replace函数
    副本集的serverStatus监控
  • 原文地址:https://www.cnblogs.com/riskyer/p/3243887.html
Copyright © 2011-2022 走看看