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

deathseeker25

Webspider

16 mensagens neste tópico

Boas,

Estive a pensar em programar um webspider, decidi fazer umas pesquisas pelo Google e encontrei informações de que existem muitos webspiders escritos em Python. Ora, a minha abordagem à linguagem é mínima (tenho alguma experiência em C, PHP, JavaScript mas em Python tenho muito pouca) e portanto encontrei este código já feito, que decidi começar a estudar a partir daí:

import httplib
import sys
import re
from HTMLParser import HTMLParser


class miniHTMLParser( HTMLParser ):

  viewedQueue = []
  instQueue = []

  def get_next_link( self ):
    if self.instQueue == []:
      return ''
    else:
      return self.instQueue.pop(0)


  def gethtmlfile( self, site, page ):
    try:
      httpconn = httplib.HTTPConnection(site)
      httpconn.request("GET", page)
      resp = httpconn.getresponse()
      resppage = resp.read()
    except:
      resppage = ""

    return resppage


  def handle_starttag( self, tag, attrs ):
    if tag == 'a':
      newstr = str(attrs[0][1])
      if re.search('http', newstr) == None:
        if re.search('mailto', newstr) == None:
          if re.search('htm', newstr) != None:
            if (newstr in self.viewedQueue) == False:
              print "  adding", newstr
              self.instQueue.append( newstr )
              self.viewedQueue.append( newstr )
          else:
            print "  ignoring", newstr
        else:
          print "  ignoring", newstr
      else:
        print "  ignoring", newstr


def main():

  if sys.argv[1] == '':
    print "usage is ./minispider.py site link"
    sys.exit(2)

  mySpider = miniHTMLParser()

  link = sys.argv[2]

  while link != '':

    print "\nChecking link ", link

    # Get the file from the site and link
    retfile = mySpider.gethtmlfile( sys.argv[1], link )

    # Feed the file into the HTML parser
    mySpider.feed(retfile)

    # Search the retfile here

    # Get the next link in level traversal order
    link = mySpider.get_next_link()

  mySpider.close()

  print "\ndone\n"

if __name__ == "__main__":
  main()

Acontece que ao correr o código na Python Shell, dá-me estes dois erros:

Traceback (most recent call last):

  File "C:/Python25/myspider.py", line 79, in <module>

    main()

  File "C:/Python25/myspider.py", line 51, in main

    if sys.argv[1] == "":

IndexError: list index out of range

Alguém me pode dar uma ajuda?  ;)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Primeiro, o que é um webspider?

Segundo, esse erro dá-te por causa desta parte do código (penso eu).

def main():

  if sys.argv[1] == '':
    print "usage is ./minispider.py site link"
    sys.exit(2)

o sys.argv são argumentos que tens que passar na linha de comando do estilo "nomedeficheiro.py origem destino" neste caso, origem e destino seriam argumentos.

Pelo que diz no print, tens de colocar ./minispider.py o-site o-link

Experimenta e vê se dá ;)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Estou a ver que o webspidering está a ganhar adeptos! :) a "culpa" é do pedrotuga! :D

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Primeiro, o que é um webspider?

Segundo, esse erro dá-te por causa desta parte do código (penso eu).

def main():

  if sys.argv[1] == '':
    print "usage is ./minispider.py site link"
    sys.exit(2)

o sys.argv são argumentos que tens que passar na linha de comando do estilo "nomedeficheiro.py origem destino" neste caso, origem e destino seriam argumentos.

Pelo que diz no print, tens de colocar ./minispider.py o-site o-link

Experimenta e vê se dá :D

Sou o noob total em linguagens interpretadas, pelo que se justifica esta pergunta: como posso eu correr o script, estando eu em Windows? :)

Se fosse em Linux sei que bastava ir à linha de comandos e escrever ./minispider.py site , mas como estou em Windows não sei sequer como chegar á pasta onde está o ficheiro...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Primeiro, o que é um webspider?

Segundo, esse erro dá-te por causa desta parte do código (penso eu).

def main():

  if sys.argv[1] == '':
    print "usage is ./minispider.py site link"
    sys.exit(2)

o sys.argv são argumentos que tens que passar na linha de comando do estilo "nomedeficheiro.py origem destino" neste caso, origem e destino seriam argumentos.

Pelo que diz no print, tens de colocar ./minispider.py o-site o-link

Experimenta e vê se dá :D

Sou o noob total em linguagens interpretadas, pelo que se justifica esta pergunta: como posso eu correr o script, estando eu em Windows? :D

Se fosse em Linux sei que bastava ir à linha de comandos e escrever ./minispider.py site , mas como estou em Windows não sei sequer como chegar á pasta onde está o ficheiro...

É praticamente igual à consola de Linux. Vais a "Executar" (no menú Iniciar), escreves "cmd", e abres a linha de comandos. Depois fazes cd para dentro da pasta onde está o script, e escreves "minispider.py site link" e já deve de dar :)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Assim já deu, no entanto continua a dar erros:

Traceback (most recent call last):

  File "C:/Python25/myspider.py", line 79, in <module>

    main()

File "C:/Python25/myspider.py", line 57, in main

link = sys.argv[2]

Index error: list index out of range

Propostas de resolução?  :D

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

deathseeker25, experimenta:

try:
    site = sys.argv[1]
    link = sys.argv[2]
except IndexError:
    print "usage: ./minispider.py site link"
    sys.exit(2)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

deathseeker25, experimenta:

try:
    site = sys.argv[1]
    link = sys.argv[2]
except IndexError:
    print "usage: ./minispider.py site link"
    sys.exit(2)

Neste momento, quer eu coloque um site como parâmetro a executar quer não coloque nada, ele imprime sempre a mensagem "usage: ./myspider.py site link"... :D

O que poderá estar mal?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

deathseeker25, experimenta:

try:
    website = sys.argv[1]
    link = sys.argv[2]
except IndexError:
    print "usage: ./minispider.py site link"
    sys.exit(2)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

deathseeker25, experimenta:

try:
    website = sys.argv[1]
    link = sys.argv[2]
except IndexError:
    print "usage: ./minispider.py site link"
    sys.exit(2)

Continua a dar exactamente a mesma coisa. Quer eu coloque o site ou link ou não coloque nada, o programa imprime a mensagem: "usage: ./myspider.py site link". :)

EDIT: Cá fica o código actual da função main:

def main():

  try:
    website = sys.argv[1]
    link = sys.argv[2]
  except IndexError:
    print "usage: ./myspider.py site link"
    sys.exit(2)

  mySpider = miniHTMLParser()

  link = sys.argv[2]

  while link != '':

    print "\nChecking link ", link

    # Get the file from the site and link
    retfile = mySpider.gethtmlfile( sys.argv[1], link )

    # Feed the file into the HTML parser
    mySpider.feed(retfile)

    # Search the retfile here

    # Get the next link in level traversal order
    link = mySpider.get_next_link()

  mySpider.close()

  print "\ndone\n"

if __name__ == "__main__":
  main()

Se tiver feito asneira, diga-me exactamente no que falhei. Ando a dedicar-me um pouco ao Python de modo a aprender qualquer coisa sobre a linguagem.  :D

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
def main():
  try:
    website = sys.argv[1]
    link = sys.argv[2]
  except IndexError:
    print "usage: ./myspider.py site link"
    sys.exit(2)
  mySpider = miniHTMLParser()
  while link != '':
    print "\nChecking link ", link
    retfile = mySpider.gethtmlfile( website, link )
    mySpider.feed(retfile)
    link = mySpider.get_next_link()
  mySpider.close()
  print "\ndone\n"

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Agora dá-me este erro:

Traceback (most recent call last):

  File "C:\Python25\myspider.py", line 68, in <module>

    main()

NameError: name 'main' is not defined

;)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

deathseeker25, estás a passar dois argumentos?

Tenta correr assim: python -i <nome_do_file.py>

Depois estás no interpretador e podes analisar o ambiente pós-execução, tenta fazer um print ao sys.argv.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Triton exemplifica lá como devo fazer isso, porque estive aqui à volta disto e só tenho obtido mais e mais erros. Agora nem sequer deixa correr o programa, visto que diz que a sintaxe em

__name__ == "__main__" :
  main()

está inválida. ;)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

## [...] ##
def main():
  try:
    website = sys.argv[1]
    link = sys.argv[2]
  except IndexError:
    print "usage: ./myspider.py site link"
    sys.exit(2)
  mySpider = miniHTMLParser()
  while link != '':
    print "\nChecking link ", link
    retfile = mySpider.gethtmlfile( website, link )
    mySpider.feed(retfile)
    link = mySpider.get_next_link()
  mySpider.close()
  print "\ndone\n"

main()

Depois em windows chama o ficheiro assim:

H:\>F:\Python24\python.exe file.py "www.portugal-a-programar.org" "wiki.portugal-a-programar.org"

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