M herhangi bir web sitesi ve çevrimiçi hizmet, geliştiricilerin platformlarından verilere erişmesine izin veren API'ler sağlar; ancak, bu API'ler genellikle yalnızca sınırlı miktarda bilgi sağlar ve birçok web sitesi veya hizmet API'ler sunmaz. Size gerekli bilgileri sağlayan API'ler olmadan web sayfalarından bilgi almak istemeniz durumunda web kazımadan yararlanabilirsiniz . Bu blog gönderisi, Python kullanarak verileri web taraması yapmak için Selenium ve Beautifulsoup4 kullanmanın temelleri konusunda size rehberlik eder ve web'den etkili bir şekilde veri kazımak için kullanılabilecek işleme odaklanır. Temel python ve HTML bilgisi varsayılır.
Airbnb , kişilerin mülklerini Airbnb platformunda kiralamalarına olanak tanır. Yolcular daha sonra bu özellikleri daha kısa veya daha uzun süreler için rezerve edebilir. Şirket, Ağustos 2008'de San Francisco, California'da kuruldu ve şu anda 2,5 Milyar ABD Dolarının üzerinde yıllık gelir akışına sahip [1] . Yalnızca ABD'de platformun 660.000 listesi vardır [2] . Her bir giriş, sunulan olanaklar, konum, ev sahibi hakkında bilgiler ve incelemeler gibi birçok bilgi içerir.
Bir web sayfasından bilgi ayıklamak için kitaplıkları beautifulsoup4 ve selenyum kullanmak için, bu kitaplıkları makinenize yüklemeniz gerekir. Bunları kurduktan sonra, aşağıdaki komutlarla python ortamınıza yükleyebilirsiniz:
Bu paketleri kurmanın ve yüklemenin yanı sıra , tercih ettiğiniz tarayıcı için bu web sürücüsünü kurmanız ve .exe veya .jar dosyasını python betiğinizle aynı klasöre koymanız gerekir. Bu proje için kod yazarken krom sürücüsünü kullandım.
Ortam kurulumunuzu yaptıktan sonra, bazı verileri toplamaya başlamanın zamanı gelmiştir. Harika bir ilk adım, tek bir sayfanın statik HTML'sini python'a yüklemektir. Bu yalnızca BeautifulSoup kitaplığı ile yapılabilir. Genel olarak, sadece kazımak istediğiniz içerik web sitesine javascript aracılığıyla eklendiğinde yalnızca selenyum kullanmanız gerekir. Bu daha sonra netleşecek!
Şimdilik, statik HTML içeriğini bu web sayfasından çıkarmaya çalışacağım . Bu blog gönderisini okuduğunuz anda bu web sayfasına erişemiyorsanız, Airbnb'deki listeleri içeren herhangi bir sayfayı kullanmaktan çekinmeyin.
Aşağıdaki kod parçası, web sayfasının içeriğini almanıza ve onu bir çorba nesnesine koymanıza olanak tanır. Çorba nesnesi, güzel çorba kitaplığının bir parçasıdır.
Güzel grup kitaplığını kullanmanın en büyük avantajı, web sayfasından verileri daha etkin bir şekilde çıkarmak için kullanılabilecek birçok önceden oluşturulmuş işlevle birlikte gelmesidir. Tüm bu işlevlere genel bir bakış dokümantasyonda bulunabilir . Burada, mevcut işlevlerin tartışması yerine bir web sayfasından bilgi almak için kullanılabilecek bir işleme odaklanıyorum.
Bir web sayfasından bilgi almaya çalışmanın ilk adımı, her zaman web sitesinin nasıl inşa edildiğini kontrol etmektir. Web sitesine kısa bir bakış, farklı listelemelerdeki bilgilerin birbirinin altında gösterildiğini gösterir. Her liste hem bir görüntü hem de bazı standart bilgilerin verildiği bir alan içerir. Harika bir ilk adım, her giriş için bilgileri çıkarmaya çalışmaktır. Chrome'daki inceleme aracını (ctrl-shift-i) kullanarak bu iki öğenin "_8ssblpx" sınıfına sahip bir nesnenin parçası olduğu görülebilir. Bu bilgileri kullanarak, bu bilgileri web sayfasından çıkarmak için yerleşik güzel grup işlevlerini kullanabiliriz.
Kazımak istediğimiz tüm verileri içeren nesneyi çıkarmanın önemli bir avantajı, web sayfasını yalnızca bir kez istememiz gerektiğidir. Bu, web sayfasını birden çok kez talep etmeye kıyasla çok daha hızlıdır. Bu nesnenin son veri kümesine kaydedilmesi, web sitesinin tekrar kazınmasına gerek kalmadan ek özelliklerin oluşturulmasına da izin verir.
Artık bir liste ile ilgili tüm bilgileri içeren nesneye sahip olduğumuza göre, çıkarmak istediğimiz bilgilere odaklanmaya başlama zamanı. Bu durumda, web sayfasında gösterilen tüm bilgiler alakalı olduğundan (gecelik ücrete göre hesaplanabilen toplam fiyat dışında) her bir liste için tüm bu bilgileri alacağız. Görünür bilginin yanı sıra, bağlantıyı listenin ayrıntılı sayfasına doğru da ekleyeceğim (bkz. Şekil 5) çünkü daha sonra faydalı olacaktır. Bu bilgiyi çıkarmak için güzel gruptan bul işlevini kullanıyorum ve daha önce olduğu gibi aynı yaklaşımı kullanıyorum:
Bu teknikleri kullanarak aşağıdaki veri kümesi oluşturulabilir:
Bu teknik olarak web tarama bölümünün sonudur (en azından bu sayfa için). Web sayfasından çıkarmak istediğim tüm bilgiler (ve hatta daha fazlası) veri setinde bulunabilir; ancak, bu veri setini analizleri gerçekleştirmek için kullanabilmek için daha fazla veri temizliği gereklidir. Veri temizliğinin sonucu bu blog yazısının sonunda gösterilecektir.
Bir sonraki adım, tek bir sayfa yerine belirli bir şehir için tüm girişi çıkarmaktır. Airbnb sayfasının altında, bir sonraki sayfaya geçmek için bir düğmeye tıklayabilirsiniz. Her şehrin görüntülenen on beş farklı sayfası vardır. Amacımız bir sonraki sayfaya geçme görevini otomatik hale getirmektir. Ok nesnesini tanımlayarak başlıyoruz (resme bakın). Airbnb bu düğmeyi "li" türünün "_i66xk8d" sınıfı olarak kodlamıştır. Bağlantıların 'a' etiketiyle tanımlanabileceğini bilerek, bizi sonraki sayfaya götüren bağlantıyı aşağıdaki kodla belirleyebiliriz:
Bu yapıldıktan sonra, tüm sayfaların bir sonraki adımı oldukça basittir, çünkü sonraki sayfanın içeriğini kazımak için bir sonraki sayfaya giden bağlantıyı kullanabiliriz ve bunu, sonraki sayfa bulunmayana kadar yapabiliriz:
Şimdi mesele veri kümesini temizleme meselesi ve belirli bir şehir için Airbnb'de bulunan tüm listeleri kazıdık! Birden fazla şehri kazımak istiyorsanız, URL'leri içeren bir liste tanımlayabilir ve bu listenin üzerinden geçebilirsiniz.
Daha önce bahsedildiği gibi, her listenin ayrıntılı bir sayfasına giden bağlantı, verilerin kazınması sırasında da kaydedildi. Bu, örneğin listelerin veya incelemelerin tam açıklaması gibi daha ayrıntılı bilgileri kazımak istiyorsak gereklidir. Maalesef, Airbnb bu ayrıntılı sayfaların içeriğini javascript kullanarak web sayfasına yüklediğinden, statik bir web sitesini toplama yöntemimiz kullanılamıyor. Javascript'in yüklenmesi birkaç saniye sürer. Önceki yöntemimiz sayfanın yüklenmesini beklemiyor, bu da önemli bilgilerin kaydedilmediği anlamına geliyor.
Bu sorunu çözmek için Selenium kullanıyoruz . Selenium, web sitesinin Javascript öğelerini de yüklemek için bir web sürücüsü kullanır. Daha sonra, web sayfasından bilgi kazımak için önceki yöntemleri kullanabiliriz. Web sürücüsünü kurmak için aşağıdaki kod parçası kullanılabilir:
Ayrıca bir bekleme süresi tanımladığımı da unutmayın. Bu bekleme süresi, tüm içeriği yüklemek için gereken süredir. Genel olarak konuşursak, web siteleri SEO nedenlerinden dolayı sayfalarının 2 saniyeden daha kısa sürede yüklenmesini sağlamaya çalışır.
Airbnb sayfası için ek bir zorluk, daha fazla oku düğmesinin varlığıdır . Bu düğmelerin tıklanması gerekir, aksi takdirde tüm içerik görüntülenmez. Neyse ki selenyum sürücüsü ayrıca bir öğeyi bulup üzerine tıklamaya da izin veriyor. Sayfanın çıkarılması daha sonra şu şekilde yapılır:
Şimdi, her şey eskisi gibi! Kazımak istediğimiz (önceki veri çerçevemize kaydedilen) tüm URL'leri döngüye alırız, ardından sayfanın içeriğini kaydeder, bilgileri çıkarır ve verileri temizleriz. Ancak ne yazık ki, çok fazla veriyi kazımak istiyorsanız, bunun çalışması çok uzun zaman alabilir.
Aşağıda bağlantısı verilen komut dosyasında, yukarıda açıklanan yöntemler kullanılarak kazınan bilgiler ve nasıl temizlendiği hakkında daha fazla ayrıntı bulabilirsiniz. Amaç, güzel grup ve selenyumun arkasındaki temel kavramları tanıtmaktı. Bu hedefe ulaşıldı. Toplam 5204 gözlem için temizlikten sonra toplam 114 özellik çıkarıldı. Kazıma ve temizleme mükemmel değildi, ama sorun değil.
Kesinlikle hiçbir veri olmadan başladığımızı ve tüm bu verilerin otomatik olarak çıkarıldığını unutmayın . Airbnb büyük bir şirkettir ve web sayfaları genellikle aynı kalıpları takip etse de, genellikle sayfalarının yapısını değiştirirler. Proje sırasında Airbnb'nin web sayfalarının yapısı değişti, bu da kodun kırıldığı anlamına geliyor! Bunun yanı sıra, Airbnb ayrıca A / B testi yapar , bu da aniden benzersiz bir farklı sayfa görebileceğiniz anlamına gelir. Bundan yüksek kaliteli yapılandırılmış bir veri kümesi oluşturmayı başardığımız gerçeği zaten harika.
Komut dosyasının tamamı ve verilerin bir örneği Github'da bulunabilir.
Yasal Uyarı: Bu makale yalnızca eğitim amaçlıdır. Kimseyi web sitelerini, özellikle de bu tür eylemlere karşı hüküm ve koşulları olabilecek web mülklerini kazımaya teşvik etmiyoruz.
Biçimsel bir sistem, temel sembollerden ve bu sembolleri manipüle etmek için bir dizi kuraldan oluşan bir mantık yapısıdır. Bu semboller “temeldir” çünkü içsel bir anlamları yoktur.
Kasım 2020'nin başlarında SalesForce, açıklanamayacak şekilde JARM adlı yeni bir aktif TLS parmak izi alma aracını duyurdu. JARM'ın temeli, bir hedef sunucu özel olarak hazırlanmış çeşitli farklı TCP "İstemci merhaba" paketleri kullanılarak tarandığında, elde edilen yanıtların birleştirilip, paylaşılan veya benzer bir uygulama veya sunucunun göstergesi olan bir parmak izi sağlamak için karma hale getirilebilmesidir. yığını.
Harika geliştiriciler yapan teknik olmayan şeyler Bir süredir bu makaleyi yazmayı erteliyorum - yazmak için hiç nitelikli hissetmedim. Bugün onu yazma zamanının geldiğini düşündüm.
Teknoloji endüstrisindeki bir pozisyon için mülakat yaparken, herhangi bir teklif değerlendirilmeden önce genellikle en az üç tur mülakattan geçeceksiniz. Mermiler genellikle şuna benzer: Eğer öyle düşünüyorsan, yanılıyorsun.
Pragmatik Programcı ilk olarak 1999'da yayınlandı ve o zamandan beri tüm zamanların en iyi programlama kitabı seçildi. Yazarlar Andy Hunt ve David Thomas, Agile Manifesto'nun orijinal yazarları arasındaydı ve bazı ciddi referanslara sahipler.