Jump to content

Recommended Posts

Posted (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 by Dr_Lion
Posted

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?

Posted (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 by Dr_Lion
  • 2 weeks later...
Posted

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!

  • 2 months later...
Posted

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.

  • Vote 1

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 account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.