Comment gratter la page Web imdb?

10

J'essaie d'apprendre le grattage Web en utilisant Python par moi-même dans le cadre d'un effort pour apprendre l'analyse des données. J'essaie de gratter la page Web imdb dont l'URL est la suivante: http://www.imdb.com/search/title?sort=num_votes,desc&start=1&title_type=feature&year=1950,2012

J'utilise le module BeautifulSoup. Voici le code que j'utilise:

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

J'obtiens les sorties suivantes:

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

En utilisant ce code, je pouvais gratter le titre, le genre, la durée d'exécution et l'année, mais je ne pouvais pas gratter l'ID du film imdb, ni la note. Après avoir inspecté les éléments (dans le navigateur Chrome), je ne suis pas en mesure de trouver un modèle qui me permettra d'utiliser un code similaire à celui ci-dessus.

Quelqu'un peut-il m'aider à écrire le morceau de code qui me permettra de gratter l'identifiant et les notes du film?

user62198
la source
1
J'ai un peu modifié votre code mais il échoue car il ratingn'est pas défini. Si vous corrigez cela, vous pouvez également ajouter from BeautifulSoup import BeautifulSoupet import requests. Et pourquoi ne pas montrer aussi url="http://etc"pour que nous n'ayons pas à le faire pour nous-mêmes?
Spacedman
1
Juste au cas où: opendata.stackexchange.com/questions/1073/…
Anton Tarasenko

Réponses:

12

Au lieu de gratter, vous pouvez essayer d'obtenir les données directement ici: http://www.imdb.com/interfaces . Il semble qu'ils aient des données disponibles via ftp pour les films, les acteurs, etc.

Greg Thatcher
la source
2
@Gred Thatcher, merci pour le lien. Ce projet fait partie d'un effort d'apprentissage sur le web scraping et donc tous ces problèmes. - :)
user62198
8

J'ai pu trouver une solution. J'ai pensé à poster juste au cas où cela aiderait quelqu'un ou si quelqu'un veut suggérer quelque chose de différent.

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

La sortie ressemble à ceci:

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

Vous pouvez tout obtenir de div avec class = "rating rating-list"

Tout ce que vous avez à faire est de récupérer l'attribut id: [id = "tt1345836 | imdb | 8.5 | 8.5 | advsearch"] Lorsque vous avez ce contenu, vous divisez cette chaîne par '|', et vous obtenez: 1. paramètre: id film 3. paramètre: score du film

MaticDiba
la source
Merci. @Matic DB ... j'ai pu obtenir l'identifiant .. Ci-dessous est ma solution
user62198
2

En guise de rétroaction générale, je pense que vous feriez bien d'améliorer votre format de sortie. Le problème avec le format tel qu'il se présente est qu'il n'y a pas de moyen transparent d'obtenir les données par programme. Pensez plutôt à essayer:

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

La bonne chose à propos d'un fichier délimité par des tabulations est que si vous finissez par le faire évoluer, il peut facilement être lu dans quelque chose comme impala (ou à des échelles plus petites, de simples tables mySql). De plus, vous pouvez ensuite lire par programmation les données en python en utilisant:

 line.split("\t")

Le deuxième conseil, c'est que je suggérerais d'obtenir plus d'informations que vous ne pensez en avoir besoin lors de votre premier contact. L'espace disque est moins cher que le temps de traitement, donc relancer le racloir à chaque fois que vous développez votre analyse ne sera pas amusant.

jagartner
la source