IMDB Webページをこする方法は?


10

データ分析の学習の一環として、Pythonを使用してWebスクレイピングを自分で学習しようとしています。次のURLのimdb Webページをスクレイピングしようとしています:http : //www.imdb.com/search/title? sort=num_votes,desc&start=1&title_type=feature&year=1950,2012

BeautifulSoupモジュールを使用しています。以下は私が使用しているコードです:

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

次の出力が得られます。

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

このコードを使用して、タイトル、ジャンル、ランタイム、および年をスクレイピングすることはできましたが、imdbムービーIDやレーティングをスクレイピングすることはできませんでした。要素を(Chromeブラウザーで)検査した後、上記と同様のコードを使用できるパターンを見つけることができません。

映画のIDと評価を取得できるコードを書くのを手伝ってくれませんか?


1
コードを少し編集しましたが、ratingが定義されていないため失敗します。これを修正した場合はfrom BeautifulSoup import BeautifulSoup、およびを追加することもできますimport requests。そして、なぜurl="http://etc"私たち自身でそれを行う必要がないように表示しないのですか?
Spacedman、2015年

回答:


12

スクレイピングの代わりに、http//www.imdb.com/interfacesでデータを直接取得することもできます。彼らは映画や俳優などのためにftp経由で利用可能なデータを持っているようです。


2
@Gred Thatcher、リンクをありがとう。このプロジェクトは、ウェブスクレイピングの学習の一環であり、これらすべての問題を解決します。-:)
user62198 2015年

8

私は解決策を見つけることができました。誰かの助けになったり、誰かが何か違うことを提案したい場合に備えて、投稿を考えました。

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

出力は次のようになります。

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

2

class = "ratingrating-list"を使用すると、divからすべてを取得できます

必要なのは、属性IDを取得することだけです。 3.パラメータ:映画スコア


ありがとう。@Matic DBは...私はIDを取得することができた..Belowは私のソリューションです
user62198

2

少し一般的なフィードバックとして、出力形式を改善することをお勧めします。現状の形式の問題は、プログラムでデータを取得する透過的な方法がないことです。代わりに試してみてください:

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

タブ区切りファイルの良いところは、最終的にスケールアップすると、インパラ(またはより小さなスケールでは単純なmySqlテーブル)などに簡単に読み取れることです。さらに、次のコマンドを使用して、プログラムでpythonのデータを読み取ることができます。

 line.split("\t")

2番目のアドバイスは、最初のスクレイピングで必要と思われるよりも多くの情報を取得することをお勧めします。ディスクスペースは処理時間よりも安いため、アナリティクスを拡張するたびにスクレーパーを再実行するのは面白くありません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.