domingo, 19 de octubre de 2014

PYTHON: CREANDO NUESTRA HERRAMIENTA DE WEB SCRAPING [IV]

Regresando a nuestro script para extracción de datos, veremos como obtener las IP´s que se encuentren en una pagina objetivo.

EXTRAYENDO IP'S.

Para esto usaremos el siguiente regex:

1
REGEX_IP    = re.compile('[0-9]+(?:\.[0-9]+){3}')

Y añadiremos la siguiente función al script:

1
2
3
4
5
6
7
def Extraer_IP(HTML):
    try:
        IPs = re.findall(REGEX_IP, HTML)
        return IPs
    except Exception, e:
        print "[ERROR: Extraer_IP(HTML)] - ",e
        sys.exit(1)

Si observamos las funciones anteriores todas son prácticamente lo mismo y lo único que estamos cambiando aquí es el regex que enviamos, por lo que igual podríamos deshacernos de todas las anteriores y forma una función que englobe todas las anteriores y enviemos como parámetro el tipo de dato que queremos extraer... esa, ya es otra historia, pero les dejo la idea. Realizando una prueba sobre  el sitio www.us-proxy.org, que se presta perfecto para el ejemplo, nos percatamos que funciona sin problema:




Cabe mencionar que el regex en si no valida una IP correcta... es decir... bien podría tomar un string como el siguiente 987.654.321.987 y sabemos que no es un IP valida. Aun así, es un buen comienzo. 

BEAUTIFULSOUP

Hasta ahora las expresiones regulares han dominado y, pese a que se dio un breve -demasiado breve quizá- ejemplo en la entrada anterior - sobre el uso de Beautifulsoup (si no se ha leído la entrada anterior la librería puede descargarse aquí), aquí mostraremos uno mas. Una de las magias de esta librería consiste en que, si la pagina a analizar contiene una tabla (HTML) o datos en formato XML, realizar el barrido y extracción de datos es mucho mas sencillo. Realizaremos una prueba de esto sobre la pagina www.us-proxy.org debido a que contiene una tabla y es ideal para extraer de ella un par de proxys y su respectivo puerto:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
<table border="0" cellpadding="0" cellspacing="0" class="display fpltable" id="proxylisttable">
<thead>
   <tr>
      <th>IP Address</th>
      <th>Port</th>
      <th>Code</th>
      <th>Country</th>
      <th>Anonymity</th>
      <th>Google</th>
      <th>Https</th>
      <th>Last Checked</th>
   </tr>
</thead>

Para lo cual fabricamos la siguiente función:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
def ExtraerBS_IP(HTML):
    try:
        BS_HTML=BeautifulSoup(HTML)
        Max_Registros = 0
        Max_Registros = len(BS_HTML.findAll('tr'))-2
        while Max_Registros!=0:
            print BS_HTML('table')[0].findAll('tr')[Max_Registros].findAll('td')[0].string+':'+BS_HTML('table')[0].findAll('tr')[Max_Registros].findAll('td')[1].string
            Max_Registros=Max_Registros-1

    except Exception, e:
        print "[ERROR: ExtraerBS_IP(HTML)] - ",e
        sys.exit(1)

Probamos sobre el sitio:

URL='http://www.us-proxy.org/'
HTML=Extraer_HTML(URL)
ExtraerBS_IP(HTML)

Y nos retorna el resultado de la siguiente forma:



Esto nos puede servir para tener a la mano y de forma actual una lista de proxys a usar en otras herramientas - o en esta... ¬¬ ya que lo haga funcionar. Ya que andamos por aquí y recordando que nuestra lista de User_Agent no esta muy actualizada podemos hacer una función usando Beautifulsoap para extraer una lista mas amplia y quizá mas actualizada de estos. Procederemos a realizar la prueba en el sitio www.useragentstring.com/pages/Browserlist/Antes de ponernos a trabajar en la función debemos analizar- como en el caso anterior- la estructura de la pagina y en base a ello proceder a su diseño:



En base a lo anterior y revisando que el dato importante para nosotros se encuentra en la etiqueta 'li', fabricamos la siguiente función:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
def ExtraerBS_UserAgent(HTML):
    try:
        BS_HTML=BeautifulSoup(HTML)
        Max_Registros = 0
        Max_Registros = len(BS_HTML.find_all('li'))-2
        while Max_Registros!=0:
            print BS_HTML.find_all('li')[Max_Registros].string
            Max_Registros=Max_Registros-1

    except Exception, e:
        print "[ERROR: ExtraerBS_UserAgent(HTML)] - ",e
        sys.exit(1)

Usando la misma practica anterior:

URL='http://www.useragentstring.com/pages/Browserlist/'
HTML=Extraer_HTML(URL)
ExtraerBS_UserAgent(HTML)

Extraemos poco más de 2K registros:


Esta función puede ser aprovechada para extraer solo un numero limitado como  muestra y sobre escribir nuestro archivo de agent_user.txt (recuerde la primera entrada) de forma que siempre garanticemos el azar. Observando en base a los últimos dos ejemplos Beatifulsoap puede ser un auxiliar potente para el Web Scraping, pero, desafortunadamente sus funciones no son tan universales como el uso de regex para la extracción de información. Sin embargo, esto no tiene por que representar un punto del todo negativo ya que las estructura de las paginas no cambia de forma frecuente por lo que aunque tengamos que diseñar las funciones para un escenario particular estas pueden ser validas, más sencillas de elaborar y practicas por un largo periodo de tiempo.

A esta altura nuestro script ya puede extraer lo siguiente:

-Codigo HTML.
-E-mail.
-URL.
-IP.
-IP+Puerto (de una pagina en especifico).
-User_Agent (de una pagina en especifico).


Lo que ya representa un buen avance. Este sera el alcance de esta serie dejando a los interesados la tarea de explorar y explotar tanto el uso de regex como de Beautifulsoap. Espero les resulte de utilidad.

CONCLUSIÓN.


-Python es una lenguaje de programación flexible, poderoso y con una sencillez increíble. 
-Web Scraping, como han podido ver en una forma algo resumida puede ser una técnica poderosa orientada a la creación de herramientas OSINT mucho mas poderosas.
-Tanto el uso de regex como de Beautifulsoap son perfectamente validos y no excluyentes, depende mucho el escenario y lo que buscamos extraer. Es necesario sin embargo profundizar en ambos para un diseño optimo de una herramienta con esta orientación (Web Scraping).

REFERENCIAS.

-http://www.regular-expressions.info/python.html
-http://www.briancarpio.com/2012/12/02/website-scraping-with-python-and-beautiful-soup/
-http://www.nyu.edu/projects/politicsdatalab/workshops/BeautifulSoup.pdf
-https://pypi.python.org/pypi/beautifulsoup4
-http://www.pythoncentral.io/python-beautiful-soup-example-yahoo-finance-scraper/
-http://kochi-coders.com/2011/05/30/lets-scrape-the-page-using-python-beautifulsoup/

No hay comentarios:

Publicar un comentario en la entrada

Nota: solo los miembros de este blog pueden publicar comentarios.