Skynet

          ---------- ---------- 我的新 blog : liukaiyi.cublog.cn ---------- ----------

            BlogJava :: 首頁 :: 聯系 :: 聚合  :: 管理
            112 Posts :: 1 Stories :: 49 Comments :: 0 Trackbacks



          #關鍵字
             python,pycurl, SGMLParser ,sqlite3, 抓取 , 增量計算,encodeuri 轉換,crontab ,mail
          #參考
            sqlite3  http://linuxgazette.net/109/chirico1.html
            SGMLParser http://www.woodpecker.org.cn/diveintopython/html_processing/index.html




          提取 python
          import pycurl
          from sgmllib import SGMLParser
          import re
          from urllib import quote, unquote 

          #使用 SGMLParser(html 分析) 類繼承
          #
          詳細請查看
          #
             http://www.woodpecker.org.cn/diveintopython/html_processing/index.html
          class BaiduTop_GMLParser(SGMLParser):
              
          def reset(self, verbose=0):
                  SGMLParser.reset(self)
                  self.data
          =[]
                  self.a 
          = None
                  
              
          def start_a(self, attrs):
                  href 
          = [v for k, v in attrs if k=='href']
                  rsc
          =re.search('word=(.*)\+(.*)', href[0] )    
                  
          if href and rsc :
                     
          #baidu 頁面編碼為 gbk ,并且中文 encodeuri 了
                      #此轉換為 utf8
                      music=unquote(rsc.group(1)).decode('gbk').encode('utf8')
                      actors
          =unquote(rsc.group(2)).decode('gbk').encode('utf8')
                      self.data.append((actors,music))
                      self.a
          =True
              
          def getData(self):
                  
          return self.data
              
          def __init__(self):
                  self.reset()
                  c 
          = pycurl.Curl()
                  c.setopt(pycurl.URL, 
          'http://list.mp3.baidu.com/topso/mp3topsong.html?id=1?top2')
                  
          import StringIO
                  b 
          = StringIO.StringIO()
                  c.setopt(pycurl.WRITEFUNCTION, b.write)
                  c.setopt(pycurl.FOLLOWLOCATION, 
          1)
                  c.setopt(pycurl.MAXREDIRS, 
          5)
                  
          #c.setopt(pycurl.PROXY, 'http://11.11.11.11:8080')
                  #c.setopt(pycurl.PROXYUSERPWD, 'aaa:aaa')
                  c.perform()
                  self.feed(b.getvalue())



          使用 py
          #!python      
          #
           -*- coding: UTF8 -*-
          '''
          新添加入 top  
          當天全量
          沒有 歌手名

          退出 top

          drop table baidu_Top ;
          create table baidu_Top (
            id integer auto_increment  PRIMARY KEY ,
            actor varchar(300) ,
            music varchar(300) ,
            createTime DATE
          );

          '''


          import sqlite3,os,sys
          import datetime, calendar  
          import pdb

          from baiduTop500 import BaiduTop_GMLParser
          class Action():
              
          def __init__(self,conn,data):
                  self.conn 
          = conn 
                  self.data 
          = data 
                  self.allData 
          = []
                  self.newData 
          = []
                  self.newNotActorData
          =[]
                  self.allNotActorData
          =[]

              
          def insertAll(self): 
                  insertSql 
          = "insert into baidu_Top (actor,music,createTime) values (?,?,date()) ;"
                  isSql 
          = "select music from baidu_Top where actor=? and music=? and createTime=strftime('%Y-%m-%d',?) ;"
                  isSql2 
          = "select music from baidu_Top where actor=? and music=? and createTime=strftime('%Y-%m-%d',?) ;"
                  cur 
          = self.conn.cursor()
                  
          for actor,music in self.data :
                      
          try :
                          cur.execute(isSql,(actor,music,datetime.date.today())  )
                          res 
          = cur.fetchall()
                          
          if not res :
                              cur.execute(insertSql,(actor,music)  )
                              self.allData.append( (actor,music) )
                              
          if actor=="" or actor==" " :
                                  self.allNotActorData.append((actor,music))
                              conn.commit()
                          todate
          =(datetime.date.today()-datetime.timedelta(days=1))
                          cur.execute(isSql2,(actor,music,todate)  ) 
                          
          if not cur.fetchall() :
                              self.newData.append( (actor,music) )
                              
          if actor=="" or actor==" " :
                                  self.newNotActorData.append((actor,music))
                              conn.commit()
                      
          except Exception, myError:
                          excType, excValue, traceBack 
          = sys.exc_info()
                          
          print excType
                          
          print myError
                  
          try :
                      cur.close()
                  
          except:
                      
          pass
                      
              

          def pfor(title,data):
              
          for a,m in data :
                  
          print "%s\t%s\t%s" %(title,a,m)
          def line():
              
          print
              
          print "___________________________________________________________________________________"
              
          print "___________________________________________________________________________________"
              
          print 

          if   __name__  ==  "__main__":
              
          try:
                  conn 
          = sqlite3.connect("/home/xj_liukaiyi/src/python/baidu_top/ex500")
                  ac 
          = Action(conn,BaiduTop_GMLParser().getData())
                  ac.insertAll()
                  
          #ac.insertNewByDate()
                  
                  
          print '''說明 %s : 
                      new 對比前一天新添加
                      new not actor 對比前一天新增加但沒歌手名
                      all 當天top 500 展現全部 
                      all not actor 當天 top 500 展現全部全但沒歌手 
          ''' %(datetime.date.today())
                  line()
                  pfor(
          "new",ac.newData)
                  line()
                  pfor(
          "new not actor",ac.newNotActorData)
                  line()
                  pfor(
          "all",ac.allData)
                  line()
                  pfor(
          "all not actor",ac.allNotActorData)
              
          finally:
                  conn.close()



          再通過系統
          crontab -e


          郵箱 gbk 轉碼 ,后發送 。每天早上 5點
          0 5 * * * /usr/local/bin/python /home/xj_liukaiyi/src/python/baidu_top/Action.py|perl -MEncode -ne 'print encode("GBK", decode("UTF-8",$_));' > tmp ; mail -s "baidu Top 500"  liukaiyi@gmail.com  < tmp;



          整理 www.aygfsteel.com/Good-Game
          posted on 2009-05-06 09:47 劉凱毅 閱讀(1536) 評論(0)  編輯  收藏 所屬分類: python
          主站蜘蛛池模板: 门头沟区| 邳州市| 石首市| 深圳市| 新营市| 巴林右旗| 丰城市| 龙门县| 盐亭县| 闽侯县| 平定县| 大竹县| 忻城县| 井冈山市| 焉耆| 鹤壁市| 嘉善县| 克拉玛依市| 靖边县| 兰考县| 和平区| 长葛市| 织金县| 敦化市| 南华县| 沁水县| 宁阳县| 雷波县| 台中市| 囊谦县| 嘉兴市| 盘锦市| 无锡市| 克东县| 方正县| 石柱| 隆回县| 应城市| 舒城县| 邯郸市| 井研县|