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?
sumber
rating
tidak didefinisikan. Jika Anda memperbaikinya, Anda juga bisa menambahkanfrom BeautifulSoup import BeautifulSoup
, danimport requests
. Dan mengapa tidak juga menunjukkanurl="http://etc"
agar kita tidak harus melakukan itu untuk diri kita sendiri?Jawaban:
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.
sumber
Saya sudah bisa menemukan solusi. Saya berpikir untuk memposting kalau-kalau ada bantuan untuk siapa pun atau jika seseorang ingin menyarankan sesuatu yang berbeda.
Outputnya terlihat seperti ini:
sumber
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
sumber
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:
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:
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.
sumber