¿Cómo raspar la página web de imdb?


10

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?


1
Edité su código un poco pero falla porque ratingno está definido. Si arreglas eso, también puedes agregar from BeautifulSoup import BeautifulSoup, y import requests. ¿Y por qué no mostrar también url="http://etc"para que no tengamos que hacer eso por nosotros mismos?
Spacedman

Respuestas:


12

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.


2
@Gred Thatcher, gracias por el enlace. Este proyecto es parte de un esfuerzo de aprendizaje sobre el raspado web y, por lo tanto, todos estos problemas. - :)
user62198

8

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.

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]
    rating = movie.find('span','value').contents[0]
    year = movie.find('span','year_type').contents[0]
    imdbID = movie.find('span','rating-cancel').a['href'].split('/')[2]
    print title, genres,runtime, rating, year, imdbID

El resultado se ve así:

The Shawshank Redemption [u'Crime', u'Drama'] 142 mins. 9.3 (1994) tt0111161

2

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


Gracias. @Matic DB ... pude obtener la identificación ... Debajo está mi solución
user62198

2

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:

print "\t".join([title, genres,runtime, rating, year])

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:

 line.split("\t")

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.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.