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?

user62198
quelle
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
1
Nur für den Fall: opendata.stackexchange.com/questions/1073/…
Anton Tarasenko

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.

Greg Thatcher
quelle
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
user62198
quelle
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

MaticDiba
quelle
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.

Jagartner
quelle