Estoy tratando de aprender el raspado web usando Python por mí mismo como parte de un esfuerzo por aprender el análisis de datos. Estoy tratando de raspar la página web de imdb cuya url es la siguiente: http://www.imdb.com/search/title?sort=num_votes,desc&start=1&title_type=feature&year=1950,2012
Estoy usando el módulo BeautifulSoup. El siguiente es el código que estoy usando:
r = requests.get(url) # where url is the above url
bs = BeautifulSoup(r.text)
for movie in bs.findAll('td','title'):
title = movie.find('a').contents[0]
genres = movie.find('span','genre').findAll('a')
genres = [g.contents[0] for g in genres]
runtime = movie.find('span','runtime').contents[0]
year = movie.find('span','year_type').contents[0]
print title, genres,runtime, rating, year
Estoy obteniendo los siguientes resultados:
The Shawshank Redemption [u'Crime', u'Drama'] 142 mins. (1994)
Usando este código, podría raspar el título, el género, el tiempo de ejecución y el año, pero no pude raspar la identificación de la película imdb, ni la calificación. Después de inspeccionar los elementos (en el navegador Chrome), no puedo encontrar un patrón que me permita usar un código similar al anterior.
¿Alguien puede ayudarme a escribir el código que me permitirá raspar la identificación y las calificaciones de la película?
fuente
rating
no está definido. Si arreglas eso, también puedes agregarfrom BeautifulSoup import BeautifulSoup
, yimport requests
. ¿Y por qué no mostrar tambiénurl="http://etc"
para que no tengamos que hacer eso por nosotros mismos?Respuestas:
En lugar de raspar, puede intentar obtener los datos directamente aquí: http://www.imdb.com/interfaces . Parece que tienen datos disponibles a través de ftp para películas, actores, etc.
fuente
He podido encontrar una solución. Pensé en publicar solo en caso de que sea de alguna ayuda para alguien o si alguien quiere sugerir algo diferente.
El resultado se ve así:
fuente
Puede obtener todo de div con class = "rating rating-list"
Todo lo que necesita hacer es recuperar el id del atributo: [id = "tt1345836 | imdb | 8.5 | 8.5 | advsearch"] Cuando tiene este contenido, divide esta cadena por '|', y obtiene: 1. parámetro: id de la película 3. parámetro: partitura de la película
fuente
Como comentario general, creo que harías bien en mejorar tu formato de salida. El problema con el formato actual es que no hay una forma transparente de obtener los datos mediante programación. Considere en su lugar intentar:
Lo bueno de un archivo delimitado por tabulaciones es que si termina escalando, puede leerse fácilmente en algo como impala (o en escalas más pequeñas, tablas mySql simples). Además, puede leer mediante programación los datos en Python usando:
El segundo consejo es que sugeriría obtener más información de la que cree que necesita en su raspado inicial. El espacio en disco es más barato que el tiempo de procesamiento, por lo que volver a ejecutar el raspador cada vez que expanda su análisis no será divertido.
fuente