python中怎么实现分布式抓取网页
创始人
2024-12-26 01:42:25
0次

[python]
view plaincopy

  1. '''''

  2. Created on 2010-9-15

  3. @author: chenggong

  4. '''


  5. import urllib2  

  6. import re  

  7. import socket  



  8. DEBUG = 0


  9. '''''

  10. 工具类

  11. '''

  12. class Tools():  

  13.     #log函数

  14.     @staticmethod

  15.     def writelog(level,info,notify=False):  

  16.         if DEBUG == 0:  

  17.             try:  

  18.                 print "["+level+"]"+info.decode('UTF-8').encode('GBK')   

  19.             except:  

  20.                 print "["+level+"]"+info.encode('GBK')   

  21.         else:  

  22.             print "["+level+"]"+info  

  23.         #if notify:

  24.         #    print "[notify]报告管理员!!"


  25.     #转unicode

  26.     @staticmethod

  27.     def toUnicode(s,charset):  

  28.         if( charset == "" ):  

  29.             return s  

  30.         else:  

  31.             try:  

  32.                 u = unicode( s, charset )  

  33.             except:  

  34.                 u = ""  

  35.         return u   


  36.     #正则抓取

  37.     #@param single 是否只抓取一个

  38.     @staticmethod

  39.     def getFromPatten(patten,src,single=False):  

  40.         rst = "";  

  41.         p = re.compile(patten,re.S)  

  42.         all = p.findall(src)  

  43.         for matcher in all:  

  44.             rst += matcher + " "

  45.             if( single ):  

  46.                 break

  47.         return rst.strip()  


  48. '''''

  49. 网页内容爬虫

  50. '''

  51. class PageGripper():  

  52.     URL_OPEN_TIMEOUT = 10 #网页超时时间

  53.     MAX_RETRY = 3 #最大重试次数


  54.     def __init__(self):  

  55.         socket.setdefaulttimeout(self.URL_OPEN_TIMEOUT)  


  56.     #获取字符集

  57.     def getCharset(self,s):  

  58.         rst = Tools.getFromPatten(u'charset=(.*?)"',s,True)  

  59.         if rst != "":  

  60.             if rst == "utf8":  

  61.                 rst = "utf-8"

  62.         return rst  


  63.     #尝试获取页面

  64.     def downloadUrl(self,url):  

  65.         charset = ""  

  66.         page = ""  

  67.         retry = 0

  68.         while True:  

  69.             try:  

  70.                 fp = urllib2.urlopen(url)  

  71.                 break

  72.             except urllib2.HTTPError,e: #状态错误

  73.                 Tools.writelog('error','HTTP状态错误 code='+e.code)  

  74.                 raise urllib2.HTTPError  

  75.             except urllib2.URLError,e: #网络错误超时

  76.                 Tools.writelog('warn','页面访问超时,重试..')  

  77.                 retry+=1

  78.                 if( retry > self.MAX_RETRY ):  

  79.                     Tools.writelog('warn','超过最大重试次数,放弃')  

  80.                     raise urllib2.URLError  


  81.         while True:  

  82.             line = fp.readline()  

  83.             if charset == "":  

  84.                 charset = self.getCharset(line)  

  85.             if not line:  

  86.                 break

  87.             page += Tools.toUnicode(line,charset)  

  88.         fp.close()  

  89.         return page  


  90.     #获取页面

  91.     def getPageInfo(self,url):  

  92.         Tools.writelog( "info","开始抓取网页,url= "+url)  

  93.         info = ""  

  94.         try:  

  95.             info = self.downloadUrl(url)  

  96.         except:  

  97.             raise

  98.         Tools.writelog("debug","网页抓取成功")  

  99.         return info  


  100. '''''

  101. 内容提取类

  102. '''

  103. class InfoGripper():  

  104.     pageGripper = PageGripper()  


  105.     def __init__(self):  

  106.         Tools.writelog('debug',"爬虫启动")  


  107.     #抓取标题

  108.     def griptitle(self,data):  

  109.         title = Tools.getFromPatten(u'box2t sp">

    (.*?)

    ', data, True)  

  110.         if title == "":  

  111.             title = Tools.getFromPatten(u'(.*?)[-<]'</span>,data,<span class="special">True</span>)  </p></li><li><p>        <span class="keyword">return</span> title.strip()  </p></li><li><p><br/></p></li><li><p>    <span class="comment">#抓取频道</span></p></li><li><p>    <span class="keyword">def</span> gripchannel(<span class="special">self</span>,data):  </p></li><li><p>        zone = Tools.getFromPatten(u<span class="string">'频道:(.*?)</span>'</span>,data,<span class="special">True</span>)  </p></li><li><p>        channel = Tools.getFromPatten(u<span class="string">'<a.*?>(.*?)</a>'</span>,zone,<span class="special">True</span>)  </p></li><li><p>        <span class="keyword">return</span> channel  </p></li><li><p><br/></p></li><li><p>    <span class="comment">#抓取标签</span></p></li><li><p>    <span class="keyword">def</span> griptag(<span class="special">self</span>,data):  </p></li><li><p>        zone = Tools.getFromPatten(u<span class="string">'标签:(.*?)</[^a].*>'</span>,data,<span class="special">True</span>);  </p></li><li><p>        rst = Tools.getFromPatten(u<span class="string">'>(.*?)</a>'</span>,zone,<span class="special">False</span>);  </p></li><li><p>        <span class="keyword">return</span> rst  </p></li><li><p><br/></p></li><li><p>    <span class="comment">#抓取观看次数</span></p></li><li><p>    <span class="keyword">def</span> gripviews(<span class="special">self</span>,data):  </p></li><li><p>        rst = Tools.getFromPatten(u<span class="string">'已经有<em class="hot" id="viewcount">(.*?)</em>次观看'</span>,data);  </p></li><li><p>        <span class="keyword">return</span> rst  </p></li><li><p><br/></p></li><li><p>    <span class="comment">#抓取发布时间</span></p></li><li><p>    <span class="keyword">def</span> griptime(<span class="special">self</span>,data):  </p></li><li><p>        rst = Tools.getFromPatten(u<span class="string">'在<em>(.*?)</em>发布'</span>,data,<span class="special">True</span>)  </p></li><li><p>        <span class="keyword">return</span> rst  </p></li><li><p><br/></p></li><li><p>    <span class="comment">#抓取发布者</span></p></li><li><p>    <span class="keyword">def</span> gripuser(<span class="special">self</span>,data):  </p></li><li><p>        rst = Tools.getFromPatten(u<span class="string">'title="点击进入(.*?)的用户空间"'</span>,data,<span class="special">True</span>)  </p></li><li><p>        <span class="keyword">return</span> rst  </p></li><li><p><br/></p></li><li><p>    <span class="comment">#获取页面字符集</span></p></li><li><p>    <span class="keyword">def</span> getPageCharset(<span class="special">self</span>,data):  </p></li><li><p>        charset = Tools.getFromPatten(u<span class="string">'charset=(.*?)"'</span>,data,<span class="special">True</span>)  </p></li><li><p><br/></p></li><li><p>        <span class="keyword">if</span>( charset == <span class="string">"utf8"</span> ):  </p></li><li><p>            charset = <span class="string">"utf-8"</span></p></li><li><p>        <span class="keyword">return</span> charset  </p></li><li><p><br/></p></li><li><p>    <span class="comment">#获取CC相关数据</span></p></li><li><p>    <span class="keyword">def</span> getCCData(<span class="special">self</span>,data):  </p></li><li><p><br/></p></li><li><p>        zone = Tools.getFromPatten(u<span class="string">'SWFObject(.*?)</script>'</span>,data,<span class="special">True</span>)  </p></li><li><p><br/></p></li><li><p>        <span class="comment">#判断是否使用bokecc播放</span></p></li><li><p>        isFromBokeCC = re.match(<span class="string">'.*bokecc.com.*'</span>, zone)  </p></li><li><p>        <span class="keyword">if</span>( <span class="keyword">not</span> isFromBokeCC ):  </p></li><li><p>            <span class="keyword">return</span> "<span class="string">","</span>"  </p></li><li><p><br/></p></li><li><p>        ccSiteId = Tools.getFromPatten(u<span class="string">'siteid=(.*?)[&,"]'</span>,zone,<span class="special">True</span>)  </p></li><li><p>        ccVid = Tools.getFromPatten(u<span class="string">'vid=(.*?)[&,"]'</span>,zone,<span class="special">True</span>)  </p></li><li><p>        <span class="keyword">return</span> ccSiteId,ccVid  </p></li><li><p><br/></p></li><li><p>    <span class="comment">#获取站内vid</span></p></li><li><p>    <span class="keyword">def</span> gripVideoId(<span class="special">self</span>,data):  </p></li><li><p>        vid = Tools.getFromPatten(u<span class="string">'var vid = "(.*?)"'</span>,data,<span class="special">True</span>)  </p></li><li><p>        <span class="keyword">return</span> vid  </p></li><li><p><br/></p></li><li><p>    <span class="comment">#获取点击量</span></p></li><li><p>    <span class="keyword">def</span> gripViewsAjax(<span class="special">self</span>,vid,url,basedir):  </p></li><li><p>        host = Tools.getFromPatten(u<span class="string">'http://(.*?)/'</span>,url,<span class="special">True</span>)  </p></li><li><p>        ajaxAddr = <span class="string">"http://"</span> + host + basedir + <span class="string">"/index.php/ajax/video_statistic/"</span> + vid  </p></li><li><p>        <span class="string">''</span><span class="comment">'''</span></p></li><li><p><span class="comment">        try:</span></p></li><li><p><span class="comment">            content = self.pageGripper.getPageInfo(ajaxAddr)</span></p></li><li><p><span class="comment">        except Exception,e:</span></p></li><li><p><span class="comment">            print e</span></p></li><li><p><span class="comment">            Tools.writelog ("error", ajaxAddr+u"抓取失败")</span></p></li><li><p><span class="comment">            return "error"</span></p></li><li><p><span class="comment">        '''</span></p></li><li><p>        Tools.writelog(<span class="string">'debug'</span>, u<span class="string">"开始获取点击量,url="</span>+ajaxAddr)  </p></li><li><p>        <span class="keyword">while</span> <span class="special">True</span>:  </p></li><li><p>            <span class="keyword">try</span>:  </p></li><li><p>                fp = urllib2.urlopen(ajaxAddr)  </p></li><li><p>                <span class="keyword">break</span></p></li><li><p>            <span class="keyword">except</span> urllib2.HTTPError,e: <span class="comment">#状态错误</span></p></li><li><p>                Tools.writelog(<span class="string">'error'</span>,<span class="string">'HTTP状态错误 code='</span>+<span class="string">"%d"</span>%e.code)  </p></li><li><p>                <span class="keyword">return</span> ""  </p></li><li><p>            <span class="keyword">except</span> urllib2.URLError,e: <span class="comment">#网络错误超时</span></p></li><li><p>                Tools.writelog(<span class="string">'warn'</span>,<span class="string">'页面访问超时,重试..'</span>)  </p></li><li><p>                retry+=<span class="number">1</span></p></li><li><p>                <span class="keyword">if</span>( retry > <span class="special">self</span>.MAX_RETRY ):  </p></li><li><p>                    Tools.writelog(<span class="string">'warn'</span>,<span class="string">'超过最大重试次数,放弃'</span>)  </p></li><li><p>                    <span class="keyword">return</span> ""  </p></li><li><p>        content = fp.read()  </p></li><li><p>        fp.close()  </p></li><li><p>        views = Tools.getFromPatten(u<span class="string">'"viewcount":(.*?),'</span>,content,<span class="special">True</span>)  </p></li><li><p>        views = views.replace(<span class="string">'"'</span>,<span class="string">''</span>)  </p></li><li><p>        <span class="keyword">return</span> views  </p></li><li><p><br/></p></li><li><p>    <span class="comment">#从网页内容中爬取点击量 </span></p></li><li><p>    <span class="keyword">def</span> gripViewsFromData(<span class="special">self</span>,data):  </p></li><li><p>        views = Tools.getFromPatten(u<span class="string">'已经有<.*?>(.*?)<.*?>次观看'</span>,data,<span class="special">True</span>)  </p></li><li><p>        <span class="keyword">return</span> views  </p></li><li><p><br/></p></li><li><p>    <span class="keyword">def</span> gripBaseDir(<span class="special">self</span>,data):  </p></li><li><p>        dir = Tools.getFromPatten(u<span class="string">"base_dir = '(.*?)'"</span>,data,<span class="special">True</span>)  </p></li><li><p>        <span class="keyword">return</span> dir  </p></li><li><p><br/></p></li><li><p>    <span class="comment">#抓取数据</span></p></li><li><p>    <span class="keyword">def</span> gripinfo(<span class="special">self</span>,url):   </p></li><li><p><br/></p></li><li><p>        <span class="keyword">try</span>:  </p></li><li><p>            data = <span class="special">self</span>.pageGripper.getPageInfo(url)  </p></li><li><p>        <span class="keyword">except</span>:  </p></li><li><p>            Tools.writelog (<span class="string">"error"</span>, url+<span class="string">" 抓取失败"</span>)  </p></li><li><p>            <span class="keyword">raise</span></p></li><li><p><br/></p></li><li><p>        Tools.writelog(<span class="string">'info'</span>,<span class="string">'开始内容匹配'</span>)  </p></li><li><p>        rst = {}  </p></li><li><p>        rst[<span class="string">'title'</span>] = <span class="special">self</span>.griptitle(data)  </p></li><li><p>        rst[<span class="string">'channel'</span>] = <span class="special">self</span>.gripchannel(data)  </p></li><li><p>        rst[<span class="string">'tag'</span>] = <span class="special">self</span>.griptag(data)  </p></li><li><p>        rst[<span class="string">'release'</span>] = <span class="special">self</span>.griptime(data)  </p></li><li><p>        rst[<span class="string">'user'</span>] = <span class="special">self</span>.gripuser(data)  </p></li><li><p>        ccdata = <span class="special">self</span>.getCCData(data)  </p></li><li><p>        rst[<span class="string">'ccsiteId'</span>] = ccdata[<span class="number">0</span>]  </p></li><li><p>        rst[<span class="string">'ccVid'</span>] = ccdata[<span class="number">1</span>]  </p></li><li><p>        views = <span class="special">self</span>.gripViewsFromData(data)  </p></li><li><p>        <span class="keyword">if</span> views =="" <span class="keyword">or</span> <span class="keyword">not</span> views:  </p></li><li><p>            vid = <span class="special">self</span>.gripVideoId(data)  </p></li><li><p>            basedir = <span class="special">self</span>.gripBaseDir(data)  </p></li><li><p>            views = <span class="special">self</span>.gripViewsAjax(vid,url,basedir)  </p></li><li><p>            <span class="keyword">if</span>( views == "" ):  </p></li><li><p>                views = <span class="string">"error"</span></p></li><li><p>            <span class="keyword">if</span>( views == <span class="string">"error"</span>):  </p></li><li><p>                Tools.writelog(<span class="string">"error"</span>,<span class="string">"获取观看次数失败"</span>)  </p></li><li><p>        Tools.writelog(<span class="string">"debug"</span>,<span class="string">"点击量:"</span>+views)  </p></li><li><p>        rst[<span class="string">'views'</span>] = views  </p></li><li><p>        Tools.writelog(<span class="string">'debug'</span>,<span class="string">'title=%s,channel=%s,tag=%s'</span>%(rst[<span class="string">'title'</span>],rst[<span class="string">'channel'</span>],rst[<span class="string">'tag'</span>]))  </p></li><li><p>        <span class="keyword">return</span> rst  </p></li><li><p><br/></p></li><li><p><span class="string">''</span><span class="comment">'''</span></p></li><li><p><span class="comment">单元测试</span></p></li><li><p><span class="comment">'''</span></p></li><li><p><span class="keyword">if</span> __name__ == <span class="string">'__main__'</span>:  </p></li><li><p>    list = [  </p></li><li><p>            <span class="string">'http://008yx.com/xbsp/index.php/video/index/3138'</span>,  </p></li><li><p>            <span class="string">'http://vblog.xwhb.com/index.php/video/index/4067'</span>,  </p></li><li><p>            <span class="string">'http://demo.ccvms.bokecc.com/index.php/video/index/3968'</span>,  </p></li><li><p>            <span class="string">'http://vlog.cnhubei.com/wuhan/20100912_56145.html'</span>,  </p></li><li><p>            <span class="string">'http://vlog.cnhubei.com/html/js/30271.html'</span>,  </p></li><li><p>            <span class="string">'http://www.ddvtv.com/index.php/video/index/15'</span>,  </p></li><li><p>            <span class="string">'http://boke.2500sz.com/index.php/video/index/60605'</span>,  </p></li><li><p>            <span class="string">'http://video.zgkqw.com/index.php/video/index/334'</span>,  </p></li><li><p>            <span class="string">'http://yule.hitmv.com/html/joke/27041.html'</span>,  </p></li><li><p>            <span class="string">'http://www.ddvtv.com/index.php/video/index/11'</span>,  </p></li><li><p>            <span class="string">'http://www.zgnyyy.com/index.php/video/index/700'</span>,  </p></li><li><p>            <span class="string">'http://www.kdianshi.com/index.php/video/index/5330'</span>,  </p></li><li><p>            <span class="string">'http://www.aoyatv.com/index.php/video/index/127'</span>,  </p></li><li><p>            <span class="string">'http://v.ourracing.com/html/channel2/64.html'</span>,  </p></li><li><p>            <span class="string">'http://v.zheye.net/index.php/video/index/93'</span>,  </p></li><li><p>            <span class="string">'http://vblog.thmz.com/index.php/video/index/7616'</span>,  </p></li><li><p>            <span class="string">'http://kdianshi.com/index.php/video/index/5330'</span>,  </p></li><li><p>            <span class="string">'http://tv.seeyoueveryday.com/index.php/video/index/95146'</span>,  </p></li><li><p>            <span class="string">'http://sp.zgyangzhi.com/html/ji/2.html'</span>,  </p></li><li><p>            <span class="string">'http://www.xjapan.cc/index.php/video/index/146'</span>,  </p></li><li><p>            <span class="string">'http://www.jojy.cn/vod/index.php/video/index/399'</span>,  </p></li><li><p>            <span class="string">'http://v.cyzone.cn/index.php/video/index/99'</span>,  </p></li><li><p>            ]  </p></li><li><p><br/></p></li><li><p>    list1 = [<span class="string">'http://192.168.25.7:8079/vinfoant/versionasdfdf'</span>]  </p></li><li><p><br/></p></li><li><p>    infoGripper = InfoGripper()  </p></li><li><p>    <span class="keyword">for</span> url <span class="keyword">in</span> list:  </p></li><li><p>        infoGripper.gripinfo(url)  </p></li><li><p>    <span class="keyword">del</span> infoGripper  </p></li></ol><p>WEB服务及任务调度</p><p><strong>[python]</strong> <br/>view plaincopy</p><ol class="dp-py list-paddingleft-2" start="1"><li><p><span class="string">''</span><span class="comment">'''</span></p></li><li><p><span class="comment">Created on 2010-9-15</span></p></li><li><p><span class="comment"></span></p></li><li><p><span class="comment">@author: chenggong</span></p></li><li><p><span class="comment">'''</span></p></li><li><p><span class="comment"># -*- coding: utf-8 -*-</span></p></li><li><p><span class="keyword">import</span> string,cgi,time  </p></li><li><p><span class="keyword">from</span> os <span class="keyword">import</span> curdir,sep  </p></li><li><p><span class="keyword">from</span> BaseHTTPServer <span class="keyword">import</span> BaseHTTPRequestHandler,HTTPServer  </p></li><li><p><span class="keyword">from</span> InfoGripper <span class="keyword">import</span> *  </p></li><li><p><span class="keyword">import</span> re  </p></li><li><p><span class="keyword">import</span> MySQLdb  </p></li><li><p><span class="keyword">import</span> time  </p></li><li><p><span class="keyword">import</span> threading  </p></li><li><p><span class="keyword">import</span> urllib  </p></li><li><p><span class="keyword">import</span> urllib2  </p></li><li><p><br/></p></li><li><p>PORT = <span class="number">8079</span></p></li><li><p>VERSION = <span class="number">0.1</span></p></li><li><p>DBCHARSET = <span class="string">"utf8"</span></p></li><li><p>PARAMS = [  </p></li><li><p>          <span class="string">'callback'</span>,  </p></li><li><p>          <span class="string">'sessionId'</span>,  </p></li><li><p>          <span class="string">'retry'</span>,  </p></li><li><p>          <span class="string">'retryInterval'</span>,  </p></li><li><p>          <span class="string">'dbhost'</span>,  </p></li><li><p>          <span class="string">'dbport'</span>,  </p></li><li><p>          <span class="string">'db'</span>,  </p></li><li><p>          <span class="string">'dbuser'</span>,  </p></li><li><p>          <span class="string">'dbpass'</span>,  </p></li><li><p>          <span class="string">'videoId'</span></p></li><li><p>          ]  </p></li><li><p><br/></p></li><li><p>DBMAP = [<span class="string">'video_id'</span>,  </p></li><li><p>         <span class="string">'ccsiteid'</span>,  </p></li><li><p>         <span class="string">'ccvid'</span>,  </p></li><li><p>         <span class="string">'desc_url'</span>,  </p></li><li><p>         <span class="string">'site_id'</span>,  </p></li><li><p>         <span class="string">'title'</span>,  </p></li><li><p>         <span class="string">'post_time'</span>,  </p></li><li><p>         <span class="string">'author'</span>,  </p></li><li><p>         <span class="string">'elapse'</span>,  </p></li><li><p>         <span class="string">'channel'</span>,  </p></li><li><p>         <span class="string">'tags'</span>,  </p></li><li><p>         <span class="string">'create_time'</span>,  </p></li><li><p>         <span class="string">'check_time'</span>,  </p></li><li><p>         <span class="string">'status'</span>]  </p></li><li><p><br/></p></li><li><p><span class="string">''</span><span class="comment">'''</span></p></li><li><p><span class="comment">ERROR CODE定义</span></p></li><li><p><span class="comment">'''</span></p></li><li><p>ERR_OK = <span class="number">0</span></p></li><li><p>ERR_PARAM = <span class="number">1</span></p></li><li><p>ERR_HTTP_TIMEOUT = <span class="number">5</span></p></li><li><p>ERR_HTTP_STATUS = <span class="number">6</span></p></li><li><p>ERR_DB_CONNECT_FAIL = <span class="number">8</span></p></li><li><p>ERR_DB_SQL_FAIL = <span class="number">9</span></p></li><li><p>ERR_GRIPVIEW = <span class="number">11</span></p></li><li><p>ERR_UNKNOW = <span class="number">12</span></p></li><li><p><br/></p></li><li><p><span class="string">''</span><span class="comment">'''</span></p></li><li><p><span class="comment">数据库适配器</span></p></li><li><p><span class="comment">'''</span></p></li><li><p><span class="keyword">class</span> DBAdapter(object):  </p></li><li><p><br/></p></li><li><p>    <span class="keyword">def</span> __init__(<span class="special">self</span>):  </p></li><li><p>        <span class="special">self</span>.param = {<span class="string">'ip'</span>:<span class="string">''</span>,  </p></li><li><p>                      <span class="string">'port'</span>:<span class="number">0</span>,  </p></li><li><p>                      <span class="string">'user'</span>:<span class="string">''</span>,  </p></li><li><p>                      <span class="string">'pw'</span>:<span class="string">''</span>,  </p></li><li><p>                      <span class="string">'db'</span>:<span class="string">''</span>}  </p></li><li><p>        <span class="special">self</span>.connect_once = <span class="special">False</span>  <span class="comment">#是否连接过数据库</span></p></li><li><p><br/></p></li><li><p>    <span class="string">''</span><span class="comment">'''</span></p></li><li><p><span class="comment">            创建/更新数据库连接池</span></p></li><li><p><span class="comment">    '''</span></p></li><li><p>    <span class="keyword">def</span> connect(<span class="special">self</span>,ip,port,user,pw,db):  </p></li><li><p>        <span class="keyword">if</span>( ip != <span class="special">self</span>.param[<span class="string">'ip'</span>] <span class="keyword">or</span></p></li><li><p>            port != <span class="special">self</span>.param[<span class="string">'port'</span>] <span class="keyword">or</span></p></li><li><p>            user != <span class="special">self</span>.param[<span class="string">'user'</span>] <span class="keyword">or</span></p></li><li><p>            pw != <span class="special">self</span>.param[<span class="string">'pw'</span>] <span class="keyword">or</span></p></li><li><p>            db != <span class="special">self</span>.param[<span class="string">'db'</span>]):  </p></li><li><p>            Tools.writelog(<span class="string">'info'</span>,<span class="string">'更换数据库连接池,ip='</span>+ip+<span class="string">',port='</span>+port+<span class="string">',user='</span>+user+<span class="string">',pw='</span>+pw+<span class="string">',db='</span>+db)  </p></li><li><p>            <span class="keyword">try</span>:  </p></li><li><p>                <span class="keyword">if</span> <span class="special">self</span>.connect_once == <span class="special">True</span>: <span class="comment">#释放上次连接</span></p></li><li><p>                    <span class="special">self</span>.cur.close()  </p></li><li><p>                    <span class="special">self</span>.conn.close()  </p></li><li><p>                <span class="special">self</span>.conn=MySQLdb.connect(user=user,passwd=pw,db=db,host=ip,port=int(port))  </p></li><li><p>                <span class="special">self</span>.conn.set_character_set(DBCHARSET)  </p></li><li><p>                <span class="special">self</span>.connect_once = <span class="special">True</span></p></li><li><p>                <span class="special">self</span>.cur=<span class="special">self</span>.conn.cursor(MySQLdb.cursors.Cursor)  </p></li><li><p>                <span class="special">self</span>.param[<span class="string">'ip'</span>] = ip  </p></li><li><p>                <span class="special">self</span>.param[<span class="string">'port'</span>] = port  </p></li><li><p>                <span class="special">self</span>.param[<span class="string">'user'</span>] = user  </p></li><li><p>                <span class="special">self</span>.param[<span class="string">'pw'</span>] = pw  </p></li><li><p>                <span class="special">self</span>.param[<span class="string">'db'</span>] = db  </p></li><li><p>            <span class="keyword">except</span>:  </p></li><li><p>                Tools.writelog(<span class="string">'error'</span>,u<span class="string">'数据库连接失败'</span>,<span class="special">True</span>)   </p></li><li><p>                <span class="keyword">raise</span></p></li><li><p>            <span class="keyword">else</span>:  </p></li><li><p>                Tools.writelog(<span class="string">'info'</span>,u<span class="string">'数据库连接成功'</span>)  </p></li><li><p><br/></p></li><li><p>    <span class="string">''</span><span class="comment">'''</span></p></li><li><p><span class="comment">            执行SQL语句</span></p></li><li><p><span class="comment">    '''</span></p></li><li><p>    <span class="keyword">def</span> execute(<span class="special">self</span>,sql):  </p></li><li><p>        Tools.writelog(<span class="string">'debug'</span>,u<span class="string">'执行SQL: '</span>+sql)  </p></li><li><p>        <span class="keyword">try</span>:  </p></li><li><p>            <span class="special">self</span>.cur.execute(sql)  </p></li><li><p>        <span class="keyword">except</span>:  </p></li><li><p>            Tools.writelog(<span class="string">'error'</span>,u<span class="string">'SQL执行错误:'</span>+sql)  </p></li><li><p>            <span class="keyword">raise</span></p></li><li><p><br/></p></li><li><p>    <span class="string">''</span><span class="comment">'''</span></p></li><li><p><span class="comment">            查询数据库</span></p></li><li><p><span class="comment">    '''</span></p></li><li><p>    <span class="keyword">def</span> query(<span class="special">self</span>,sql):  </p></li><li><p>        row = {}  </p></li><li><p>        <span class="special">self</span>.execute(sql)  </p></li><li><p>        row=<span class="special">self</span>.cur.fetchall()  </p></li><li><p>        <span class="keyword">return</span> row  </p></li><li><p><br/></p></li><li><p>    <span class="string">''</span><span class="comment">'''</span></p></li><li><p><span class="comment">            视频错误</span></p></li><li><p><span class="comment">    '''</span></p></li><li><p>    <span class="keyword">def</span> updateErr(<span class="special">self</span>,videoId):  </p></li><li><p>        nowtime = time.strftime(<span class="string">'%Y-%m-%d-%H-%M-%S'</span>,time.localtime(time.time()))  </p></li><li><p>        sql = <span class="string">"UPDATE videos SET "</span></p></li><li><p>        sql += <span class="string">"check_time='"</span> + nowtime +<span class="string">"',"</span></p></li><li><p>        sql += <span class="string">"status=-1 "</span></p></li><li><p>        sql += <span class="string">"WHERE video_id="</span>+videoId  </p></li><li><p>        <span class="special">self</span>.execute(sql)  </p></li><li><p>        <span class="special">self</span>.conn.commit()   </p></li><li><p><br/></p></li><li><p>    <span class="string">''</span><span class="comment">'''</span></p></li><li><p><span class="comment">            更新查询结果</span></p></li><li><p><span class="comment">    '''</span></p></li><li><p>    <span class="keyword">def</span> update(<span class="special">self</span>,obj,videoId,isUpdateTitle=<span class="special">True</span>):  </p></li><li><p><br/></p></li><li><p>        Tools.writelog(<span class="string">'debug'</span>,<span class="string">'开始更新数据库'</span>)  </p></li><li><p>        <span class="keyword">try</span>:  </p></li><li><p>            <span class="comment">#更新video表</span></p></li><li><p>            sql = <span class="string">"UPDATE videos SET "</span></p></li><li><p>            <span class="keyword">if</span>(obj[<span class="string">'ccsiteId'</span>] !="" ):  </p></li><li><p>                sql += <span class="string">"ccsiteid='"</span> + obj['ccsiteId<span class="string">'] + "'</span>,"  </p></li><li><p>            <span class="keyword">if</span>(obj[<span class="string">'ccVid'</span>] != "" ):  </p></li><li><p>                sql += <span class="string">"ccvid='"</span> + obj['ccVid<span class="string">'] + "'</span>,"  </p></li><li><p>            <span class="keyword">if</span> isUpdateTitle:  </p></li><li><p>                sql += <span class="string">"title='"</span> + obj['title<span class="string">'] + "'</span>,"  </p></li><li><p>            sql += <span class="string">"post_time='"</span> + obj['release<span class="string">'] + "'</span>,"  </p></li><li><p>            sql += <span class="string">"author='"</span> + obj['user<span class="string">'] + "'</span>,"  </p></li><li><p>            sql += <span class="string">"channel='"</span> + obj['channel<span class="string">'] + "'</span>,"  </p></li><li><p>            sql += <span class="string">"tags='"</span> + obj['tag<span class="string">'] + "'</span>,"  </p></li><li><p>            nowtime = time.strftime(<span class="string">'%Y-%m-%d-%H-%M-%S'</span>,time.localtime(time.time()))  </p></li><li><p>            sql += <span class="string">"check_time='"</span> + nowtime +<span class="string">"',"</span></p></li><li><p>            sql += <span class="string">"status=0 "</span></p></li><li><p>            sql += <span class="string">"WHERE video_id="</span>+videoId  </p></li><li><p><br/></p></li><li><p>            <span class="special">self</span>.execute(sql)  </p></li><li><p><br/></p></li><li><p>            <span class="comment">#更新count表</span></p></li><li><p>            <span class="keyword">if</span>( obj[<span class="string">'views'</span>] != <span class="string">'error'</span> ):  </p></li><li><p>                nowdate = time.strftime(<span class="string">'%Y-%m-%d'</span>,time.localtime(time.time()))  </p></li><li><p>                sql = <span class="string">"SELECT * FROM counts WHERE "</span></p></li><li><p>                sql += <span class="string">"date = '"</span> + nowdate + <span class="string">"' and video_id="</span> + videoId  </p></li><li><p>                rst = <span class="special">self</span>.query(sql)  </p></li><li><p>                <span class="keyword">if</span> len(rst) > <span class="number">0</span>:<span class="comment">#如果当天已有记录,则更新</span></p></li><li><p>                    sql = <span class="string">"UPDATE counts SET count="</span>+obj[<span class="string">'views'</span>]  </p></li><li><p>                    sql +=<span class="string">" WHERE video_id="</span> + videoId + <span class="string">" AND date='"</span> + nowdate+ <span class="string">"'"</span></p></li><li><p>                <span class="keyword">else</span>:<span class="comment">#否则插入</span></p></li><li><p>                    sql = <span class="string">"INSERT INTO counts VALUES"</span></p></li><li><p>                    sql += <span class="string">"(null,"</span> +videoId+<span class="string">",'"</span>+nowdate+<span class="string">"',"</span>+obj[<span class="string">'views'</span>] + <span class="string">")"</span></p></li><li><p>            <span class="special">self</span>.execute(sql)                 </p></li><li><p>            <span class="special">self</span>.conn.commit()       </p></li><li><p>            Tools.writelog(<span class="string">'debug'</span>, <span class="string">"db commit ok"</span>)  </p></li><li><p>            <span class="keyword">return</span> ERR_OK  </p></li><li><p>        <span class="keyword">except</span> Exception,e:  </p></li><li><p>            <span class="keyword">print</span> e  </p></li><li><p>            <span class="keyword">return</span> ERR_DB_SQL_FAIL  </p></li><li><p><br/></p></li><li><p><span class="string">''</span><span class="comment">'''</span></p></li><li><p><span class="comment">任务线程类</span></p></li><li><p><span class="comment">'''</span></p></li><li><p><span class="keyword">class</span> TaskThread(threading.Thread):  </p></li><li><p><br/></p></li><li><p>    <span class="keyword">def</span> setTaskTool(<span class="special">self</span>,dbAdapter,gripper):  </p></li><li><p>        <span class="special">self</span>.dbAdapter = dbAdapter  </p></li><li><p>        <span class="special">self</span>.gripper = gripper  </p></li><li><p><br/></p></li><li><p>    <span class="keyword">def</span> setParam(<span class="special">self</span>,param):  </p></li><li><p>        <span class="special">self</span>.param = param  </p></li><li><p>        <span class="special">self</span>.videoId = param[<span class="string">'videoId'</span>]  </p></li><li><p>        <span class="keyword">assert</span> <span class="special">self</span>.videoId != ""  </p></li><li><p><br/></p></li><li><p>    <span class="keyword">def</span> init(<span class="special">self</span>):  </p></li><li><p>        <span class="special">self</span>.views = <span class="string">"0"</span></p></li><li><p>        <span class="special">self</span>.errcode = ERR_OK  </p></li><li><p><br/></p></li><li><p>    <span class="keyword">def</span> run(<span class="special">self</span>):  </p></li><li><p>        Tools.writelog(<span class="string">'debug'</span>,<span class="string">'开始爬虫任务,sessionId='</span>+<span class="special">self</span>.param[<span class="string">'sessionId'</span>])  </p></li><li><p>        <span class="special">self</span>.init()  </p></li><li><p>        <span class="keyword">try</span>:  </p></li><li><p>            <span class="comment">#更新数据库连接</span></p></li><li><p>            <span class="special">self</span>.dbAdapter.connect(<span class="special">self</span>.param[<span class="string">'dbhost'</span>],<span class="special">self</span>.param[<span class="string">'dbport'</span>],<span class="special">self</span>.param[<span class="string">'dbuser'</span>],<span class="special">self</span>.param[<span class="string">'dbpass'</span>],<span class="special">self</span>.param[<span class="string">'db'</span>])  </p></li><li><p>        <span class="keyword">except</span>:  </p></li><li><p>            <span class="special">self</span>.errcode = ERR_DB_CONNECT_FAIL <span class="comment">#数据库连接失败</span></p></li><li><p>            callback(<span class="special">self</span>.errcode)  </p></li><li><p>            <span class="keyword">return</span></p></li><li><p><br/></p></li><li><p>        <span class="comment">#查询该vid的视频</span></p></li><li><p>        sql = <span class="string">"SELECT "</span></p></li><li><p>        <span class="keyword">for</span> column <span class="keyword">in</span> DBMAP:  </p></li><li><p>            sql += column  </p></li><li><p>            <span class="keyword">if</span> column != DBMAP[len(DBMAP)-<span class="number">1</span>]:  </p></li><li><p>                sql += <span class="string">","</span></p></li><li><p><br/></p></li><li><p>        sql += <span class="string">" FROM videos"</span></p></li><li><p>        sql += <span class="string">" WHERE video_id="</span>+<span class="special">self</span>.videoId  </p></li><li><p>        video = <span class="special">self</span>.dbAdapter.query(sql)  </p></li><li><p>        <span class="keyword">assert</span> <span class="keyword">not</span> (len(video)><span class="number">1</span> <span class="keyword">or</span> len(video)==<span class="number">0</span>) <span class="comment">#有且仅有一条记录</span></p></li><li><p><br/></p></li><li><p>        url = video[<span class="number">0</span>][<span class="number">3</span>]  </p></li><li><p>        <span class="keyword">assert</span> url != ""   </p></li><li><p>        <span class="keyword">try</span>:  </p></li><li><p>            rst = <span class="special">self</span>.gripper.gripinfo(url)  </p></li><li><p>        <span class="keyword">except</span> urllib2.HTTPError,e:  </p></li><li><p>            <span class="special">self</span>.errcode = ERR_HTTP_STATUS <span class="comment">#HTTP状态错误</span></p></li><li><p>            <span class="special">self</span>.dbAdapter.updateErr(<span class="special">self</span>.videoId)  </p></li><li><p>        <span class="keyword">except</span> urllib2.URLError,e:  </p></li><li><p>            <span class="special">self</span>.errcode = ERR_HTTP_TIMEOUT <span class="comment">#HTTP连接超时</span></p></li><li><p>            <span class="special">self</span>.dbAdapter.updateErr(<span class="special">self</span>.videoId)  </p></li><li><p>        <span class="keyword">except</span>:  </p></li><li><p>            <span class="special">self</span>.errcode = ERR_UNKNOW <span class="comment">#未知错误</span></p></li><li><p>            <span class="special">self</span>.dbAdapter.updateErr(<span class="special">self</span>.videoId)  </p></li><li><p>        <span class="keyword">else</span>:  </p></li><li><p>            <span class="special">self</span>.views = rst[<span class="string">'views'</span>]  </p></li><li><p>            <span class="keyword">if</span> <span class="special">self</span>.views == <span class="string">"error"</span>:  </p></li><li><p>                <span class="special">self</span>.views = <span class="string">"-1"</span></p></li><li><p>                <span class="special">self</span>.errcode = ERR_GRIPVIEW <span class="comment">#数据抓取成功,点击量抓取失败</span></p></li><li><p>            <span class="comment">#更新数据库(特殊处理,如果原title中有 "-" 则不更新title字段)</span></p></li><li><p>            title = video[<span class="number">0</span>][<span class="number">5</span>]  </p></li><li><p>            <span class="keyword">assert</span> title != ""  </p></li><li><p>            <span class="keyword">if</span> re.match(<span class="string">'.*-.*'</span>, title):  </p></li><li><p>                <span class="special">self</span>.errocde = <span class="special">self</span>.dbAdapter.update(rst,<span class="special">self</span>.videoId,<span class="special">True</span>)  </p></li><li><p>            <span class="keyword">else</span>:  </p></li><li><p>                <span class="special">self</span>.errcode = <span class="special">self</span>.dbAdapter.update(rst,<span class="special">self</span>.videoId)  </p></li><li><p>        <span class="special">self</span>.callback(<span class="special">self</span>.errcode)  </p></li><li><p>        Tools.writelog(<span class="string">'info'</span>,<span class="string">'任务结束,sessionId='</span>+<span class="special">self</span>.param[<span class="string">'sessionId'</span>])  </p></li><li><p>        <span class="keyword">return</span></p></li><li><p><br/></p></li><li><p>    <span class="keyword">def</span> callback(<span class="special">self</span>,errcode):     </p></li><li><p>        results = {<span class="string">'errorcode'</span>:errcode,<span class="string">'count'</span>:int(<span class="special">self</span>.views)}  </p></li><li><p>        results = urllib.urlencode(results)  </p></li><li><p>        results = results.replace(<span class="string">'&'</span>, <span class="string">'%26'</span>)  </p></li><li><p>        url = <span class="special">self</span>.param[<span class="string">'callback'</span>]  </p></li><li><p>        url += <span class="string">"?"</span></p></li><li><p>        url += <span class="string">"sessionId="</span> + <span class="special">self</span>.param[<span class="string">'sessionId'</span>]  </p></li><li><p>        url += <span class="string">"&results="</span> + results  </p></li><li><p>        retry = <span class="number">0</span></p></li><li><p>        <span class="keyword">while</span> <span class="special">True</span>:  </p></li><li><p>            <span class="keyword">try</span>:  </p></li><li><p>                Tools.writelog(<span class="string">'debug'</span>,<span class="string">"回调主控,url="</span>+url)  </p></li><li><p>                urllib2.urlopen(url)  </p></li><li><p>                Tools.writelog(<span class="string">'debug'</span>,<span class="string">'回调成功'</span>)  </p></li><li><p>                <span class="keyword">break</span></p></li><li><p>            <span class="keyword">except</span> urllib2.URLError, e: <span class="comment">#超时、错误</span></p></li><li><p>                Tools.writelog(<span class="string">'debug'</span>,<span class="string">'回调主控超时,%s秒后重试'</span>%<span class="special">self</span>.param[<span class="string">'retryInterval'</span>])  </p></li><li><p>                retry+=<span class="number">1</span></p></li><li><p>                time.sleep(int(<span class="special">self</span>.param[<span class="string">'retryInterval'</span>]))  </p></li><li><p>                <span class="keyword">if</span>( retry > int(<span class="special">self</span>.param[<span class="string">'retry'</span>])):  </p></li><li><p>                    Tools.writelog(<span class="string">'error'</span>,<span class="string">'回调主控失败'</span>)  </p></li><li><p>                    <span class="keyword">return</span></p></li><li><p><br/></p></li><li><p><span class="string">''</span><span class="comment">'''</span></p></li><li><p><span class="comment">WEB服务类</span></p></li><li><p><span class="comment">'''</span></p></li><li><p><span class="keyword">class</span> MyHandler(BaseHTTPRequestHandler):  </p></li><li><p><br/></p></li><li><p>    dbAdapter = DBAdapter()  </p></li><li><p>    gripper = InfoGripper()  </p></li><li><p><br/></p></li><li><p>    <span class="keyword">def</span> pageSuccess(<span class="special">self</span>):  </p></li><li><p>        <span class="special">self</span>.send_response(<span class="number">200</span>)  </p></li><li><p>        <span class="special">self</span>.send_header(<span class="string">'Content-type'</span>, <span class="string">'text/html'</span>)  </p></li><li><p>        <span class="special">self</span>.end_headers()  </p></li><li><p><br/></p></li><li><p>    <span class="keyword">def</span> pageFail(<span class="special">self</span>):  </p></li><li><p>        <span class="special">self</span>.send_error(<span class="number">404</span>, <span class="string">"not found"</span>)  </p></li><li><p><br/></p></li><li><p>    <span class="keyword">def</span> getValue(<span class="special">self</span>,param):  </p></li><li><p>        src = <span class="special">self</span>.path + <span class="string">'&'</span></p></li><li><p>        reg = param + <span class="string">'='</span> + <span class="string">'(.*?)&'</span></p></li><li><p><br/></p></li><li><p>        value = Tools.getFromPatten(reg,src,<span class="special">True</span>)  </p></li><li><p>        <span class="keyword">return</span> value  </p></li><li><p><br/></p></li><li><p>    <span class="keyword">def</span> do_GET(<span class="special">self</span>):  </p></li><li><p>        isGetVersion = re.match(<span class="string">'.*vinfoant/version.*'</span>, <span class="special">self</span>.path)  </p></li><li><p>        isTask = re.match(<span class="string">'.*vinfoant/run.*'</span>, <span class="special">self</span>.path)  </p></li><li><p>        <span class="keyword">if</span>( isGetVersion ):  </p></li><li><p>            <span class="special">self</span>.pageSuccess()  </p></li><li><p>            <span class="special">self</span>.wfile.write(VERSION)  </p></li><li><p>        <span class="keyword">elif</span>( isTask ):  </p></li><li><p>            <span class="special">self</span>.pageSuccess()  </p></li><li><p>            param = {}  </p></li><li><p>            <span class="keyword">for</span> p <span class="keyword">in</span> PARAMS:  </p></li><li><p>                param[p] = <span class="special">self</span>.getValue(p) <span class="comment">#获取各项参数</span></p></li><li><p>            taskThread = TaskThread()  </p></li><li><p>            taskThread.setTaskTool(<span class="special">self</span>.dbAdapter, <span class="special">self</span>.gripper)  </p></li><li><p>            taskThread.setParam(param)  </p></li><li><p>            taskThread.start()<span class="comment">#启动任务线程</span></p></li><li><p>            <span class="special">self</span>.wfile.write(<span class="string">"ok"</span>)          </p></li><li><p>        <span class="keyword">else</span>:  </p></li><li><p>            <span class="special">self</span>.pageFail()  </p></li><li><p>        <span class="keyword">return</span></p></li><li><p><br/></p></li><li><p><span class="string">''</span><span class="comment">'''</span></p></li><li><p><span class="comment">启动WEB服务,全局入口</span></p></li><li><p><span class="comment">'''</span></p></li><li><p><span class="keyword">def</span> startHttpd():  </p></li><li><p>    <span class="keyword">try</span>:  </p></li><li><p>        Tools.writelog(<span class="string">'debug'</span>,<span class="string">'httpd start..listen on '</span>+str(PORT))  </p></li><li><p>        httpd = HTTPServer((<span class="string">''</span>,PORT), MyHandler )  </p></li><li><p>        Tools.writelog(<span class="string">'debug'</span>,<span class="string">'success'</span>)  </p></li><li><p>        httpd.serve_forever()  </p></li><li><p>    <span class="keyword">except</span> KeyboardInterrupt:  </p></li><li><p>        Tools.writelog(<span class="string">'debug'</span>,<span class="string">'httpd close..'</span>)  </p></li><li><p>        httpd.socket.close()  </p></li><li><p><br/></p></li><li><p><span class="keyword">if</span> __name__ == <span class="string">'__main__'</span>:  </p></li><li><p>    startHttpd()  <br/></p></li></ol> <!--end::Text--> </div> <!--end::Description--> <div class="mt-5"> <!--关键词搜索--> </div> <div class="mt-5"> <p class="fc-show-prev-next"> <strong>上一篇:</strong><a href="/kaifa/show-14102109.html">二维数组作为函数的实参以及定义函数形参的方法是什么</a><br> </p> <p class="fc-show-prev-next"> <strong>下一篇:</strong><a href="/kaifa/show-14102111.html">python代码的优化技巧</a> </p> </div> <!--begin::Block--> <div class="d-flex flex-stack mb-2 mt-10"> <!--begin::Title--> <h3 class="text-dark fs-5 fw-bold text-gray-800">相关内容</h3> <!--end::Title--> </div> <div class="separator separator-dashed mb-9"></div> <!--end::Block--> <div class="row g-10"> </div> </div> <!--end::Table widget 14--> </div> <!--end::Col--> <!--begin::Col--> <div class="col-xl-4 mt-0"> <!--begin::Chart Widget 35--> <div class="card card-flush h-md-100"> <!--begin::Header--> <div class="card-header pt-5 "> <!--begin::Title--> <h3 class="card-title align-items-start flex-column"> <!--begin::Statistics--> <div class="d-flex align-items-center mb-2"> <!--begin::Currency--> <span class="fs-5 fw-bold text-gray-800 ">热门资讯</span> <!--end::Currency--> </div> <!--end::Statistics--> </h3> <!--end::Title--> </div> <!--end::Header--> <!--begin::Body--> <div class="card-body pt-3"> <!--begin::Item--> <div class="d-flex flex-stack mb-7"> <!--begin::Symbol--> <div class="symbol symbol-60px symbol-2by3 me-4"> <div class="symbol-label" style="background-image: url('/uploadfile/[db:缩略图]')"></div> </div> <!--end::Symbol--> <!--begin::Title--> <div class="m-0"> <a href="/weixiu/show-14537931.html" class="text-dark fw-bold text-hover-primary fs-6">空调连续工作多久需要停机休息</a> <span class="text-gray-600 fw-semibold d-block pt-1 fs-7">空调连续工作的时间取决于多个因素,包括空调的型号、功率、使用环境和维护情况等。一般来说,空调可以连续...</span> </div> <!--end::Title--> </div> <!--begin::Item--> <div class="d-flex flex-stack mb-7"> <!--begin::Symbol--> <div class="symbol symbol-60px symbol-2by3 me-4"> <div class="symbol-label" style="background-image: url('/uploadfile/[db:缩略图]')"></div> </div> <!--end::Symbol--> <!--begin::Title--> <div class="m-0"> <a href="/weixiu/show-14537930.html" class="text-dark fw-bold text-hover-primary fs-6">空调哪个符号是除湿的</a> <span class="text-gray-600 fw-semibold d-block pt-1 fs-7">空调除湿功能通常用一个水滴形状的符号表示。不同品牌和型号的空调遥控器可能会有所差异,但一般来说,除湿...</span> </div> <!--end::Title--> </div> <!--begin::Item--> <div class="d-flex flex-stack mb-7"> <!--begin::Symbol--> <div class="symbol symbol-60px symbol-2by3 me-4"> <div class="symbol-label" style="background-image: url('/uploadfile/[db:缩略图]')"></div> </div> <!--end::Symbol--> <!--begin::Title--> <div class="m-0"> <a href="/weixiu/show-14537929.html" class="text-dark fw-bold text-hover-primary fs-6">格力空调多长时间加一次氟利昂</a> <span class="text-gray-600 fw-semibold d-block pt-1 fs-7">1、一般情况下,空调对氟利昂的使用量是非常小的,所以在空调使用了四年左右的时候再考虑加也没问题。2、...</span> </div> <!--end::Title--> </div> <!--begin::Item--> <div class="d-flex flex-stack mb-7"> <!--begin::Symbol--> <div class="symbol symbol-60px symbol-2by3 me-4"> <div class="symbol-label" style="background-image: url('/uploadfile/[db:缩略图]')"></div> </div> <!--end::Symbol--> <!--begin::Title--> <div class="m-0"> <a href="/weixiu/show-14537928.html" class="text-dark fw-bold text-hover-primary fs-6">空调用多长时间需要加氟一次</a> <span class="text-gray-600 fw-semibold d-block pt-1 fs-7">一般情况下是五年。当出现以下这几种情况时,空调才需要加氟。1、空调的室内机和室外机各有两个接口,当接...</span> </div> <!--end::Title--> </div> <!--begin::Item--> <div class="d-flex flex-stack mb-7"> <!--begin::Symbol--> <div class="symbol symbol-60px symbol-2by3 me-4"> <div class="symbol-label" style="background-image: url('/uploadfile/202609/83c0c0800a58e3b.jpg')"></div> </div> <!--end::Symbol--> <!--begin::Title--> <div class="m-0"> <a href="/news/show-14537927.html" class="text-dark fw-bold text-hover-primary fs-6">格调生活·C标思享荟:卡萨帝在...</a> <span class="text-gray-600 fw-semibold d-block pt-1 fs-7">9月12日的郑州龙湖金融岛,夜风轻拂,灯光璀璨。“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑...</span> </div> <!--end::Title--> </div> <!--begin::Item--> <div class="d-flex flex-stack mb-7"> <!--begin::Symbol--> <div class="symbol symbol-60px symbol-2by3 me-4"> <div class="symbol-label" style="background-image: url('/uploadfile/202609/bd5bdfc6ba7da8c.jpg')"></div> </div> <!--end::Symbol--> <!--begin::Title--> <div class="m-0"> <a href="/news/show-14537926.html" class="text-dark fw-bold text-hover-primary fs-6">品牌价值破千亿、高端份额持续领...</a> <span class="text-gray-600 fw-semibold d-block pt-1 fs-7">9月12日,“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑州站”在郑州龙湖金融岛举办。2026...</span> </div> <!--end::Title--> </div> <!--begin::Item--> <div class="d-flex flex-stack mb-7"> <!--begin::Symbol--> <div class="symbol symbol-60px symbol-2by3 me-4"> <div class="symbol-label" style="background-image: url('/uploadfile/[db:缩略图]')"></div> </div> <!--end::Symbol--> <!--begin::Title--> <div class="m-0"> <a href="/weixiu/show-14537925.html" class="text-dark fw-bold text-hover-primary fs-6">空调主板坏了修800还是换新的</a> <span class="text-gray-600 fw-semibold d-block pt-1 fs-7">空调主板坏了是修还是换新,需要考虑多个因素,以下是一些建议:1. 维修成本:如果维修费用较低,比如 ...</span> </div> <!--end::Title--> </div> <!--begin::Item--> <div class="d-flex flex-stack mb-7"> <!--begin::Symbol--> <div class="symbol symbol-60px symbol-2by3 me-4"> <div class="symbol-label" style="background-image: url('/uploadfile/[db:缩略图]')"></div> </div> <!--end::Symbol--> <!--begin::Title--> <div class="m-0"> <a href="/weixiu/show-14537924.html" class="text-dark fw-bold text-hover-primary fs-6">空调开多久需要休息多长时间</a> <span class="text-gray-600 fw-semibold d-block pt-1 fs-7">问题:空调开多久需要休息多长时间回答:1、在使用空调的过程中,一般空调开7~8个小时左右需要休息2~...</span> </div> <!--end::Title--> </div> <!--begin::Item--> <div class="d-flex flex-stack mb-7"> <!--begin::Symbol--> <div class="symbol symbol-60px symbol-2by3 me-4"> <div class="symbol-label" style="background-image: url('/uploadfile/[db:缩略图]')"></div> </div> <!--end::Symbol--> <!--begin::Title--> <div class="m-0"> <a href="/weixiu/show-14537923.html" class="text-dark fw-bold text-hover-primary fs-6">中央空调多长时间清洗一次</a> <span class="text-gray-600 fw-semibold d-block pt-1 fs-7">1、一般空调开机前清洗一次即可,空调开机中间时段再清洗一次,空调关机时清洗一次,这样比较合理。2、空...</span> </div> <!--end::Title--> </div> <!--begin::Item--> <div class="d-flex flex-stack mb-7"> <!--begin::Symbol--> <div class="symbol symbol-60px symbol-2by3 me-4"> <div class="symbol-label" style="background-image: url('/uploadfile/[db:缩略图]')"></div> </div> <!--end::Symbol--> <!--begin::Title--> <div class="m-0"> <a href="/weixiu/show-14537922.html" class="text-dark fw-bold text-hover-primary fs-6">中央空调氟利昂多久加一次</a> <span class="text-gray-600 fw-semibold d-block pt-1 fs-7">看空调制热和制冷程度,很多人的观点认为氟利昂必须一年放一次,其实这个观点是错误的,理解上面有点偏差,...</span> </div> <!--end::Title--> </div> </div> <!--end::Body--> </div> <!--end::Chart Widget 35--> </div> <!--end::Col--> </div> </div> <!--end::Content container--> </div> <!--end::Content--> </div> <!--end::Content wrapper--> <!--begin::Footer--> <div id="kt_app_footer" class="app-footer"> <!--begin::Footer container--> <div class="app-container container-xxl d-flex flex-column flex-md-row flex-center flex-md-stack py-3"> <!--begin::Copyright--> <div class="text-dark order-2 order-md-1"> <span class="text-muted fw-semibold me-1">2026 ©</span> 太卓网<a href="http://www.yexian114.com/">叶县生活网</a> <a href="https://www.wxx86.cn/">编程知识网</a> <a href="http://www.kcwzh.com/">开创游戏网</a> <a href="https://www.caiding5.net">菜丁网</a><a href="http://cn.office369.com">奥飞商务网</a> <a href="http://www.zlnznjj.com/">众乐知识网</a><a href="http://www.lhjia.com/">乐活家</a><a href="http://www.nengyuan100.com/">能源100网</a> <a href="http://it.tdroid.net/">泰达科技</a><a href="http://cn.tdroid.net/">太卓开发网</a><a href="http://cn.yuansudz.com/">元素科技网</a><a href="http://www.80hlw.com/">八零商务网</a><a href="http://game.tdroid.net/">土豆游戏网</a> </div> <!--end::Copyright--> <!--begin::Menu--> <ul class="menu menu-gray-600 menu-hover-primary fw-semibold order-1"> <li class="menu-item"> <a href="/news" target="_blank" class="menu-link px-2">科技资讯</a> </li> <li class="menu-item"> <a href="/jishu" target="_blank" class="menu-link px-2">技术分享</a> </li> <li class="menu-item"> <a href="/kaifa" target="_blank" class="menu-link px-2">程序开发</a> </li> <li class="menu-item"> <a href="/weixiu" target="_blank" class="menu-link px-2">设备维修</a> </li> </ul> <!--end::Menu--> </div> <!--end::Footer container--> </div> <!--end::Footer--> </div> <!--end:::Main--> </div> <!--end::Wrapper--> </div> <!--end::Page--> </div> <!--end::App--> <div id="kt_scrolltop" class="scrolltop" data-kt-scrolltop="true"> <!--begin::Svg Icon | path: icons/duotune/arrows/arr066.svg--> <span class="svg-icon"> <svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg"> <rect opacity="0.5" x="13" y="6" width="13" height="2" rx="1" transform="rotate(90 13 6)" fill="currentColor"></rect> <path d="M12.5657 8.56569L16.75 12.75C17.1642 13.1642 17.8358 13.1642 18.25 12.75C18.6642 12.3358 18.6642 11.6642 18.25 11.25L12.7071 5.70711C12.3166 5.31658 11.6834 5.31658 11.2929 5.70711L5.75 11.25C5.33579 11.6642 5.33579 12.3358 5.75 12.75C6.16421 13.1642 6.83579 13.1642 7.25 12.75L11.4343 8.56569C11.7467 8.25327 12.2533 8.25327 12.5657 8.56569Z" fill="currentColor"></path> </svg> </span> <!--end::Svg Icon--> </div> <!--begin::Javascript--> <script>var hostUrl = "/static/default/pc/";</script> <!--begin::Global Javascript Bundle(mandatory for all pages)--> <script src="/static/default/pc/plugins/global/plugins.bundle.js"></script> <script src="/static/default/pc/js/scripts.bundle.js"></script> <!--end::Global Javascript Bundle--> <!--end::Javascript--> </body> <!--end::Body--> </html>