comment
IRC Chat
play_arrow
Este sitio utiliza cookies propias y de terceros. Si continúa navegando consideramos que acepta el uso de cookies. OK Más Información.

Crawler

  • 3 Respuestas
  • 2656 Vistas

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado Once

  • *
  • Underc0der
  • Mensajes: 385
  • Actividad:
    5%
  • Reputación 0
    • Ver Perfil
    • El blog de Once
  • Twitter: @don_once
« en: Julio 23, 2014, 11:04:53 pm »

Este es un pequeño crawler que busca archivos según su extensión.

Una vez instaciada la clase, se pueden cambiar ciertos atributos, como los headers HTTP que se envian a la web (atributo headers). También se puede consultar la lista de links que apuntan a otra url.

Código: Python
  1. from urlparse import urlparse
  2. from urlparse import urljoin
  3.  
  4. import urllib2
  5. import copy
  6. import zlib
  7. import sys
  8. import re
  9.  
  10.  
  11. class OpenUrl(object):
  12.     headers = {"User-Agent":
  13.         "Mozilla/5.0 (Windows; U; Windows NT 6.1; rv:2.2) Gecko/20110201"}
  14.     def open(self, url):
  15.         try:
  16.             request = urllib2.Request(url, headers=self.headers)
  17.             obj_web = urllib2.urlopen(request)
  18.             response = obj_web.info()
  19.             data = obj_web.read()
  20.            
  21.             if response.has_key("Content-Encoding"):
  22.                 if "gzip" in response["Content-Encoding"]:
  23.                     print "Codificado"
  24.                     buffer = zlib.decompress(data, 16 + zlib.MAX_WBITS)
  25.             else:
  26.                 buffer = data
  27.         except Exception as e:
  28.             print "({0}) Error: {1}".format(url, e)
  29.             return False
  30.         else:
  31.             return buffer
  32.  
  33.  
  34. class Crawler(OpenUrl):
  35.     def __init__(self, url, buscar):
  36.         self.host = "http://" + urlparse(url).hostname
  37.         self.headers["Referer"] = self.host
  38.         self.revisar = set([url])
  39.         self.revisados = set()
  40.         self.permitidos = ("html", "php", "php5")
  41.         self.buscar = buscar
  42.         self.externos = set()
  43.         self.cola = set()
  44.         self.expresion = re.compile(
  45.             "(href|src|src)\s*?=\s*?[\"\'](.*?)[\"\']", re.I | re.S)
  46.  
  47.         self.encontrados = dict(map(lambda x: (x, set()), buscar))
  48.  
  49.     def crawl(self, profundidad):
  50.         if profundidad > 0:
  51.             self.revisar = self.revisar | self.cola
  52.             if self.revisar:
  53.                 print "Preparando para abrir:", len(self.revisar), "links"
  54.                 for url in copy.copy(self.revisar):
  55.                     if url in self.revisados:
  56.                         pass
  57.                     print "Abriendo:", url
  58.                     self.revisados.add(url)
  59.                     self.revisar.remove(url)
  60.                     data = self.open(url)
  61.                     if data:
  62.                         self.parsear(url, data)
  63.                 self.crawl(profundidad - 1)
  64.    
  65.     def parsear(self, location, data):        
  66.         for link in self.expresion.findall(data):
  67.             absoluto = self.paths(location, link[1])
  68.            
  69.             if absoluto:
  70.                 partes = urlparse(absoluto).path
  71.                 extension = partes.split(".")[-1]
  72.                 if extension in self.buscar:
  73.                     self.encontrados[extension].add(absoluto)
  74.                 elif extension in self.permitidos:
  75.                     self.cola.add(absoluto)
  76.    
  77.     def paths(self, relative, path):
  78.         if path.startswith(self.host):
  79.             return path
  80.         elif path.startswith("http"):
  81.             self.externos.add(path)
  82.             return False
  83.         else:
  84.             return urljoin(relative, path)
  85.            
  86.  
  87. def mostrar(objeto):
  88.     for tag in objeto.encontrados:
  89.         print "\r\n" + tag
  90.         print "\r\n".join(list(objeto.encontrados[tag]))
  91.    
  92.  
  93. def info():
  94.     print "Uso: crawler.py <host> <profundidad> <extensiones>"
  95.     print "La lista de extensiones a buscar debe estar separada por , (coma)"
  96.  
  97. try:
  98.     parametros = sys.argv[1:]
  99.     url = parametros[0]
  100.     profundidad = int(parametros[1])
  101.     buscar = "".join(parametros[2:])
  102.     buscar = buscar.split(",")
  103. except:
  104.     info()
  105.     exit()
  106.  
  107.  
  108. a = Crawler(url, buscar)
  109. try:
  110.     a.crawl(profundidad)
  111. except KeyboardInterrupt:
  112.     mostrar(a)
  113.     exit()
  114. else:
  115.     mostrar(a)

Saludos!






You are not allowed to view links. Register or Login

Conectado ANTRAX

  • *
  • Administrator
  • Mensajes: 5331
  • Actividad:
    60%
  • Reputación 29
  • ANTRAX
    • Ver Perfil
    • Underc0de
    • Email
  • Skype: underc0de.org
  • Twitter: @Underc0de
« Respuesta #1 en: Julio 23, 2014, 11:34:53 pm »
Genio Once!!!!!!!
Con cambio de nick y todo!

Saludos!
ANTRAX


Desconectado Once

  • *
  • Underc0der
  • Mensajes: 385
  • Actividad:
    5%
  • Reputación 0
    • Ver Perfil
    • El blog de Once
  • Twitter: @don_once
« Respuesta #2 en: Julio 24, 2014, 03:00:44 pm »
You are not allowed to view links. Register or Login
Genio Once!!!!!!!
Con cambio de nick y todo!

Saludos!
ANTRAX

Jajjaja, así es bro, con cambio de nick y todo.

Saludos!






You are not allowed to view links. Register or Login

Desconectado WhiZ

  • *
  • Underc0der
  • Mensajes: 395
  • Actividad:
    0%
  • Reputación 0
    • Ver Perfil
« Respuesta #3 en: Julio 24, 2014, 07:02:00 pm »
Excelente Once!!! Hace un tiempo atrás, cuando hacíamos los retos, charlamos acerca de hacer un crawler en python. Al final, nunca me puse pero por suerte vos sí jeje.

Gracias por compartir!

Saludos!
WhiZ


 

¿Te gustó el post? COMPARTILO!



Web Security Tool Crawler

Iniciado por ZanGetsu

Respuestas: 0
Vistas: 1087
Último mensaje Abril 26, 2013, 04:44:55 pm
por ZanGetsu