Crea tu propio spider y mejoralo

Iniciado por Mortal_Poison, Octubre 17, 2017, 12:57:11 AM

Tema anterior - Siguiente tema

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

Hola a tod@s,

Cuando estamos trabajando en seguridad informática y queremos recolectar 'x' cosa de determinada página, llegamos a un punto donde se nos hace tedioso o frustrante realizar las cosas nosotros mismos, para ello usamos el web scraping.

Les he traído un spider que realicé ya hace algún tiempo pero que me decidí a compartir. Pueden mejorarlo y bueno, en el código he dejado los comentarios de cada una de las líneas para qué sirve cada una. A continuación los requisitos para que funcione el spider.

Antes de comenzar, me gustaría que conocieran los componentes de una página web.

COMPONENTES DE UNA PÁGINA WEB

Al visitar una página web, nuestro navegador que es el cliente(les recomiendo leer la arquitectura cliente/servidor para entender un poco más acerca de esto) realizar una solicitud a un servidor web. Esta solicitud es por el método GET del protocolo HTTP, ya que estamos recibiendo archivos del servidor. A continuación, el servidor envía dichos archivos indicándole a nuestro navegador web el cómo procesar la página para nosotros. Los archivos se dividen generalmente así:


  • HTML: Contiene el contenido principal de la página web.
  • JavaScript: Agrega interactividad a la página web.
  • CSS: Agrega el estilo a la página web, así lucirá más agradable.
  • Imágenes: Los formatos de imágenes como .PNG y .JPG permiten que las páginas web muestren imágenes.

Nuestro navegador web recibe todos los archivos y nos muestra la página. Realmente ocurren muchas cosas pero que ustedes pueden afianzar sus conocimientos leyendo la arquitectura que les mencioné anteriormente. Al momento de realizar un spider o de hacer web scraping, lo que más  nos interesa es el contenido principal de la página web, es decir, el HTML.

COMPRENDAMOS MÁS DE HTML

El lenguaje de marcas de hipertexto (HTML) es un lenguaje en el que se crean las páginas web. HTML no es un lenguaje de programación/scripting, como Python; en cambio, es un lenguaje de etiquetas que le dice a un navegador cómo distribuir el contenido a mostrar.
Conozcamos un poco más de HTML para que sepamos cómo hacer scraping con eficacia. El HTML consiste en elemtnos llamados etiquetas. La etiqueta más básia es la de <html>. Ésta etiqueta, nos permite indicarle al navegador web que todo lo que está adentro de ella es HTML.

Vamos a poner un ejemplo, creemos un documento de html en nuestro bloc de notas o editor de texto preferido(Notepad ++, Sublime, Atom, entre otros):
Código: html5

<html>
</html>


Aún no hemos agregado ningún contenido a nuestra página web, por lo que si lo vemos en nuestro navegador veríamos todo en blanco.


Ilustración 1. Página en blanco.

Dentro de las etiquetas de HTML debemos añadir las otras dos etiquetas esenciales que componen el HTML, la etiqueta <head> y la etiqueta <body>. En la etiqueta body se incluye el contenido principal de la página web, la etiqueta head contiene datos como el título de la página, la codificación de caracteres a usar, los tags y bueno, otra información que no nos es útil para el scraping.

Código: html5

<html>
    <head>
    </head>
    <body>
    </body>
</html>


Si notan, solo hemos puesto las etiquetas más no contenido alguno, por lo que no volveremos a ver nada.


Ilustración 2. Página en blanco.

Ahora, agregaremos nuestro primer contenido a la página, con la etiqueta <p>. La etiqueta p define un párrafo y cualquier texto dentro de esta etiqueta, se mostrará como un párrafo por separado.

Código: html5

<html>
    <head>
    </head>
    <body>
        <p>
            Primer párrafo de texto!
        </p>
        <p>
            Segundo párrafo de texto!
        </p>
    </body>
</html>


Así se nos mostrará:


Ilustración 3. Página donde se muestran los párrafos.

También podemos agregar hipervinculos con la etiqueta <a href>:
Código: html5

<html>
    <head>
    </head>
    <body>
        <p>
            Primer párrafo de texto!
            <a href="https://youtube.com/VIINVIDEOSHD">Learn Hacking and CyberSecurity!</a>
        </p>
        <p>
            Segundo párrafo de texto!
            <a href="https://viinacademy.com">Learn Hacking and CyberSecurity with the platform!</a>
        </p>
    </body>
</html>


Y se vería de ésta manera:

Ilustración 4. Mostrando los párrafos con los hipervinculos.

La etiqueta a indica que son enlaces y le dice al navegador que deberá hacer un enlace a otra página web. ¿A cuál página web? pues para eso es la etiqueta href, para indicar cuál es el enlace.

Entendiendo esto, pasaremos a ver los requisitos/instalación para realizar spiders y/o web scraping.




REQUISITOS

Debemos descargar las siguientes librerías(puedes ir al link directamente haciendo click encima de cada elemento):


INSTALACIÓN

Suponiendo que ya tenemos python en la versión 3.x, descargamos y procedemos a instalar nuestro beautifulsoup(bs4) y nuestros requests.


Ilustración 5. Instalación de BeautifulSoup.


Ilustración 6. Instalación de Requests.

Una vez instaladas las librerías, les mostraré el ejemplo de cómo usar y su función para la que están principalmente diseñadas.

REQUESTS...

Con nuestra librería de requests podremos ver el contenido fuente de cualquier página y realizar peticiones por métodos como GET y POST. El método de requests.get nos devuelve también un código de status.

Código: python

import requests
page_get = requests.get("https://viinacademy.com/index.html")


<Response [200]>


El código de status nos indica si la página respondió correctamente, en otros casos puede dar otro tipo de códigos de estado, como por ejemplo 500, que corresponde a un Internal Server Error.

Podemos imprimir el contenido de la página usando webpage.content:

Código: python

import requests
page_get = requests.get("http://example.com/index.html")
page.content


Donde devolverá todo el contenido del HTML:
b'<!DOCTYPE html>\n<html>\n    <head>\n        <title>A simple example page</title>\n    </head>\n    <body>\n        <p>Here is some simple content for this page.</p>\n    </body>\n</html>'


Entremos con BS4

BS4 nos permite la extracción de datos en concreto de una página web. Podemos usarla para archivos .html o para .xml. Nosotros podemos parsear el documento y extraer todos las etiquetas de párrafos que existen. Para ello, podemos usar el siguiente código:

Código: python

from bs4 import BeautifulSoup
page = requests.get("http://example.com")
soup = BeautifulSoup(page.content, 'html.parser')
soup.find_all('p')


BeautifulSoup nos permite extraer etiquetas como a href, párrafos, incluso selectores de CSS. Si quieres ver muchos de los ejemplos que existen actualmente de esta grandiosa librería, puedes irte a No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

Concluyendo, hay muchas más librerías un poco más potentes que bs4, sin embargo, ésta bien usada también tiene un gran potencial para realizar scraping y/o recolección de información.

A continuación el spider que realicé y que pueden comprender mediante los distintos comentarios que dejé en el código.

Código: python

# Importamos librerías. #
import requests
import sys

from bs4 import BeautifulSoup

# Creamos nuestras listas. #
urls = []
urls2 = []

# Recibimos los argumentos. #
target_url = sys.argv[1]

# Realizamos una conexión al argumento pasado y además, leemos todo el contenido del código fuente que existe en la página. #
url = requests.get(target_url).content
# Usamos nuestra librería de bs4 para posteriormente recatar lo que deseamos. #
soup = BeautifulSoup(url)
# Mediante el for y el método de bs4 llamado find_all, recolectamos todas las etiquetas donde existe a href. #
for line in soup.find_all('a'):
    new_line = line.get('href')
    try:
    # Si existe en alguna línea del código fuente el http, lo almacenamos en nuestra lista llamada urls. #
        if new_line[:4] == "http":
            if target_url in new_line:
            urls.append(str(new_line))
        # Si no existe, intentamos combinar nuestro argumento(url de la página) + lo que encontramos. #
        elif new_line[:1] == "/":
            try:
                comb_line = target_url+new_line
                urls.append(str(comb_line)) 
            except:
                pass
        # Recorremos lo que hemos guardado anteriormente en nuestra lista(urls).
        for get_this in urls:
        # Como dentro de urls están todos los enlaces, realizamos una conexión a dicha url y leemos el código fuente. #
            url = requests.get(get_this).content
            # Usamos nuestra librería de bs4 para posteriormente recatar lo que deseamos. #
            soup = BeautifulSoup(url)
            for line in soup.find_all('a'):
                new_line = line.get('href')
                try:
                    if new_line[:4] == "http":
                        if target_url in new_line:
                            urls2.append(str(newline))
                    elif new_line[:1] == "/":
                        comb_line = target_url+new_line
                        urls2.append(str(comb_line))
                except:
                    urls_3 = set(urls2)
            # Recorremos nuestra lista llamada urls_3 e imprimimos todos los links de nuestro spider.
            for value in urls_3:
                print(value)
    except:
    pass

# Mortal_Poison -> https://www.youtube.com/VIINVIDEOSHD.


Espero que les sirva, para ejecutarlo, basta con poner en nuestro cmd o nuestra terminal: python No tienes permitido ver los links. Registrarse o Entrar a mi cuenta No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

Les dejo una captura de cómo funciona:


Ilustración 7. Ejecutando el spider.


Ilustración 8. Spider funcionando.

Cualquier pregunta/duda/sugerencia será bien recibida.

En un próximo post traeré de cómo recatar información cuando están en tablas o bueno, de cómo podemos combinarlo con librerías de DataFrame para hacer mucho más potente nuestra recolección de datos.

Un ejemplo más práctico lo pueden ver en el siguiente vídeo:


Un saludo.
Become the change you seek in the world. -Gandhi.


Vamos a ponerlo en práctica. Muchas gracias !!

Hola No tienes permitido ver los links. Registrarse o Entrar a mi cuenta,

Ya traeré más posts de Web Scraping más sofisticados en distintos lenguajes :).

Un saludo y para eso está la comunidad, para que todos aprendamos.
Become the change you seek in the world. -Gandhi.