Web Scraping con Python

Iniciado por ANTRAX, Mayo 25, 2017, 01:17:12 PM

Tema anterior - Siguiente tema

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


Primero que nada, para el que no lo sabe, vamos a preguntarle a Wikipedia que es "Scrapping".

CitarWeb scraping es una técnica utilizada mediante programas de software para extraer información de sitios web. Usualmente, estos programas simulan la navegación de un humano en la World Wide Web ya sea utilizando el protocolo HTTP manualmente, o incrustando un navegador en una aplicación.

Entendido lo anterior, lo que nosotros vamos a hacer es escribir nuestros propios scripts que extraigan información que nos interese de alguna web en particular; ya sea para facilitar su lectura, para procesar esa información y usarla en conjunto con otro código o porque somos l33t y queremos leer lo que nos interesa por consola.

Principalmente, accedemos a la web de nuestro interés. En mi caso, voy a usar como ejemplo SubTorrents, una pagina de donde descargo películas y series por torrent (la recomiendo).

De la cual vamos a obtener las ultimas películas publicadas de la sección Estrenos.


Ya tenemos la web, ahora nos toca saber puntualmente que es lo que vamos a extraer y de donde. Para esto vamos a usar las Developer Tools de nuestro navegador preferido, en este caso Firefox.

Nos situamos en el elemento que queremos imprimir con nuestro script, y le damos click derecho y luego "Inspeccionar elemento".
El navegador nos va a mostrar seleccionado el código en el source de donde inspeccionamos.


Como vemos, el titulo de la película esta dentro de una etiqueta a de hipervinculo, dentro de una tabla identificada como searchResult.
Ya identificado lo que vamos a scrappear, vamos a programar!.

Para esto, vamos a utilizar dos librerias de Python. Una es urllib con la cual vamos a conectarnos al sitio web y obtener su source. Por otro lado, ocupamos BeautifulSoup, que nos va a ayudar a parsear el html para tener un resultado mas limpio (de lo contrario deberíamos recurrir a expresiones regulares, lo cual hace mas engorroso el tema).

Primero que nada importamos los modulos mencionados.

Código: text
import urllib
from bs4 import BeautifulSoup


Ahora declaramos en una variable el url de la web que vamos a utilizar y con el método urlopen establecemos conexión a la misma para poder obtener el html del source dentro de otra variable para luego pasarsela a BeautifulSoup y que este se encargue de la "magia".


Código: text
url = "http://www.subtorrents.com/peliculas/estrenos/"
page = urllib.urlopen(url)
source = BeautifulSoup(page, "html.parser")


Ahora para comprobar que vamos bien, usamos el metodo find y le decimos que nos imprima la etiqueta title.

Código: text
print source.find("title").text



Ven? Lo que hicimos fue buscar en el source de la web la etiqueta title con find() y la imprimimos sin sus respectivos tags para tener un limpio resultado sumándole el metodo text. Sigamos con nuestro script...

A la hora de querer imprimir el contenido de cada etiqueta se presento el problema de que había otra etiqueta igual y solo queremos imprimir el titulo de la película. Pero si prestamos atención al codigo HTML, vemos que esta etiqueta se encuentra dentro de una fila en una columna


Así que para ser más objetivos, usamos un bucle FOR anidado que dentro de la tabla, busque cada dentro de cada
dentro de cada . No se asusten que es simple...

Escribimos:

Código: text
for linea in tabla.find_all("tr", {"class" : "fichserietabla_b"}):
for titulo in linea.find_all("td", {"class":"vertThseccion"}):
print titulo.text


Ahora ejecutamos el script y ...


Fácil, no?.
Tengan en cuenta que depende de la web siempre van a tener que aplicar su propia lógica, ya que muchas veces no nos la dejan tan fácil o los programadores no son muy prolijos.

Autor: Caffeine


Excelente post hermano! Muy bien explicado, y como tu dices... Para cada sitio hay que aplicarle su propia logica, pero al tener ciertas nociones basicas como se facilita eh? Saludos.

Hola ANTRAX

He empezado a tocar un poco Python y estoy siguiendo tu ejemplo, pero me aparece el siguiente fallo:

Access denied | No tienes permitido ver los links. Registrarse o Entrar a mi cuenta used Cloudflare to restrict access

Estoy investigando por la red, pero todo lo que encuentro es en ingles y mi ingles es algo flojo. He hecho varias pruebas con casas que he visto pero me sigue saliendo lo mismo.

Por cierto, podrias colgar el codigo completo.

Un Saludo

muy bueno, me lo llevo para pruebas offline

Esta muy interesante talves si actualizamos el post.

Youtube: No tienes permitido ver los links. Registrarse o Entrar a mi cuenta - Twitter: No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
Excelente post hermano! Muy bien explicado, y como tu dices... Para cada sitio hay que aplicarle su propia logica, pero al tener ciertas nociones basicas como se facilita eh? Saludos.

Yo creo que si la web es bien semántica, sería un poco más fácil.
Puedes usar herramientas como W3C Validator para verificar esto.
Una web semántica siempre está bien organizada.

Buenas!
Algunas imagenes estan caidas.