Advertisement
MarceloTheodoro

Projeto1 - MarceloTheodoro

May 27th, 2015
343
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 4.54 KB | None | 0 0
  1. #!/usr/bin/env python
  2. #coding: utf-8
  3. import time
  4. import requests
  5. import re
  6. from bs4 import BeautifulSoup
  7. '''
  8. A ideia é que o script seja capaz de copiar todas as letras do site letra.mus.br
  9. Pra isso, ele coleta o link para todos os estilos de música
  10. e para cada estilo de música, busca os artistas desse estilo
  11. Para cada artista, ele busca o link para cada música
  12. e depois faz a cópia apenas da letra da música para um arquivo: letras/NomeDaMusica.txt
  13. '''
  14.  
  15.  
  16. def get_link_estilos():
  17.     '''
  18.    Gera uma lista contendo todos os estilos disponíveis
  19.    '''
  20.     link = 'http://letras.mus.br/estilos/'
  21.     page = requests.get(link)
  22.     data = page.text
  23.     soup = BeautifulSoup(data)
  24.     links =  soup.findAll('a', { 'class': '_s' })
  25.     lista_links = []
  26.     for item in links:
  27.         estilos = re.findall(r'<a class="_s" href="/estilos/(.+)/"><span>.+</span></a>', str(item))
  28.         lista_links.append(estilos)
  29.     return lista_links
  30.  
  31. def get_link_artistas(estilo):
  32.     '''
  33.    Recebe um estilo de música, e returna uma lista contendo todos os links(parciais) dos
  34.        artistas desse estilo(top50).
  35.    '''
  36.     estilo_link = 'http://letras.mus.br/estilos/{0}'.format(estilo)
  37.     page = requests.get(estilo_link) # gera o links para o estilo
  38.     data = page.text # Coloca o response text dentro da variável data.
  39.     soup = BeautifulSoup(data) # Cria objetivo soup.
  40.     links =  soup.findAll('a', { 'class': '_elemsug _s' }) # Pesquisa por linhas com: <a class="_elemsug _s"
  41.     lista_links = []                                        # e retornar uma lista com todos as linas encontradas.
  42.     for item in links:
  43.         artistas = re.findall(r'<a class="_elemsug _s" href="/(.+)/"><span>.+</span></a>', str(item))
  44.         lista_links.append(artistas)
  45.     return lista_links
  46.  
  47. def get_link_letras(artista):
  48.     '''
  49.    Recebe 'link' da função get_link_artistas e retorna uma
  50.    lista contendo o link das músicas do artista
  51.    '''
  52.     artista_link = 'http://letras.mus.br/{0}'.format(artista)
  53.     page = requests.get(artista_link)
  54.     data = page.text
  55.     soup = BeautifulSoup(data)
  56.     links =  soup.findAll('a', { 'href': re.compile('/' + artista + '/.+/') })
  57.     lista_links = []
  58.     for item in links:
  59.         musica = re.findall(r'href="/' + artista  + '/(.+)/"', str(item))
  60.         if not musica == ['discografia']: lista_links.append(musica[0])
  61.     return lista_links
  62.  
  63. def get_letras(artista, letra):
  64.     '''
  65.    Recebe artista(ex: ac-dc), e musica(ex: 622), e retorna
  66.    uma lista contendo: nome da música, e a letra completa.
  67.    '''
  68.     letra_link = 'http://letras.mus.br/{0}/{1}/'.format(artista, letra)
  69.     page = requests.get(letra_link)
  70.     data = page.text
  71.     soup = BeautifulSoup(data)
  72.     #
  73.     letra =  soup.findAll('div', {'id': 'div_letra'})
  74.     nome_musica = soup.findAll('h1', {'itemprop': 'name'})
  75.     letra = str(letra[0])
  76.     nome_musica = str(nome_musica[0])
  77.     letra = letra.replace('<p>','\n<p>') # evita ter dois versos na mesma linha
  78.     nome_musica = nome_musica.replace('\n','')
  79.     nome_musica = nome_musica.replace(' ','') #tira os espaços do nome da música
  80.     letra = BeautifulSoup(letra)
  81.     nome_musica = BeautifulSoup(nome_musica)
  82.     letra = letra.getText() # tira as tags html
  83.     nome_musica = nome_musica.getText()
  84.  
  85.     musica = []
  86.     musica.append(nome_musica)
  87.     musica.append(letra)
  88.     return musica
  89.  
  90.  
  91.  
  92. def main():
  93.     # testes:
  94.     #print get_link_estilos()
  95.     #print get_link_letras('santiago-feliu')
  96.     #print get_link_artistas('trova')
  97.  
  98.     # parte complicada:
  99.     estilos = get_link_estilos()
  100.     for item in estilos: # para cada estilo de música
  101.         print 'Estilo: {0}'.format(item[0])
  102.         artistas = get_link_artistas(item[0])
  103.         for item in artistas: # para cada artista no estilo de música da vez
  104.             letras = get_link_letras(item[0]) # Pega os links para as letras dos artistas
  105.             artista = item[0]
  106.             print '--- Arista: {0}'.format(artista)
  107.             for musica in letras:  # para item da lista de 'letras'
  108.                 letra = get_letras(artista, musica)
  109.                 nome_musica = letra[0].encode('utf8')
  110.                 letra = letra[1].encode('utf8')
  111.  
  112.                 print '------ Música: {0}'.format(nome_musica)
  113.                 f = open('letras/{0}.txt'.format(nome_musica), 'w')
  114.                 f.write(letra)
  115.                 f.close()
  116.                 time.sleep(5) # não quero descobrir se enviar várias requisições por segundo dá processo.
  117.  
  118.  
  119. if __name__ == '__main__':
  120.     main()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement