Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #!/usr/bin/env python
- #coding: utf-8
- import time
- import requests
- import re
- from bs4 import BeautifulSoup
- '''
- A ideia é que o script seja capaz de copiar todas as letras do site letra.mus.br
- Pra isso, ele coleta o link para todos os estilos de música
- e para cada estilo de música, busca os artistas desse estilo
- Para cada artista, ele busca o link para cada música
- e depois faz a cópia apenas da letra da música para um arquivo: letras/NomeDaMusica.txt
- '''
- def get_link_estilos():
- '''
- Gera uma lista contendo todos os estilos disponíveis
- '''
- link = 'http://letras.mus.br/estilos/'
- page = requests.get(link)
- data = page.text
- soup = BeautifulSoup(data)
- links = soup.findAll('a', { 'class': '_s' })
- lista_links = []
- for item in links:
- estilos = re.findall(r'<a class="_s" href="/estilos/(.+)/"><span>.+</span></a>', str(item))
- lista_links.append(estilos)
- return lista_links
- def get_link_artistas(estilo):
- '''
- Recebe um estilo de música, e returna uma lista contendo todos os links(parciais) dos
- artistas desse estilo(top50).
- '''
- estilo_link = 'http://letras.mus.br/estilos/{0}'.format(estilo)
- page = requests.get(estilo_link) # gera o links para o estilo
- data = page.text # Coloca o response text dentro da variável data.
- soup = BeautifulSoup(data) # Cria objetivo soup.
- links = soup.findAll('a', { 'class': '_elemsug _s' }) # Pesquisa por linhas com: <a class="_elemsug _s"
- lista_links = [] # e retornar uma lista com todos as linas encontradas.
- for item in links:
- artistas = re.findall(r'<a class="_elemsug _s" href="/(.+)/"><span>.+</span></a>', str(item))
- lista_links.append(artistas)
- return lista_links
- def get_link_letras(artista):
- '''
- Recebe 'link' da função get_link_artistas e retorna uma
- lista contendo o link das músicas do artista
- '''
- artista_link = 'http://letras.mus.br/{0}'.format(artista)
- page = requests.get(artista_link)
- data = page.text
- soup = BeautifulSoup(data)
- links = soup.findAll('a', { 'href': re.compile('/' + artista + '/.+/') })
- lista_links = []
- for item in links:
- musica = re.findall(r'href="/' + artista + '/(.+)/"', str(item))
- if not musica == ['discografia']: lista_links.append(musica[0])
- return lista_links
- def get_letras(artista, letra):
- '''
- Recebe artista(ex: ac-dc), e musica(ex: 622), e retorna
- uma lista contendo: nome da música, e a letra completa.
- '''
- letra_link = 'http://letras.mus.br/{0}/{1}/'.format(artista, letra)
- page = requests.get(letra_link)
- data = page.text
- soup = BeautifulSoup(data)
- #
- letra = soup.findAll('div', {'id': 'div_letra'})
- nome_musica = soup.findAll('h1', {'itemprop': 'name'})
- letra = str(letra[0])
- nome_musica = str(nome_musica[0])
- letra = letra.replace('<p>','\n<p>') # evita ter dois versos na mesma linha
- nome_musica = nome_musica.replace('\n','')
- nome_musica = nome_musica.replace(' ','') #tira os espaços do nome da música
- letra = BeautifulSoup(letra)
- nome_musica = BeautifulSoup(nome_musica)
- letra = letra.getText() # tira as tags html
- nome_musica = nome_musica.getText()
- musica = []
- musica.append(nome_musica)
- musica.append(letra)
- return musica
- def main():
- # testes:
- #print get_link_estilos()
- #print get_link_letras('santiago-feliu')
- #print get_link_artistas('trova')
- # parte complicada:
- estilos = get_link_estilos()
- for item in estilos: # para cada estilo de música
- print 'Estilo: {0}'.format(item[0])
- artistas = get_link_artistas(item[0])
- for item in artistas: # para cada artista no estilo de música da vez
- letras = get_link_letras(item[0]) # Pega os links para as letras dos artistas
- artista = item[0]
- print '--- Arista: {0}'.format(artista)
- for musica in letras: # para item da lista de 'letras'
- letra = get_letras(artista, musica)
- nome_musica = letra[0].encode('utf8')
- letra = letra[1].encode('utf8')
- print '------ Música: {0}'.format(nome_musica)
- f = open('letras/{0}.txt'.format(nome_musica), 'w')
- f.write(letra)
- f.close()
- time.sleep(5) # não quero descobrir se enviar várias requisições por segundo dá processo.
- if __name__ == '__main__':
- main()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement