• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

pedrotuga

web-spider - Faz download de todas as tabs do guitaretab.com

6 mensagens neste tópico

Este script é um exemplo de navegação avançada de páginas web. Em vez do tradicional browser e cliques após cliques há alternativas muito mais expeditas como por exemplo um script deste tipo que tira partido do enorme potencial das expressões regulares para seguir os links relevantes.

Depois, mais uma vez recorrendo a expressões regulares extrai o conteúdo que interessa e deita fora todo o lixo, ou seja, o layout do site etc.

O script ainda precisa de algum trabalho, falta embrulhar alguns fragmentos de código em blocos try ... except, faltam algumas verificações e eventualmente uma ou outra expressão regular pode ser revista.

A eficiencia deste programa pode ser muito aumentada se dividirmos isto por threads, infelizmente é uma técnica que eu não domino. Se alguém quiser pegar no código e torna-lo mais eficiente... força.

Isto não precisa de nenhum módulo que não seja distribuído com o python. Tenham o cuidado de colocar o script numa pasta nova pois todos as tabulatura vão ser sacadas para essa página e guardadas como ficheiros txt.

# -*- coding: utf-8 -*-

##############################################
#                                            #
#                                            #
#      G U I T A R E T A B . C O M           #
#             S P I D E R                    #
#                                            #
#   Released for educational puposes only    #
#                                            #
#  If you are interested in advanced web     #
#   browsing and searching visit us at       #
#          www.shareminer.com                #
#                                            #
##############################################

import re, urllib2, string

def download_artist_tabs(url_piece):
    complete_url = "http://www.guitaretab.com" + url_piece
    page = urllib2.urlopen(complete_url).read()
    songs_urls = re.findall('href="(/[a-z]/[a-zA-Z0-9\-]*?/\d*?.html)"',page)
    length = len(songs_urls)
    i=0
    while i<length:
        songs_urls[i] = "http://www.guitaretab.com" + songs_urls[i]
        i+=1

    for song_url in songs_urls:
        page = urllib2.urlopen(song_url).read()
        artist = re.findall('<TITLE>(.*?)\&',page)[0]
        song_title = re.findall('\( (.*?) \)</TITLE>',page)[0]
        tab = re.compile('<pre.*?>(.*?)</pre>', re.DOTALL).findall(page)[0]
        #tab = re.findall('<pre.*?>(.*?)</pre>',page, re.DOTALL)[0]
        filename = "%s - %s.txt"%(artist,song_title)
        
        try:
            fileHandle = open (filename, 'w' )
            fileHandle.write(tab)
            fileHandle.close()
        except:
            continue


leters=["a","b","c","d","e","f","g","h2","i","j","que","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z"]
all_artist_pages = list()
all_leter_pages = list()
leter_first_pages = list()

for leter in leters:
    leter_first_pages.append("http://www.guitaretab.com/%s.html"%(leter))


for a_leter_first_page in leter_first_pages:
    page = urllib2.urlopen(a_leter_first_page).read()
    other_links = re.findall('[a-z]\d\.html',page)
    #print other_links
    if len(other_links) > 0:
        all_leter_pages += other_links

length = len(all_leter_pages)
i = 0
while i<length:
    all_leter_pages[i] = "http://guitaretab.com/" + all_leter_pages[i]
    i+=1

all_leter_pages = all_leter_pages + leter_first_pages
print all_leter_pages

for iterator in all_leter_pages:
    page = urllib2.urlopen(iterator).read()
    leter_artist_pages = re.findall('href="(/[a-z]/[^ ]*/)"',page)
    #print leter_artist_pages
    all_artist_pages = all_artist_pages + leter_artist_pages


for artist in all_artist_pages:
    print artist
    download_artist_tabs(artist)

PS:O código acima afixado é mal parsado pelo SMF. Há caracteres que são alterados. Para ver o código livre de erros visitar este link no pastebin

http://pastebin.ca/raw/347752

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Resolvi alguns problemas.

Se a criação de um ficheiro falhar devido a caracteres inválidos o programa passa ao ficheiro seguinte.

Um expressão regular estava a apanhar mais caracteres do que necessario volta e meia, foi rescrita.

O código da mensagem anterior já foi actualizado.

Não se esqueçam de ver o código correcto no link to pastebin

http://pastebin.ca/raw/347752

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Épa obrigadão PedroTuga, precisa mesmo de algo do genero, vou analisar o código e ver se aprendo a fazer isso tudo direitinho para fazer um script para uma coisa que preciso cá para a loja, que me vai facilitar e muito o trabalho!

Já agora, tens algun(s) Tuts que me facilitem a aprender o que se faz nesse código? Ficaria mutio grato!

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
# -*- coding: utf-8 -*-

Pensava que este default do Python e que não precisava de ser declarado...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Épa obrigadão PedroTuga, precisa mesmo de algo do genero, vou analisar o código e ver se aprendo a fazer isso tudo direitinho para fazer um script para uma coisa que preciso cá para a loja, que me vai facilitar e muito o trabalho!

Já agora, tens algun(s) Tuts que me facilitem a aprender o que se faz nesse código? Ficaria mutio grato!

Para fazer uma coisa deste tipo, precisei de saber usar a urllib, expressões regulares e escrita em ficheiros

Para adquirir esse conhecimento li os dois tutoriais seguintes mais um sobre file IO cujo link não encontro

Python regular expressions - Tudo o que interessa saber sobre acesso expressões regulares e o seu uso em python

http://www.regular-expressions.info/python.html

URLLIB2, the missing manual - Breve exemplo de uso da urllib2

http://www.voidspace.org.uk/python/articles/urllib2.shtml

Outros bons links com boa documentação que tenho sempre À mão:

Devshed - Boa colecção de tutoriais de confinaça e faceis de seguir

http://www.devshed.com/c/b/Python/

Python quick reference - Muito prático para ter sempre à mão, bem mais directo que o manual official do python

http://rgruet.free.fr/PQR24/PQR2.4.html

Python cookbook - Boa colecção de exemplos de código reutilizáveis em python

http://pleac.sourceforge.net/pleac_python/

Não percas tempo com o "thinking in python", é o tipico livro que debulha a linguagem num detalhe exagerado e não te ensina grande coisa que possas usar.

Penso que é tudo o que precisas, qq coisa pergunta aí que já começo a estar mais familiarizado com python

rolando, penso que no windows é capaz de funcionar se essa linha, mas mais vale usa-la até porque isso vai buscar strings em utf-8 com bue de simbolos, ainda dá barraco se nao puseres lá isso.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Epa, mais uma vez obrigado pedrotuga pela documentacao! por acaso hoje ate comprei uma revista de linux e vinha a explicar como manusear ficheiros em python. Tou a voltar a ter pica para aprender python depois do phpthrowdown porcausa do servidor que montei ca na loja!

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora