İmdb web sayfası nasıl kazınır?


10

Veri analizini öğrenme çabasının bir parçası olarak kendi başıma Python kullanarak web kazıma öğrenmeye çalışıyorum. URL'si aşağıdaki imdb web sayfasını kazımaya çalışıyorum: http://www.imdb.com/search/title?sort=num_votes,desc&start=1&title_type=feature&year=1950,2012

BeautifulSoup modülünü kullanıyorum. Aşağıdaki kod kullanıyorum:

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

Aşağıdaki çıktıları alıyorum:

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

Bu kodu kullanarak, başlık, tür, çalışma zamanı ve yıl kazıma olabilir ama imdb film kimliği ya da derecelendirme kazıma olamazdı. Elemanları inceledikten sonra (krom tarayıcıda), yukarıdaki gibi benzer kodu kullanmama izin verecek bir desen bulamıyorum.

Film kimliğini ve derecelendirmelerini kazımama izin verecek bir kod parçası yazmama yardımcı olan var mı?


1
Kodunuzu biraz düzenledim ancak ratingtanımlanmadığı için başarısız oluyor . Bunu düzeltirseniz from BeautifulSoup import BeautifulSoup, ve ekleyebilirsiniz import requests. Ve neden bunu göstermeyelim url="http://etc"ki bunu kendimiz için yapmak zorunda değiliz?
Spacedman

Yanıtlar:


12

Kazıma yapmak yerine, verileri doğrudan buraya getirmeyi deneyebilirsiniz: http://www.imdb.com/interfaces . Görünüşe göre filmler, aktörler vb. İçin ftp aracılığıyla veri var.


2
@Gred Thatcher, Bağlantı için teşekkürler. Bu proje, web kazıma ve dolayısıyla tüm bu sıkıntıları öğrenme çabasının bir parçasıdır. - :)
user62198

8

Bir çözüm bulabildim. Ben kimseye herhangi bir yardım olması durumunda veya birileri farklı bir şey önermek istiyorsa göndermeyi düşündüm.

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

Çıktı şöyle görünür:

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

2

Div = class = "rating rating-list" ile her şeyi alabilirsiniz

Yapmanız gereken tek şey retrive öznitelik kimliği: 3. parametre: film puanı


Teşekkürler. @Matic DB ... ben id elde edebildi .. aşağıda benim çözüm
user62198

2

Genel bir geri bildirim olarak, çıktı biçiminizi iyileştirmek için iyi yapacağınızı düşünüyorum. Biçimde olduğu gibi sorun, programlı olarak veri almak için şeffaf bir yol olmamasıdır. Bunun yerine şunu deneyin:

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

Sekmeyle ayrılmış dosya hakkında güzel bir şey, ölçeklendirirseniz, impala (veya daha küçük ölçeklerde, basit mySql tabloları) gibi bir şeye kolayca okunabilmesidir. Ayrıca, daha sonra aşağıdakileri kullanarak programlı olarak python'daki verileri okuyabilirsiniz:

 line.split("\t")

İkinci tavsiye, ilk kazımanızda ihtiyacınız olduğunu düşündüğünüzden daha fazla bilgi almanızı öneririm. Disk alanı işlem süresinden daha ucuzdur, bu nedenle analiterinizi her genişlettiğinizde kazıyıcıyı yeniden çalıştırmak eğlenceli olmayacaktır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.