优酷视频下载爬虫

来源:互联网 发布:程序员对浏览器的 编辑:程序博客网 时间:2024/05/05 00:35
之前一直使用flcvd下载优酷视频,这周看到老师讲的爬虫。手痒痒了。于是捣腾了下!从优酷页面爬取视频页面,访问flcvd 抓取下载地址,生成迅雷下载列表。
通过爬虫对正则有更深入的理解。尤其是在优酷分2种:
'http://v\.youku\.com这个为视频播放页面。例如http://v.youku.com/v_show/id_XNDkyODQwNjgw.html  《楚汉传奇 第40集》。单集下载抓取
'http://www\.youku\.com/show_page 为剧集页面。例如:http://www.youku.com/show_page/id_z70902150919c11e0a046.html 《楚汉传奇》,可以批量抓取剧集的下载地址哦!

欢迎大家拍砖,有哪些好的建议请指出!

  1. #coding="utf-8"
  2. import re
  3. import urllib2
  4. import threading
  5. import Queue
  6. class youku(threading.Thread):

  7.     def __init__(self,baseUrl,youkuQueue):
  8.         threading.Thread.__init__(self)
  9.         self.baseUrl=baseUrl if self.hasHttp().match(baseUrl) else 'http://'+baseUrl
  10.         self.youkuQueue=youkuQueue
  11.         self.vshow=self.youku_v_show()
  12.         self.showpage=self.youku_show_page()
  13.         self.start()
  14.    
  15.     def hasHttp(self):
  16.         return re.compile("^http://")
  17.    
  18.     def youku_v_show(self):
  19.         return re.compile(r'http://v\.youku\.com/v_show/id_.+\.html')
  20.    
  21.     def youku_show_page(self):
  22.         return re.compile(r'http://www\.youku\.com/show_page/id_.+\.html')
  23.    
  24.     def parseUrl(self):
  25.         req=urllib2.urlopen(self.baseUrl)
  26.         contet=req.read()
  27.         
  28.         
  29.         if self.vshow.match(self.baseUrl):
  30.             return set(self.vshow.findall(contet))
  31.         else:
  32.             return set(self.showpage.findall(contet))
  33.             
  34.     def run(self):
  35.         print "start parse Youku "
  36.         matches=self.parseUrl()
  37.         print matches
  38.         for matche in matches:
  39.             print 'matches:%s'%matche
  40.             self.youkuQueue.put(matche)
  41. """
  42. if __name__=='__main__':
  43.     Base_Url="http://www.youku.com/show_page/id_z70902150919c11e0a046.html"
  44.     #Base_Url="http://tv.youku.com/search/"
  45.     #Base_Url="http://v.youku.com/v_show/id_XNDkyODUyMTQ0.html"
  46.     #Base_Url="http://www.baidu.com"
  47.     youkuQueue=Queue.Queue()
  48.     youku=youku(Base_Url,youkuQueue)
  49. """
复制代码

  1. #coding="utf-8"
  2. import re
  3. import urllib
  4. import urllib2
  5. import threading
  6. import Queue

  7. class flcvd(threading.Thread):
  8.     Bae_Url="http://www.flvcd.com/parse.php?"
  9.     def __init__(self,worknum,form,downloadList,youkuQueue):
  10.         threading.Thread.__init__(self)
  11.         #self.url=youkuUrl
  12.         self.showpage=self.hidentFileUrl()
  13.         self.vshow=self.youku_v_show()
  14.         self.herfshow=self.herfFileUrl()
  15.         self.form=form
  16.         self.downloadList=downloadList
  17.         self.youkuQueue=youkuQueue
  18.         self.worknum=worknum
  19.         self.start()
  20.    
  21.     def hidentFileUrl(self):
  22.         return re.compile('(http://f.youku.com/player/getFlvPath.+\s?)')

  23.     def herfFileUrl(self):
  24.         return re.compile(r'<a href=\"(http://f.youku.com/player/getFlvPath[^\"]+)')   
  25.         
  26.     def youku_v_show(self):
  27.         return re.compile(r'http://v\.youku\.com/v_show/id_.+\.html')        
  28.         
  29.     def headers(self,url):
  30.         heads={
  31.             'Host':'www.flvcd.com',
  32.             'Referer':url,
  33.             'User-Agent':'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.97 '
  34.         }        
  35.         return heads
  36.    
  37.     def compileUrl(self,youkuUrl):
  38.         params={'kw':youkuUrl}
  39.         encode=urllib.urlencode(params)
  40.         form="&format=%s"%(self.form if self.form  else '')
  41.         realUrl="%s%s%s"%(self.Bae_Url,encode,form)
  42.         return realUrl
  43.    
  44.     def parseUrl(self,youkuUrl):
  45.         targetUrl=self.compileUrl(youkuUrl)
  46.         req=urllib2.Request(
  47.             url =targetUrl,
  48.             headers = self.headers(targetUrl)
  49.         )
  50.         resp=urllib2.urlopen(req)
  51.         content=resp.read()
  52.         if self.vshow.match(youkuUrl):
  53.             return self.herfshow.findall(content)
  54.         else:
  55.             return self.showpage.findall(content)

  56.    
  57.     def run(self):
  58.         while True:
  59.             youkuUrl=self.youkuQueue.get()
  60.             print '[No:%d] flvcd robot youku url>>%s'%(self.worknum,youkuUrl)
  61.             matches=self.parseUrl(youkuUrl)
  62.             #print matches
  63.             for item in matches:
  64.                 #print item
  65.                 self.downloadList.append(item.rstrip())
  66.                
  67.             if self.youkuQueue.empty():
  68.                 print '[No:%d] flcvd no work ,bye bye...'%self.worknum
  69.                 break
  70.         
  71.         
  72. """   """   
  73. if __name__=='__main__':
  74.     youkuQueue=Queue.Queue()
  75.     youkuQueue.put('http://v.youku.com/v_show/id_XNDkzNTk2NDQw.html')
  76.     #youkuQueue.put('http://www.youku.com/show_page/id_z70902150919c11e0a046.html')
  77.     downloadList=[]
  78.     flcvd=flcvd(1,'super',downloadList,youkuQueue)
  79.    
复制代码


  1. #coding="utf-8"
  2. import re
  3. import urllib2
  4. from youku import youku
  5. from flcvd import flcvd
  6. from Queue import Queue


  7. class theadpool:

  8.     def __init__(self,form,downloadList,youkuQueue,worknum):
  9.         self.form=form
  10.         self.downloadList=downloadList
  11.         self.youkuQueue=youkuQueue
  12.         self.works=[]
  13.         self.worknum=worknum
  14.         self.initflcvd()
  15.    
  16.     def initflcvd(self):
  17.         for i in range(self.worknum):
  18.             self.works.append(flcvd(i ,self.form,self.downloadList,self.youkuQueue))
  19.             
  20.     def finish(self):
  21.         for work in self.works:
  22.             if work.isAlive():
  23.                 work.join()            
  24.         

  25. def thunder(downloadList):
  26.     thunderListFile=open('downloadlist.lst','w+')
  27.     downloadList=set(downloadList)
  28.     for download in downloadList:
  29.         thunderListFile.write('%s\n'%download);
  30.     thunderListFile.close()


  31. if __name__=='__main__':
  32.     downloadList=[]
  33.     youkuQueue=Queue()
  34.     worknum=4
  35.     Base_Url="http://v.youku.com/v_show/id_XNDkyODUyMTQ0.html"
  36.     #Base_Url="http://www.youku.com/show_page/id_z70902150919c11e0a046.html"
  37.    
  38.    
  39.     youku(Base_Url,youkuQueue)
  40.    
  41.     theadpools=theadpool('super',downloadList,youkuQueue,worknum)
  42.     theadpools.finish()
  43.    
  44.     thunder(downloadList)
复制代码














0 0
原创粉丝点击