Guest User

Untitled

a guest
Nov 22nd, 2012
496
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #!/usr/bin/env python
  2. # -*- coding: utf-8 -*-
  3.  
  4. import re
  5. import os
  6. import pycurl
  7. import lxml.html
  8. from lxml import etree
  9. import StringIO
  10. import html5lib
  11. from html5lib import treebuilders
  12.  
  13.  
  14. class vk_dwl():
  15.  
  16.     def __init__(self, email, password):
  17.         self.email = email
  18.         self.password = password
  19.         self.cookie = ''
  20.         self.crl = pycurl.Curl()
  21.         self.errlog = open('err.log', 'a')
  22.         #self.filt = re.compile('[\x00\x03\x10\x13\x20-\xD7FF\xE000-\xFFFD\x10000]')
  23.         self.filt = re.compile('(?u)[\x00\x03\x10\x13]')
  24.         self.fn1 = re.compile('(?u)  *')
  25.         self.fn2 = re.compile('(?u)^ *|  *$')
  26.         self.fn3 = re.compile('(?u) -$')
  27.         self.fn4 = re.compile('(?u)/')
  28.  
  29.     def __del__(self):
  30.         self.errlog.close()
  31.  
  32.     def get_url(self, url):
  33.         if url:
  34.             t = StringIO.StringIO()
  35.             self.crl.setopt(pycurl.URL, url)
  36.             self.crl.setopt(pycurl.HTTPHEADER, ["Accept:"])
  37.             self.crl.setopt(pycurl.WRITEFUNCTION, t.write)
  38.             self.crl.setopt(pycurl.FOLLOWLOCATION, 1)
  39.             self.crl.setopt(pycurl.MAXREDIRS, 5)
  40.             self.crl.setopt(pycurl.COOKIEFILE, self.cookie)
  41.             self.crl.perform()
  42.             t = self.filt.sub('', t.getvalue())
  43.             return html5lib.parse(t, treebuilder = "lxml", namespaceHTMLElements = False), t
  44.         else:
  45.             return None
  46.  
  47.     def get_dump(self, url, fname):
  48.         if url and fname:
  49.             f = open(fname,'w')
  50.             self.crl.setopt(pycurl.URL, url)
  51.             self.crl.setopt(pycurl.HTTPHEADER, ["Accept:"])
  52.             self.crl.setopt(pycurl.WRITEFUNCTION, f.write)
  53.             self.crl.setopt(pycurl.FOLLOWLOCATION, 1)
  54.             self.crl.setopt(pycurl.MAXREDIRS, 5)
  55.             self.crl.setopt(pycurl.COOKIEFILE, self.cookie)
  56.             self.crl.perform()
  57.             f.close()
  58.  
  59.     def get_file(self, fname):
  60.         f = open(fname, 'r')
  61.         res = ''
  62.         for ln in f.readlines():
  63.             res += ln + '\n'
  64.         f.close()
  65.         return html5lib.parse(res, treebuilder = "lxml", namespaceHTMLElements = False), res
  66.  
  67.     def login(self):
  68.         tree, src = self.get_url('http://vk.com/login.php?email='+self.email+'&pass='+self.password)
  69.         # Тут нужно попарсить скрипт на предмет наличия ошибок при авторизации и выдавать код ошибки в резалте
  70.  
  71.     def get_audio(self, vkid = None):
  72.         # Получение списка аудио
  73.         # Надо записывать список url
  74.         # При старте смотреть, есть ли список, если список есть, то подгружать его в память и перед загрузкой проверять наличие урла
  75.        
  76.         if vkid:
  77.             upref = 'http://vk.com/audio?friend=' + str(vkid)
  78.         else:
  79.             upref = 'http://vk.com/audio'
  80.  
  81.         def get_a(offset = 0):
  82.             if offset:
  83.                 if upref == 'http://vk.com/audio':
  84.                     tree = self.get_url(upref + '?offset=' + str(offset))[0]
  85.                 else:
  86.                     tree = self.get_url(upref + '&offset=' + str(offset))[0]
  87.             else:
  88.                 tree = self.get_url(upref)[0]
  89.             links = tree.findall('//td[@class="play_btn"]')
  90.             names = tree.findall('//td[@class="info"]')
  91.             return tree, links, names
  92.  
  93.         def fn_corr(fname):
  94.             if fname:
  95.                 res = self.fn1.sub(' ', fname)
  96.                 res = self.fn2.sub('', res)
  97.                 res = self.fn3.sub('', res)
  98.                 res = self.fn4.sub('-', res)
  99.                 return res
  100.             else:
  101.                 return None
  102.  
  103.         # tr - tree, ln - links, nm - names
  104.         tr, ln, nm = get_a()
  105.  
  106.         summary = int(re.search('(?u)[0-9]+', tr.xpath('//div[@class="summary"]/b[@id="audio_summary"]/text()')[0]).group(0))
  107.         cln = len(ln)
  108.         cl = re.compile('(?u),[0-9]+$')
  109.  
  110.         lst = open('url.lst', 'w')
  111.         #err = open('err.log', 'w')
  112.  
  113.         for c in range(summary/cln+1):
  114.             if c:
  115.                 tr, ln, nm = get_a(c*cln)
  116.             print '=-' * 15 + ' ' + str(c*50) + ' ' + '-=' * 15
  117.             for i in range(len(ln)):
  118.                 url = cl.sub('', ln[i][1].values()[2])
  119.                 artist = nm[i].xpath('./div[@class="title_wrap"]/b/a/text()')[0]
  120.                 title = nm[i].xpath('.//span[@class="title"]/a/text()')
  121.                 if title:
  122.                     title = title[0]
  123.                 else:
  124.                     title = nm[i].xpath('.//span[@class="title"]/text()')[0]
  125.                 if title:
  126.                     fn = fn_corr(artist + ' - ' + title)
  127.                 else:
  128.                     fn = fn_corr(artist)
  129.                 if fn:
  130.                     fn += '.mp3'
  131.                     if not os.path.exists(fn):
  132.                         print 'Download: ' + url + ' -> ' + fn
  133.                         try:
  134.                             self.get_dump(url, fn)
  135.                             lst.write(url)
  136.                         except:
  137.                             print 'ERROR: Can\'t download file ' + fn
  138.                             try:
  139.                                 self.errlog.write('ERROR: Can\'t download ' + url + ' to file ' + fn)
  140.                             except:
  141.                                 print 'Can\'t write filename ' + fn + ' to logfile'
  142.                     else:
  143.                         print 'PASS: ' + fn
  144.  
  145.         lst.close()
  146.  
  147. tmp = vk_dwl('xxx@mail.ru', 'pass')
  148. tmp.login()
  149. tmp.get_audio('id')
RAW Paste Data