Semalt'tan Bir Eğitim: Python'da Web Kazıma

Son zamanlarda KinoPoisk'i (IMDB'nin Rusça versiyonu) ziyaret ettim ve yıllar boyunca 1000'den fazla filmi derecelendirmeyi başardığımı öğrendim. Bu verileri daha ayrıntılı araştırmanın ilginç olacağını düşündüm: film zevklerim zamanla değişti mi? Yılın hangi mevsiminde daha fazla film izleyebilirim?

Ancak güzel grafikleri analiz etmeden ve oluşturmadan önce verileri almamız gerekiyor. Ne yazık ki, birçok hizmetin genel API'si yoktur, bu nedenle kollarınızı toplamanız ve html sayfalarını ayrıştırmanız gerekir.

Bu makale her zaman Web Scrapping'in nasıl kullanılacağını öğrenmek isteyen, ancak ellerini ele almayan veya nereden başlayacağını bilmeyenler için tasarlanmıştır.

Görev

Görevimiz, daha önce görülen filmler hakkındaki verileri çıkarmaktır: filmin başlığı, izlenme tarihi ve saati, kullanıcının derecelendirmesi.

Aslında, çalışmalarımız 2 aşamada yapılacak:

Aşama 1: HTML sayfalarını indirin ve kaydedin

Aşama 2: HTML'yi daha fazla analiz için uygun bir formatta (csv, json, panda veri çerçevesi vb.) Ayrıştırın.

enstrümanlar

Http-istekleri göndermek için birçok python kütüphanesi vardır. En ünlü ve çok kullanışlı olanı İstekler.

Html ayrıştırma için bir kütüphane seçmek de gereklidir.

Güzel, lxml

Bunlar html'yi ayrıştırmak için en popüler iki kütüphanedir ve bunlardan birini seçmek sadece kişisel bir tercihtir. Dahası, bu kütüphaneler birbirine sıkı sıkıya bağlı: BeautifulSoup hızlandırma için dahili ayrıştırıcı olarak lxml kullanmaya başladı ve lxml'de bir destek modülü eklendi. Yaklaşımları karşılaştırmak için, verileri BeautifulSoup ile ve lxml.html modülündeki XPath seçicilerini kullanarak ayrıştıracağım.

Veri İndirme

Verileri indirmeye başlayalım. Her şeyden önce, sayfayı url ile almaya çalışalım ve yerel bir dosyaya kaydedelim.

Ortaya çıkan dosyayı açıyoruz ve bunun o kadar basit olmadığını görüyoruz: site bizi robot olarak gördü ve verileri göstermeyecek.

Sitenin Nasıl Çalıştığını Öğrenelim

Tarayıcının siteden bilgi almada bir sorunu yoktur. İsteği tam olarak nasıl gönderdiğini görelim. Bunu yapmak için tarayıcıdaki "Geliştirici Araçları" nda "Ağ" panelini kullanıyoruz (bunun için Firebug kullanıyorum), genellikle ihtiyacımız olan istek en uzun olanıdır.

Gördüğümüz gibi, tarayıcı ayrıca UserAgent başlıklarına, çerezlere ve başka sayıda parametreye gönderir. İlk olarak, bir başlığa doğru UserAgent göndermeye çalışacağız.

Bu sefer başarılı olduk ve şimdi gerekli veriler bize veriliyor. Bazen sitenin çerezin geçerliliğini de kontrol ettiğini belirtmek gerekir, bu durumda İstekler kütüphanesindeki oturumlar yardımcı olacaktır.

Tüm Oranları İndir

Artık oranları olan bir sayfa kaydedebiliyoruz. Ancak genellikle kullanıcının çok fazla oranı vardır ve tüm sayfalarda yineleme yapmak gerekir. Bizi ilgilendiren sayfa numarası doğrudan URL'ye aktarılabilir.

Html'den Veri Toplama

Şimdi doğrudan html'den veri toplamaya başlayalım. Html sayfasının nasıl yapılandırıldığını anlamanın en kolay yolu tarayıcıdaki "Öğeyi incele" işlevini kullanmaktır. Bu durumda, her şey oldukça basittir: oranları olan tüm tablo etiketindedir. Bu düğümü seçin:

bs4 ithalat BeautifulSoup

lxml import html sitesinden

# Güzel Çorba

çorba = BeautifulSoup (metin)

film_list = soup.find ('div', ('sınıf': 'profileFilmsList'))

# lxml

ağaç = html.fromstring (metin)

film_list_lxml = tree.xpath ('// div [@class =' 'profileFilmList' ']') [0]

Filmin Rusça başlığını ve filmin sayfasına bir bağlantıyı nasıl çekeceğinizi öğrenelim (ayrıca metnin ve niteliğin değerini nasıl alacağınızı).

İngilizce başlık çıkarmanız gerekiyorsa, "nameRus" u "nameEng" olarak değiştirin.

Sonuçlar

Web sitelerini nasıl ayrıştıracağımızı, kütüphaneler İstekler, BeautifulSoup ve lxml ile tanışmayı öğrendik, ayrıca KinoPoisk'te daha önce görülen filmlerin daha fazla analizi için uygun veriler aldık.