Bagaimana cara mengikis halaman web imdb?

10

Saya mencoba mempelajari pengikisan web menggunakan Python sendiri sebagai bagian dari upaya mempelajari analisis data. Saya mencoba untuk mengikis halaman web imdb yang url-nya adalah sebagai berikut: http://www.imdb.com/search/title?sort=num_votes,desc&start=1&title_type=feature&year=1950,2012

Saya menggunakan modul BeautifulSoup. Berikut ini adalah kode yang saya gunakan:

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

Saya mendapatkan output sebagai berikut:

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

Dengan menggunakan kode ini, saya bisa mengikis judul, genre, runtime, dan tahun tetapi saya tidak bisa mengikis id film imdb, maupun peringkat. Setelah memeriksa elemen (di browser chrome), saya tidak dapat menemukan pola yang akan memungkinkan saya menggunakan kode yang sama seperti di atas.

Adakah yang bisa membantu saya menulis potongan kode yang akan membuat saya mengikis id film dan peringkat?

pengguna62198
sumber
1
Saya sedikit mengedit kode Anda tetapi gagal karena ratingtidak didefinisikan. Jika Anda memperbaikinya, Anda juga bisa menambahkan from BeautifulSoup import BeautifulSoup, dan import requests. Dan mengapa tidak juga menunjukkan url="http://etc"agar kita tidak harus melakukan itu untuk diri kita sendiri?
Spacedman
1
Untuk jaga-jaga: opendata.stackexchange.com/questions/1073/...
Anton Tarasenko

Jawaban:

12

Alih-alih mengorek, Anda mungkin mencoba untuk mendapatkan data secara langsung di sini: http://www.imdb.com/interfaces . Sepertinya mereka memiliki data yang tersedia melalui ftp untuk film, aktor, dll.

Greg Thatcher
sumber
2
@Gred Thatcher, Terima kasih atas tautannya. Proyek ini adalah bagian dari upaya pembelajaran tentang pengikisan web dan karenanya semua masalah ini. - :)
user62198
8

Saya sudah bisa menemukan solusi. Saya berpikir untuk memposting kalau-kalau ada bantuan untuk siapa pun atau jika seseorang ingin menyarankan sesuatu yang berbeda.

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

Outputnya terlihat seperti ini:

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

Anda bisa mendapatkan semuanya dari div dengan class = "rating-list rating"

Yang perlu Anda lakukan adalah retrive atribut id: [id = "tt1345836 | imdb | 8.5 | 8.5 | advsearch"] Ketika Anda memiliki konten ini, Anda membagi string ini dengan '|', dan Anda mendapatkan: 1. parameter: id film 3. parameter: skor film

MaticDiba
sumber
Terima kasih. @Matic DB ... saya bisa mendapatkan id .. Di bawah ini solusi saya
user62198
2

Sebagai umpan balik umum, saya pikir Anda sebaiknya memperbaiki format output Anda. Masalah dengan format seperti ini adalah tidak ada cara transparan untuk mendapatkan data secara terprogram. Pertimbangkan untuk mencoba:

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

Yang menyenangkan tentang file yang dibatasi tab adalah bahwa jika Anda akhirnya memperbesar, itu dapat dengan mudah dibaca menjadi sesuatu seperti impala (atau pada skala yang lebih kecil, tabel mySql sederhana). Selain itu, Anda kemudian dapat secara sistematis membaca data dalam python menggunakan:

 line.split("\t")

Sedikit saran kedua, adalah saya akan menyarankan untuk mendapatkan informasi lebih banyak daripada yang Anda pikir Anda butuhkan pada memo awal Anda. Ruang disk lebih murah daripada waktu pemrosesan, jadi jalankan kembali scraper setiap kali Anda memperluas analitik Anda tidak akan menyenangkan.

Jagartner
sumber