Wie kratzt man imdb Webseite?


10

Ich versuche, Web Scraping mit Python selbst zu lernen, um die Datenanalyse zu erlernen. Ich versuche, die imdb-Webseite zu durchsuchen, deren URL wie folgt lautet: http://www.imdb.com/search/title?sort=num_votes,desc&start=1&title_type=feature&year=1950,2012

Ich benutze das BeautifulSoup-Modul. Es folgt der Code, den ich verwende:

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

Ich erhalte die folgenden Ausgaben:

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

Mit diesem Code konnte ich Titel, Genre, Laufzeit und Jahr kratzen, aber weder die ID des imdb-Films noch die Bewertung. Nach der Überprüfung der Elemente (im Chrome-Browser) kann ich kein Muster finden, mit dem ich ähnlichen Code wie oben verwenden kann.

Kann mir jemand helfen, den Code zu schreiben, mit dem ich die Film-ID und die Bewertungen abkratzen kann?


1
Ich habe Ihren Code ein wenig bearbeitet, aber er schlägt fehl, weil er ratingnicht definiert ist. Wenn Sie das beheben, können Sie auch hinzufügen from BeautifulSoup import BeautifulSoup, und import requests. Und warum nicht auch zeigen, url="http://etc"damit wir das nicht für uns selbst tun müssen?
Spacedman

Antworten:


12

Anstatt zu kratzen, können Sie versuchen, die Daten direkt hier abzurufen : http://www.imdb.com/interfaces . Es sieht so aus, als ob über FTP Daten für Filme, Schauspieler usw. verfügbar sind.


2
@Gred Thatcher, Danke für den Link. Dieses Projekt ist Teil eines Lernprojekts zum Thema Web Scraping und damit zu all diesen Problemen. - :)
user62198

8

Ich konnte eine Lösung finden. Ich dachte daran, etwas zu posten, nur für den Fall, dass es jemandem hilft oder wenn jemand etwas anderes vorschlagen möchte.

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

Die Ausgabe sieht folgendermaßen aus:

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

2

Sie können alles von div mit class = "Rating Rating-Liste" erhalten

Sie müssen lediglich die Attribut-ID abrufen: [id = "tt1345836 | imdb | 8.5 | 8.5 | advsearch"] Wenn Sie über diesen Inhalt verfügen, teilen Sie diese Zeichenfolge durch '|' und erhalten: 1. Parameter: Film-ID 3. Parameter: Filmmusik


Vielen Dank. @Matic DB ... ich konnte die ID erhalten .. Unten ist meine Lösung
user62198

2

Als allgemeines Feedback denke ich, dass Sie gut daran tun würden, Ihr Ausgabeformat zu verbessern. Das Problem mit dem aktuellen Format ist, dass es keine transparente Möglichkeit gibt, die Daten programmgesteuert abzurufen. Versuchen Sie stattdessen:

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

Das Schöne an einer durch Tabulatoren getrennten Datei ist, dass sie beim Skalieren leicht in Impala (oder in kleineren Maßstäben in einfache mySql-Tabellen) eingelesen werden kann. Zusätzlich können Sie die Daten dann programmgesteuert in Python einlesen, indem Sie:

 line.split("\t")

Der zweite Ratschlag ist, dass ich vorschlagen würde, mehr Informationen zu erhalten, als Sie für Ihren ersten Kratzer benötigen. Der Speicherplatz ist billiger als die Verarbeitungszeit. Daher macht es keinen Spaß, den Scraper jedes Mal neu auszuführen, wenn Sie Ihre Analyse erweitern.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.