Un tutorial de Semalt: Web Scraping en Python

Visité KinoPoisk (versión rusa de IMDB) recientemente y descubrí que a lo largo de los años logré calificar más de 1000 películas. Pensé que sería interesante investigar estos datos más detalladamente: ¿han cambiado mis gustos cinematográficos con el tiempo? ¿Durante qué estaciones del año veo más películas?

Pero antes de analizar y crear gráficos hermosos, necesitamos obtener los datos. Desafortunadamente, muchos servicios no tienen API pública, por lo que debe arremangarse y analizar las páginas html.

Este artículo está dirigido a aquellos que siempre quisieron aprender a usar el Scrapping web pero no lo tuvieron en sus manos o no sabían por dónde empezar.

Tarea

Nuestra tarea es extraer los datos sobre películas ya vistas: el título de la película, la fecha y hora de visualización, la calificación del usuario.

De hecho, nuestro trabajo se realizará en 2 etapas:

Etapa 1: descargue y guarde páginas html

Etapa 2: analizar html en un formato adecuado para su posterior análisis (csv, json, marco de datos de pandas, etc.)

Instrumentos

Hay muchas bibliotecas de python para enviar solicitudes http. El más famoso y muy práctico es Solicitudes.

También es necesario elegir una biblioteca para el análisis html.

BeatifulSoup, lxml

Estas son las dos bibliotecas más populares para analizar html y elegir una de ellas es solo una preferencia personal. Además, estas bibliotecas están estrechamente conectadas entre sí: BeautifulSoup comenzó a usar lxml como un analizador interno para la aceleración, y en lxml, se agregó un módulo de analizador de sopa. Para comparar los enfoques, analizaré los datos con BeautifulSoup y usaré los selectores XPath en el módulo lxml.html.

Descargando datos

Comencemos a descargar datos. En primer lugar, intentemos obtener la página por url y guardarla en un archivo local.

Abrimos el archivo resultante y vemos que no es tan simple: el sitio nos consideró un robot y no mostrará los datos.

Averigüemos cómo funciona el sitio

El navegador no tiene problemas para obtener información del sitio. Veamos cómo exactamente envía la solicitud. Para hacer esto, usamos el panel "Red" en las "Herramientas para desarrolladores" en el navegador (uso Firebug para esto), por lo general, la solicitud que necesitamos es la más larga.

Como podemos ver, el navegador también envía a los encabezados UserAgent, cookie y otro número de parámetros. Primero, intentaremos enviar el UserAgent correcto a un encabezado.

Esta vez tenemos éxito y ahora se nos dan los datos necesarios. Vale la pena señalar que a veces el sitio también verifica la validez de las cookies, en cuyo caso las sesiones en la biblioteca de solicitudes ayudarán.

Descargar todas las tarifas

Ahora podemos guardar una página con tarifas. Pero generalmente el usuario tiene muchas tarifas, y es necesario recorrer todas las páginas. El número de página que nos interesa es fácil de transferir directamente a la url.

Recopilación de datos de HTML

Ahora comencemos directamente a recopilar los datos de html. La forma más fácil de entender cómo está estructurada la página html es utilizando la función "Inspeccionar elemento" en el navegador. En este caso, todo es bastante simple: toda la tabla con tasas está en la etiqueta. Seleccione este nodo:

desde bs4 import BeautifulSoup

desde lxml import html

# Sopa hermosa

sopa = BeautifulSoup (texto)

film_list = soup.find ('div', ('class': 'profileFilmsList'))

# lxml

árbol = html.fromstring (texto)

film_list_lxml = tree.xpath ('// div [@class =' 'profileFilmList' ']') [0]

Aprendamos cómo extraer el título ruso de la película y un enlace a la página de la película (también cómo obtener el texto y el valor del atributo).

Si necesita extraer el título en inglés, simplemente cambie "nameRus" a "nameEng".

Resultados

Aprendimos a analizar sitios web, nos familiarizamos con las bibliotecas Requests, BeautifulSoup y lxml, así como también recibimos datos adecuados para un análisis posterior de las películas ya vistas en KinoPoisk.