Dr_Lion Posted June 3, 2012 at 03:31 PM Report #460013 Posted June 3, 2012 at 03:31 PM (edited) Decidi fazer um crawler para uso próprio, a linguagem escolhida foi o python. Existem vários na net, vi alguns e decidi criar o meu de raiz. No entanto estou com algumas dificuldades num aspecto e gostava de saber as vossas opiniões. Como implementar a profundidade no crawler? Neste momento o script corre até esgotar todos os links obtidos, a partir de um link inicial passado por parâmetro. O que aocntece, é que sem profundidade, provavelmente vai ficar a correr indefinidamente, e eu gostava de ter uma condição de paragem. Aqui fica o código: #Author: Dr_Lion # 03 - 06 - 2012 import sys import re import urllib import urllib2 import urlparse lista_visitados = [] lista_p_visitar = [sys.argv[1]] tmplin="" linkregex = re.compile('[ "]') #passar em argumento o site inicial "http://www.chupa-mos.com" tem que ter o http caso contrario nao funca for crawling in lista_p_visitar: try: #print lista_p_visitar lista_p_visitar.remove(crawling) print crawling except KeyError: break try: f = urllib2.urlopen(crawling) except: continue pagina = f.read() lista_visitados.append(crawling) tmp_pal = re.split(linkregex, pagina) for wl in tmp_pal: if wl.startswith('www'): tmplin = 'http://' + wl elif wl.startswith('http://'): tmplin = wl if tmplin not in lista_visitados and tmplin not in lista_p_visitar: lista_p_visitar.append(tmplin) fich=open("conteudo_pag", "w") for link in lista_visitados: fich.write(link + '\n') fich.write("\nlista de por visitar\n") for link in lista_p_visitar: fich.write(link + '\n') fich.close() print lista_p_visitar #print lista_visitados print "terminado" Edited June 3, 2012 at 03:35 PM by Dr_Lion
djthyrax Posted June 3, 2012 at 11:10 PM Report #460156 Posted June 3, 2012 at 11:10 PM Estás a atacar o problema de forma errada. http://pt.wikipedia.org/wiki/Recursividade_%28ci%C3%AAncia_da_computa%C3%A7%C3%A3o%29 Não peças ajuda por PM! A tua dúvida vai ter menos atenção do que se for postada na secção correcta do fórum!
Dr_Lion Posted June 7, 2012 at 08:56 PM Author Report #461258 Posted June 7, 2012 at 08:56 PM Sim usar a recursividade é uma maneira. No entanto nunca fui muito bom. Usando a recursividade, não é suposto passar as listas por parâmetro, a par com o nível de profundidade? É que experimentei passar apenas o nível, e as listas são alteradas na mesma dentro da função. Para que funciona então a passagem por parâmetro?
Dr_Lion Posted June 10, 2012 at 02:56 PM Author Report #461770 Posted June 10, 2012 at 02:56 PM (edited) Aqui vai o código que tenho agora, crawler com função recursiva em python: #Author: Dr_Lion # 03 - 06 - 2012 import sys import re import urllib import urllib2 import urlparse lista_visitados = [] lista_p_visitar = [sys.argv[1]] lista_p_visitar2 = [] lim_pfund = int(sys.argv[2]) linkregex = re.compile('[ "]') def fun_craw(profundidade, lista_p_visitar): print profundidade for crawling in lista_p_visitar: try: #print lista_p_visitar lista_p_visitar.remove(crawling) print crawling except KeyError: break try: f = urllib2.urlopen(crawling) except: continue pagina = f.read() lista_visitados.append(crawling) tmp_pal = re.split(linkregex, pagina) for wl in tmp_pal: if wl.startswith('www'): tmplin = 'http://' + wl elif wl.startswith('http://'): tmplin = wl else: tmplin = "" if tmplin not in lista_visitados and tmplin not in lista_p_visitar and tmplin not in lista_p_visitar2: lista_p_visitar2.append(tmplin) if profundidade < lim_pfund: fun_craw(profundidade+1, lista_p_visitar2) else: return fun_craw(0, lista_p_visitar) fich=open("conteudo_pag", "w") for link in lista_visitados: fich.write(link + '\n') fich.write("\nlista de por visitar\n") for link in lista_p_visitar: fich.write(link + '\n') fich.close() print "terminado" Não tem erros, no entanto não percebo bem porquê, mas parece-me que não consigo controlar o crawler com a profundidade. Se bem que as páginas que tenho usado são bastante ramificadas, mas com profundidade 1 não deveria ser assim tão demorado e está a ser. Alguém tem alguma ideia do que estou a fazer mal? Obrigado a todos. Edited June 14, 2012 at 08:28 PM by Dr_Lion
Dr_Lion Posted June 23, 2012 at 12:21 AM Author Report #465074 Posted June 23, 2012 at 12:21 AM Ninguém? o programa funciona, mas parece-me que estou a passar as listas de forma errada pois este não se está a chamar várias vezes recursivamente, apenas se chama uma vez.
djthyrax Posted June 30, 2012 at 01:58 PM Report #466572 Posted June 30, 2012 at 01:58 PM Não olhei bem para o teu código, mas experimenta mudares o parâmetro (e a lógica) de "nível actual de profundidade" para "níveis de profundidade que ainda posso fazer", assim fazes a verificação da profundidade logo no início da função. Outra coisa, tem cuidado com a indentação do ´codigo. Não peças ajuda por PM! A tua dúvida vai ter menos atenção do que se for postada na secção correcta do fórum!
Toaki Posted September 6, 2012 at 04:21 PM Report #474653 Posted September 6, 2012 at 04:21 PM Já venho tarde e não trago nada objetivo para o tópico, mas deixo um link muito bom: http://www.udacity.com/overview/Course/cs101/CourseRev/apr2012 O projeto Udacity resumidamente é uma Universidade aberta e gratuita online. Este é a filosofia. Um dos cursos presentes é esse: criar um web crawler com Python. As primeiras lições são muito básicas mas as avançadas podem ser úteis para tirar ideias. Mas as aulas não são povoadas por qualquer um, são vários os nomes famosos que participam, quer seja dando aulas ativamente, pequenas introduções ou entrevistas, por exemplo: o presidente da mozilla, criador do google, criador do carro google, etc... O projeto Udacity está em enorme crescimento e contribuiu ativamente para o currículo uma vez que atribui diplomas através de exames finais online, e tem parcerias com grandes nomes da industria. Depois de escrever isto e voltar a ler soa-me um pouco a propaganda mas a verdade é que tenho estado muito entusiasmado com os diferentes cursos. Abraço, e embora tarde para o tópico, talvez seja útil a alguém interessado no tema. 1 Report
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now