Python tarayıcı analizi Douban TOP250, amatör olarak hangi kitap programcılarının okuması gerektiğini söyler?

[CSDN editörünün notu] Programcılar fırça Douban da bir teknoloji anlayışına sahipler, bu makale Douban TOP250'yi tarayarak size bu kitapların "sıcak" nerede olduğunu anlatıyor! Vaka analizine ek olarak, odak noktası, tarayıcının mantığını ve temel noktalarını çözmek ve size kendi tarayıcınızı nasıl yazacağınızı öğretmektir.

Hazır mısın? Hadi gidelim!

Yazar | Zhou Zhipeng

Baş Editör | Guo Rui

Bu makale, Douban TOP250 kitaplarını taramayı bir örnek olarak ele almaktadır, ancak odak, vakanın kendisi değil, tarayıcı yazma mantığını ve bağlantı temel noktalarını ayırmak ve ilgilenen çocukların yavaş yavaş tarayıcı yazma için kendi metodolojilerini oluşturmalarına yardımcı olmaktır (bu en kritiktir. ) ve gerçek savaşta harika istek + xpath hissini yaşayın. Evet, bu numara istekleri + xpath (json) gerçekten tüm dünyada yenebilir.

Marx, web'e göz attığınızda, tüm gördüğünüzün tarayıcının görmenizi istediği şey olduğunu asla söylemedi. Bu cümle gerçeği anlatır - gördüğümüz web sayfasının tek bir sonucu vardır ve bu web sayfası her zaman birçok küçük "web sayfasından (veya bölümlerinden)" oluşur.

Tıpkı bir bulmaca gibi, gördüğümüz web sayfası aslında nihai birleştirilmiş üründür. Bir URL girdiğimizde, tarayıcı bize bu büyük bulmacayı oluşturan bir grup isteği "otomatik olarak" uzaktaki bir sunucuya gönderir. Sunucu kimliği doğruladıktan sonra, İlgili küçük bulmacaları (istek sonuçları) döndürürseniz, tarayıcı küçük bulmacaları büyük bulmacalara yerleştirmemize yardımcı olacak kadar akıllıdır.

İhtiyacımız olan şey, verilerimizin web sayfasında saklandığı küçük bulmacanın URL'sini bulmak ve ilgili içeriği daha fazla analiz etmektir. Douban TOP250 kitabını örnek olarak ele alalım. Tarayıcının ilk adımı, taramak istediğimiz hedef verileri ve URL'sini bulmak için "öğeleri incelemektir".

Douban TOP250 kitap URL'si: https://book.douban.com/top250

Öğeleri inceleyin ve hedef verilerin bulunduğu URL'yi bulun

Gözden geçirme öğesi, web sayfasını oluşturan küçük bulmacaların nasıl bir araya getirildiğini görmektir.İşlem çok basittir.Web sayfasına girdikten sonra, gözden geçirme öğesine sağ tıklayın.Varsayılan olarak, ihtiyacımız olan öğe konumunu otomatik olarak bulacaktır.

Örneğin, fareyi "Uçurtma Avcısı" başlığına hareket ettirdiğimizde, öğeleri incelemek için sağ tıklayın:

Aslında, ihtiyacımız olan veriler (kitap başlığı, gözden geçirenlerin sayısı, derecelendirmeler vb.) Her bir sayfa etiketinde bulunur. Tarayıcı yeni yeni etrafa bakmaya başlıyor ama kullanımı çok basit, minimalist dostça hatırlatma, karmaşık yapı ile karıştırmayın.

Hedef verileri iyice bulmadan önce iki kavramı kısaca açıklayalım.

Web sayfaları statik ve dinamik olarak ikiye ayrılır.Bunu kabaca, kaynak kodunu sağ tıklayıp görüntülemek olarak anlayabiliriz, işte statik URL'nin içeriği, ihtiyacımız olan verileri içeriyorsa, ardından doğrudan orijinal URL'yi (tarayıcı URL çubuğu URL).

Tarama sürecimiz sırasında bazı veriler sessizce yüklenir (tarama sırasında sunucuya gönderilen istekler) Web sayfasının bu kısmındaki veriler genellikle JS / XHR modülünde gizlenir.

Şu şekilde çalışır: öğeleri-yenileme URL'lerini-NETWORK-JS veya XHR'yi inceleyin.

Kavram açıklaması burada sona eriyor, aşağıda işlemin ayrıntılı bir açıklaması, yani ihtiyacımız olan URL'yi nasıl bulabiliriz.

Genel olarak konuşursak, statik bir web sayfasındaki verilerin elde edilmesi nispeten kolaydır Taramadan önce, gerekli verilerin statik web sayfasında olup olmadığını kontrol etmek için kaynak kodunu kontrol etme alışkanlığı geliştiririz.

Sağ tıklama kaynak kodunu görüntüle:

Hızlı bir şekilde bulmak için gerekli verilerin statik URL'de (CTRL + F) göründüğünü doğrulayın ve ardından az önce gördüğümüz kitap listesinde bir numara olan "uçurtma kovalayan" ı girin.

Başarıyla bulundu! Her şey zahmetsizdi. Aşağıya çektim ve gereken tüm verilerin statik URL'de olduğunu gördüm. Adım adım kontrol etmek için dinamik web sayfasına gitmeye gerek yoktu.

Bir hata bildirirken istekte bulunmaya çalışın

Hedef verilerin, doğrudan https://book.douban.com/top250 adresini ziyaret ederek elde edilebilecek statik URL'de olduğunu keşfettik. Ardından, web sayfası erişimini verimli bir şekilde elde etmek için PYTHON'daki istekleri alma yöntemini kullanın.

ithalat istekleri html = request.get ('https://book.douban.com/top250')

Request.get işlevinin ilk parametresi, varsayılan olarak istenen URL'dir ve bunu daha sonra tartışılacak olan başlıklar ve cookeis gibi anahtar kelime parametreleri izler.

Tamam, bir erişim isteği tamamlandı, süper kolay mı? Ziyaret tamamlandıktan sonra iade edilen içeriğe bakabiliriz:

Genellikle döndürülen durum kodu ve karşılık gelen anlam hakkında konuşurum, ancak kişisel olarak, geri gönderilen içeriği doğrudan şiddetle kontrol etmeyi çok uygun buluyorum.

Çok utanç verici, ziyaret numara yapmadan başarılı oldu, daha önce başlıkları doğrulayan Douban, şimdi başlıkları bile doğrulamıyor. Xiaodou, ahlaksızsın ... Ama kullanıcı davranışını simüle eden tarayıcı hakkında, tahtaya vurmalı ve önemli noktalar hakkında konuşmalısın! ! !

Hedef web sitesine erişmek için PYTHON kullandığımızda, esasen hedef sunucuya bir istek göndermek için PYTHON'u kullanırız ve bu makine (Python) gerçek bir kullanıcı değildir (tarayıcı aracılığıyla istenir) ve bu "sahte" ziyaret Sunucu bundan nefret ediyor (tarayıcılar web sitesi sunucusunu yükleyecek ve çoğu web sitesi verilerin toplu olarak alınmasını istemiyor). Bu nedenle, kusursuz olmak istiyorsanız, erişim davranışı simüle edilmeli ve tarayıcınız olabildiğince normal olmalıdır. En yaygın yöntem, başlıkları ve çerezleri gizleyerek tarayıcılarımızın daha insan görünmesini sağlamaktır.

Bir örnek vermeye devam edin:

Üst düzey bir toplulukta yaşıyorsunuz ve kötü adam P, topluluğa giriyor ve tarif edilemez şeyler yapıyormuşsunuz gibi davranmak istiyor.

Kapıcının, statü sembolüne dayanarak topluluğun sahibi olup olmadığına belirsiz bir şekilde karar vereceğini biliyordu, bu yüzden Xiao P ilk önce bir dizi yüksek kaliteli kıyafet ve lüks bir araba kiraladı (gizlenmiş başlıklar olarak anlaşılabilir), ki bu gerçekten karıştı. Kapıcı. Bununla birlikte, Little P çok sık girip çıktı ve park alanı her seferinde farklıydı, bu da gardiyanın ciddi şüphesine neden oldu. Bir hafta sonra, gardiyan teftiş sistemini geliştirdi ve yüz tanıma yoluyla doğruladı. Little P reddedildi. Ancak çok geçmeden Xiao P, tamamen sizmişsiniz gibi davranmak için şekil bozukluğu düzeyinde makyaj (kılık değiştirmiş tanımlama bilgileri) kullandı ve hatta yüz tanıma sistemini geçerek, istediği gibi girip çıkarak istediğini yaptı.

Buradaki temel amaç, popüler bilimi görselleştirmek aslında, IP gibi daha karmaşık kılık değiştirme yöntemleri var, ilgilenen öğrenciler kendi başlarına çalışabilirler.

Bu nedenle, güvenli tarafta olmak için, normal bir tarayıcı gibi görünen bir istek başlığı oluşturmaya devam ediyoruz.

Statik URL'yi ve anahtar parametrelerini bulun (istek başlığının ilgili parametrelerinin tümü İstek Başlıkları altındadır):

İstek kitaplığı varsayılan başlıklara sahip olacak ve anahtar parametreler sözlük biçimindedir.Burada, istek başlıkları açısından normal bir tarayıcı gibi kılık değiştirerek başlıklara tarayıcı parametreleri atıyoruz.

headers = {'User-Agent': 'Mozilla / 5.0 (Windows NT 6.1; WOW64) AppleWebKit / 537.36 (KHTML, Gecko gibi) Chrome / 63.0.3239.132 Safari / 537.36'} # Yeniden isteyin html = request.get ('https://book.douban.com/top250',headers = başlıklar) html.text # Başarılı dönüş sonucu

İstek başarılı, ihtiyacımız olan verileri ayrıştırın ve bulun

Şu anda doğru html dönüş sonucunu aldık, tüm içerik html.text içine sarılmış, bu büyük paketin içeriğini ayrıştırıp bulmamız gerekiyor, xpath burada.

İşlem şu şekildedir:

lxml ithalat etree'den bs = etree.xpath (html.text)

#Bu adım HTML içeriğini xpath yöntemi ile kolayca bulunabilen nesnelere ayrıştırır.Aslında, konumlandırma verilerine hazırlanmak için gerekli bir adımdır.Bu adımda gerekli işlemleri hatırlayın.

Önce kullanımı açıklamak için bir örnek verin:

Not: xpath dizini 1'den başlar, hatırlamayı unutmayın!

Burada girinti, bağlılığı temsil eder ve istediğimiz yazar bilgileri içine alınır. < p sınıfları = "pl" > Etiketi içinde, aşağıdan yukarıya, üst div etiketine - td etiketi - tr etiketine aittir.

Xpath elde etmek için nasıl kullanılır?

bs.xpath ('// tr / td / p'). metin

// Kök dizinden (yukarıdan aşağıya) konumlandırmayı temsil eder (bu, ilk konumlandırma için gereklidir), tr, sınıfın öğe etiketine eşit bulunması anlamına gelir, çünkü birçok tr etiketi olabilir, bunları sınıf özniteliğiyle ayırt ederiz, tr Bir sonraki düzey adına, td, ikinci td etiketini, ardından sonraki düzey p etiketini bulmak ve içerik metnini almak anlamına gelir.

P sınıfının değerini almak istiyorsanız:

bs.xpath ('// tr / td / p / @ sınıf'))

Henüz tam olarak anlamadınız mı? Önemli değil, sadece kullan, Hadi yapalım!

Fareyi "Uçurtma Avcısı" nın yazarının adına hareket ettirin, sağ tıklama-inceleme öğesi:

Kitabın yazarı hakkındaki bilgiler p etiketine sarılır ve p etiketi td-tr-tbody-tablosunun altındadır.

Daha ileriye tıklayın ve kitap başlığı, inceleme sayısı ve derecelendirme gibi ilgili bilgiler de benzer bağlantılarda yer alır. Tüm bilgiler tr düzeyinde paketlenmiştir. Üst düzeydeki tbody ve tablo da iyi olduğu sürece Tr'yi bulmak yeterlidir.

Hadi bulalım:

Tarayıcıda gördüğümüz 25 kitabın ilgili bilgilerine karşılık gelen bir dizi nesne döndürüldü, sayıldı (bu yer kesilmedi), tam olarak 25. İlk olarak, ihtiyaç duyulan anahtar bilgileri bulmaya çalışmak için ilk nesneyi kullanırız.

Not: İlk öğeyi bulduk, kitapla ilgili bilgiler paketlendi (ona bağlı), daha fazla konumlandırmak istiyoruz, çok basit, doğrudan xpath yöntemini çağırın ve başlangıca // eklemeye gerek yok:

Kitap adı:

Yazar ve yayıncı bilgileri:

Dikkatli öğrenciler, konumlandırmanın döndürdüğü değerin bir liste olduğunu keşfetmiş olmalılar.İçeriği indeks aracılığıyla çıkarıyoruz. Konumlandırma elemanına gelince, seri numarasını (td / div) geçirebilir veya özniteliği (p) atayabiliriz. Yargılamak.

Emmm, insanların kafasını karıştırması çok kolay olan bir kafa karışıklığı noktası var, yani, konumlandırmadan sonra ihtiyacımız olan bilgiyi nasıl çıkarırız, örneğin:

Yazarla ilgili bilgilerin paketlendiğini göreceksiniz. < p sınıfı = "pl" > ile < / p > Bu arada, belirli HTML dilbilgisi önemli değildir, sadece etiketin ortasındaki içeriğin metin olduğunu ve etiketteki içeriğin (sınıf veya diğer ad) nitelik olarak adlandırıldığını anlamamız gerekir. Xpath, metni .xpath ('p') aracılığıyla çıkarır. yöntem. Ve etiketteki özniteliği almak istiyorsanız (burada pl) ayıklamak için ('p / @ class') yöntemini kullanmaktır.

Ardından, önemli bilgileri çıkarmaya devam edin:

Puan:

Değerlendirici:

Bir cümlelik özet:

TAMAM, konum çıkarma işlemlerini özetleyelim:

# Nihai sonucu saklamak için burada bir DATAFRAME oluşturun sonuç = pd.DataFrame () bs.xpath içindeki i için ('// tr'): #Book Çince Adı book_ch_name = i.xpath ('td / div / a / @ title') #Puan score = i.xpath ('td / div / span'). metin #Kitap Bilgileri book_info = i.xpath ('td / p'). metin #Değerlendirme sayısı Veriler düzenli olmadığı için veriler burada PYTHON string yöntemi ile işlenir yorum_num = i.xpath ('td / div / span'). text.replace ('', ''). şerit ('(\ n'). şerit ('\ n)') # Tek cümle özeti brief = i.xpath ('td / p / span'). metin # Buradaki önbellek, her döngünün sonuçlarını depolamak ve ardından bir sonraki işlem döngüsü boyunca sonuçtaki verileri güncellemektir. cache = pd.DataFrame ({'Çince adı':, 'score':, \ 'Kitap bilgileri':, 'İnceleme sayısı':, 'Bir cümlelik özet':}) # Sonuca yeni döngüde önbelleği ekleyin sonuç = pd.concat ()

Sonuç Jiangzi'ye benzer (hariç tutulan kısım):

Çağrı ~ En kritik veri konumu, veri toplama tamamlanmıştır.

Taramak için sayfaları çevirin, her şeyi cebinize alın

Söylendiği gibi, tek kan alan dünyayı alır. İlk sayfanın verilerini elde ettik ve diğer sayfaların verileri aynı yapıya sahip.Sonunda, sayfa çevirme ve gezinmeyi gerçekleştirmek için sadece web sayfası değişiklikleri yasasını bulmamız gerekiyor.

Tarayıcıda bir sonraki sayfaya (ikinci sayfa) dönüyoruz. Dangdangdang! Tarayıcı URL çubuğundaki URL değişikliğini fark etmiş olmalısınız!

Sonraki sayfa (üçüncü sayfa):

URL'nin önündeki yapının değişmediği sonucuna varmak için nedenimiz var. Sayfa sayısını belirleyen anahtar parametre, başlangıçtan sonraki sayıdır. 25 ikinci sayfayı, 50 üçüncü sayfayı, o sayfanın 0 ve dördüncü sayfayı temsil eder. 75, vb.

Sayfayı beklendiği gibi ileri geri çevirmek, sayfayı çevirmenin anahtarı başlangıç parametresinin değiştirilmesidir. Bu nedenle, tüm URL'leri oluşturmak için yalnızca bir döngü oluşturmamız gerekir.

Bu noktada, her modülün kodu tamamlanmıştır!

Son olarak, önce TOP50 kelime bulutu sürümü kitap listesine gelelim ve ardından bir tartışma başlatmak için kodun tamamını ekleyelim:

pandaları pd olarak içe aktar ithalat istekleri lxml ithalat etree'den ithalat zamanı #Loop oluşturma URL'si def format_url (base_url, sayfalar = 10): urls = aralıktaki sayı için (0, sayfa * 25,25): urls.append (base_url.format (num)) url'leri döndür # Tek bir sayfayı ayrıştırın def parse_page (url, başlıklar): # Sonuçları saklamak için bir kap oluşturun sonuç = pd.DataFrame () html = request.get (url, başlıklar = başlıklar) bs = etree.HTML (html.text) bs.xpath içindeki i için ('// tr'): #Book Çince Adı book_ch_name = i.xpath ('td / div / a / @ title') #Puan score = i.xpath ('td / div / span'). metin #Kitap Bilgileri book_info = i.xpath ('td / p'). metin #Değerlendirme sayısı Veriler düzenli olmadığı için veriler burada PYTHON string yöntemi ile işlenir yorum_num = i.xpath ('td / div / span'). text.replace ('', ''). şerit ('(\ n'). şerit ('\ n)') Deneyin: # Arkasında cümlesiz birçok kitap var # Tek cümle özeti brief = i.xpath ('td / p / span'). metin dışında: brief = Yok # Buradaki önbellek, her döngünün sonuçlarını depolamak ve ardından bir sonraki işlem döngüsü boyunca sonuçtaki verileri güncellemektir. cache = pd.DataFrame ({'Çince adı':, 'score':, \ 'Kitap bilgileri':, 'İnceleme sayısı':, 'Bir cümlelik özet':}) # Sonuca yeni döngüde önbelleği ekleyin sonuç = pd.concat () dönüş sonucu def main (): final_result = pd.DataFrame () base_url = 'https: //book.douban.com/top250? start = {}' headers = {'User-Agent': 'Mozilla / 5.0 (Windows NT 6.1; WOW64) AppleWebKit / 537.36 (KHTML, Gecko gibi) Chrome / 63.0.3239.132 Safari / 537.36'} urls = format_url (base_url, sayfalar = 10) urllerde url için: res = ayrıştırıcı_sayfa (url, başlıklar = başlıklar) final_result = pd.concat () # Sürüngenler medeniyet istiyor, işte aşk 520 zamanı time.sleep (5.2) final_result döndür __name__ == "__main__" ise: final_result = ana ()

Yazar: Zhou Zhipeng, 2 yıllık veri analizi, hayal kırıklığı olmaması durumunda derinden eğlenceli ve veri analizi öğrenme sürecini hissetti, ardından yeni açılan halka açık numara "veriler övünmüyor", düzenli olarak güncellenen veri analizi teknikleri, ilgili ve ilginç vakalar (gerçek veriler dahil) Set), değiş tokuşa dikkat etmesi için herkese hoş geldiniz.

Feragatname: Bu makale yazarın orijinal gönderisidir, lütfen izinsiz yeniden yazdırmayın, aşağıdaki yöntemlerle gönderi ile iletişime geçebilirsiniz.

Odak noktası Asansör reklamı para basma makinesiyle karşılaştırılabilir, endüstri liderinin yılda 6 milyar net kârı var! Birden "küçük kardeş" savaş ilan etti
önceki
"Canavar" takımını çıkarıyor, Audi RS4 Avant artık gösterişsiz değil!
Sonraki
Beijing Dongcheng Longtan gönüllü hizmet sezonu başlıyor
İlk çeyrekte İl Tüketiciyi Koruma Kurulu toplam 5003 tüketici şikayetini kabul etti.Bu türden en çok şikayet gördünüz mü?
Double 11 yenilmeye değer.SDD'ye ihtiyaç duyan arkadaşlar acele edin ve piyasadaki mükemmel ürünlere bir göz atın!
Saf elektrikli spor otomobil, Porsche Taycan tasarım çizimlerini ortaya çıkardı
Beni rahatsız etme, sadece uzanmak ve para kazanmak istiyorum
1000 kilometre pil ömrüne sahip elektrikli bir araba düşünün? Ideal Smart ONE'ın daha fazla resmi iç resmi
İnanılmaz pekiştirmeli öğrenme ile küçük oyunlar nasıl oynanır?
Heihe buz ve kar vaftizinin altında keskin dünyayı değerlendirmek için, bu sefer ciddiyiz (bölüm 1)
Kobe, şehir ekibini desteklemek için Dodge soyunma odasında göründü.
Az önce, Başbakan'ın hükümet çalışma raporunda tekrar yer aldı
Her zaman doğru temperli filmi mi seçin? İlk önce hileleri anlamak daha iyidir!
Gıda ve tıp biliminin yaygınlaştırılması, tıbbi danışma, ücretsiz danışmanlık hizmeti ... Pekin öğrenme Leifeng etkinliği başlatıldı
To Top