
Cómo prometimos, aquí está la segunda parte del post sobre “Cómo descargar todo Pastebin en menos de 100 líneas de código”. Más vale tarde que nunca.
Rememorando un poco, os explicamos que Pastebin es una plataforma web que permite compartir texto de forma anónima. Y, claro, como es de esperar, muchas de las filtraciones (leaks) que se producen día a día, acaban colgadas en Pastebin, como ya comentamos.
Pues bien, al finalizar el anterior post, os planteamos una solución al problema del tiempo que tardaría el bot en recorrer Pastebin entero. Esta solución era crear un bot que día a día fuera añadiendo las nuevas entradas. Pues estáis de suerte, porque además de mostraros como se haría ese bot, os vamos a enseñar como añadir multihilo al script que ya teníamos para descargar todo Pastebin. Para el que no lo recuerde o no lo haya visto, aquí está el link: https://github.com/JWScr33d/crawler-downloader-pastebin.
Bueno, vamos a empezar por el bot que recoja información diariamente. Para ver lo último agregado a Pastebin tenemos la url: https://pastebin.com/archive. Si queremos ver que tendencias hay actualmente en la plataforma accederemos a https://pastebin.com/trends. Nuestro script realizará web scraping a cada una de estas urls. En esta parte del código podéis ver cómo sacamos todos los links que nos interesan.
Podéis comprobar que para cada url, se parsea el html con BeatifulSoup, sacamos del html la etiqueta “<table class:”mainteable”>…</table> con todo su contenido (esta tabla es donde están los enlacen que nos interesan) y, una vez hecho esto, recorremos cada etiqueta “<td>..</td>” para obtener los enlaces que contienen cada una de ellas y los metemos en la lista “list_url”. Ya tenemos los links que nos interesan en una lista guardados, ahora solo falta recorrerlos y obtener su contenido.
En este extracto del código obtenemos la información que nos interesa. Recorremos cada uno de los links de la lista “list_url” y volvemos a parsear el código html con BeatifulSoup. Esta vez nos interesan dos etiquetas “<div>”, la que tiene asignada la clase “paste_box_line2”, que de aquí obtendremos el nombre del usuario que colgó el texto (en caso de que sea anónimo aparecerá como “a guest”) y la fecha en la que fue subido. El segundo “<div>” que nos interesa es el que contiene el texto y posee el id “selectable”. Por último mostramos por consola los datos obtenidos mediante “print”, solo os faltaría añadir una función para insertar la información obtenida en vuestra base de datos.
Para hacer que nuestro script vaya recogiendo todo lo que se postee podemos usar crontab. Si estamos en Linux, bastará con añadir la tarea mediante el comando “crontab -e”. Para Windows o Mac OS se pueden utilizar cualquier software compatible o herramienta que incluya el sistema para automatizar tareas. Os recomendamos que programéis el demonio para que se tire cara 5 – 10 minutos como mucho, ya que se suben nuevos post prácticamente cada minuto.
Ahora, como os prometimos, os vamos a enseñar cómo modificar el script para descargar todo pastebin, convirtiéndolo en mulithilo para que recopile la información muchísimo más rápido.
Para empezar importaremos la librería threading y la función Lock de dicha librería.
Definimos dos variables: “lock”, que le asignaremos la función “Lock()” de threading, esto nos permitirá bloquear parte del código para que no entre ningún thread si está siendo ejecutado por otro hilo. También definiremos la variable “th” que simplemente será el array que contenga nuestros hilos o threads.
Nos vamos a la línea de código 98 donde está escrito “if __name__ == ‘__main__‘:
” y cortamos todo el código por debajo de la llamada a la función “main()”. Creamos una función llamada “worker” y pegamos el código que habíamos cortado con anterioridad.
Como veis, hay algunas modificaciones. Hemos definido como global la variable “cadena”, ya que será una variable compartida entre todos los hilos. También hemos bloqueado el aumento de la cadena mediante “lock.acquire()”, que bloquea, y “lock.release()”, que libera el código para que sea usado por otro hilo. Esto lo hacemos para que dos o más hilos no aumenten a la vez la cadena que va insertada en la url. Para finalizar solo nos queda definir los hilos e iniciarlos.
Con el bucle for definimos 10 hilos, los añadimos a nuestro array (indicando la función a ejecutar “target=worker”) y los iniciamos. Puedes aumentar el número de hilos a crear, todo dependerá de las especificaciones de tu máquina.
¿No ha sido muy complicado verdad? Si queréis obtener más información sobre el trabajo con multithread en Python pasaros por la documentación. ¡Un saludo y hasta otra!
Artículo escrito por @JaviMrSec.