Kesinlikle iyi bir web kazıma çerçevesi ile başlamak isteyeceksiniz. Daha sonra çok sınırlayıcı olduklarına karar verebilirsiniz ve kendi kitaplık yığınınızı bir araya getirebilirsiniz, ancak çok fazla kazıma deneyimi olmadan tasarımınız pjscrape veya scrapy'den çok daha kötü olacaktır.
Not: Burada gezinme ve kazıma terimlerini temelde birbirinin yerine kullanıyorum. Bu, Quora sorunuza verdiğim cevabın bir kopyası, oldukça uzun.
Araçlar
Tercih ettiğiniz tarayıcıya bağlı olarak Firebug veya Chrome geliştirme araçlarını iyice öğrenin. Verileri aldığınız siteye göz atarken ve aradığınız verileri hangi url'lerin içerdiğini ve hangi veri formatlarının yanıtları oluşturduğunu belirlerken bu kesinlikle gerekli olacaktır.
HTML'nin yanı sıra HTTP hakkında iyi bir çalışma bilgisine ihtiyacınız olacak ve muhtemelen orta proxy yazılımında iyi bir insan parçası bulmak isteyeceksiniz. HTTP isteklerini ve yanıtlarını inceleyebilmeniz ve tanımlama bilgilerinin, oturum bilgilerinin ve sorgu parametrelerinin nasıl aktarıldığını anlamanız gerekecektir. Fiddler ( http://www.telerik.com/fiddler ) ve Charles Proxy ( http://www.charlesproxy.com/ ) popüler araçlardır. Bir fareden çok klavyeci olduğum için mitmproxy ( http://mitmproxy.org/ ) kullanıyorum .
Anında geri bildirim ile çeşitli kod parçalarını deneyebileceğiniz bir tür konsol / kabuk / REPL tipi ortam paha biçilmez olacaktır. Bunun gibi tersine mühendislik görevleri çok fazla deneme yanılma gerektirdiğinden, bunu kolaylaştıran bir iş akışı isteyeceksiniz.
Dil
PHP temelde çıktı, bu görev için pek uygun değil ve bu alanda kütüphane / çerçeve desteği zayıf. Python (Scrapy harika bir başlangıç noktasıdır) ve Clojure / Clojurescript (inanılmaz derecede güçlü ve üretken ancak büyük bir öğrenme eğrisi) bu problem için harika dillerdir. Yeni bir dil öğrenmek istemediğiniz ve zaten Javascript bildiğiniz için JS'ye bağlı kalmanızı kesinlikle öneririm. Pjscrape kullanmadım ama belgelerini hızlıca okuduktan sonra oldukça iyi görünüyor. Çok uygundur ve aşağıda anlattığım soruna mükemmel bir çözüm sunar.
Normal ifadeler hakkında bir not: HTML'yi PARSE ETMEK İÇİN NORMAL İFADELER KULLANMAYIN. Yeni başlayanların çoğu, normal ifadelere aşina oldukları için bunu yapar. Bu büyük bir hata, html'de gezinmek için xpath veya css seçicilerini kullanın ve html düğümü içindeki gerçek metinden verileri çıkarmak için yalnızca normal ifadeleri kullanın. Bu sizin için zaten aşikar olabilir, denerseniz çabucak aşikar hale gelir, ancak birçok insan nedense bu yolda giderken çok zaman harcıyor. Xpath veya css seçicilerinden korkmayın, bunlar normal ifadelerden ÇOK daha kolay öğrenilir ve bu sorunu çözmek için tasarlandılar.
Javascript ağırlıklı siteler
Eskiden bir http talebinde bulunmanız ve HTML yanıtını çözümlemeniz gerekiyordu. Artık, hedef sitenin javascript bölümü tarafından yapılan standart HTML HTTP istek / yanıtları ve eşzamansız HTTP çağrılarının bir karışımı olan sitelerle neredeyse kesinlikle uğraşmanız gerekecektir. Proxy yazılımınızın ve firebug / devtools'un ağ sekmesinin çok kullanışlı olduğu yer burasıdır. Bunlara verilen yanıtlar html veya json olabilir, nadir durumlarda xml veya başka bir şey olabilir.
Bu soruna iki yaklaşım vardır:
Düşük seviyeli yaklaşım:
Javascript sitesinin hangi ajax url'lerini aradığını ve bu yanıtların neye benzediğini anlayabilir ve aynı istekleri kendiniz de yapabilirsiniz. Dolayısıyla, http://example.com/foobar'dan html'yi çekip bir veri parçası çıkarabilir ve ardından json yanıtını http://example.com/api/baz?foo=b ... konumuna çekmeniz gerekebilir . diğer veri parçasını alın. Doğru çerezleri veya oturum parametrelerini geçirmenin farkında olmanız gerekir. Bu çok nadirdir, ancak bazen bir ajax çağrısı için gerekli bazı parametreler sitenin javascript'inde yapılan bazı çılgın hesaplamaların sonucu olabilir, tersine mühendislik bu can sıkıcı olabilir.
Gömülü tarayıcı yaklaşımı:
Neden html'de hangi verilerin olduğunu ve bir ajax çağrısından hangi verilerin geldiğini hesaplamanız gerekiyor? Tüm bu oturum ve çerez verilerini mi yönetiyorsunuz? Bir siteye, tarayıcıya ve javascript sitesine göz atarken bunu yapmak zorunda değilsiniz. Bütün mesele bu.
Sayfayı phantomjs gibi başsız bir tarayıcı motoruna yüklerseniz, sayfayı yükleyecek, javascript'i çalıştıracak ve tüm ajax çağrılarının ne zaman tamamlandığını size söyleyecektir. Uygun tıklamaları tetiklemek için gerekirse kendi javascript'inizi veya site javascript'inin uygun verileri yüklemesi için gerekli olan her şeyi enjekte edebilirsiniz.
Şimdi iki seçeneğiniz var, bitmiş html'yi çıkarıp ayrıştırmasını sağlayın veya ayrıştırma ve veri biçimlendirmenizi yapan ve verileri dışarı atan sayfaya biraz javascript enjekte edin (muhtemelen json biçiminde). Bu iki seçeneği de özgürce karıştırabilirsiniz.
Hangi yaklaşım en iyisidir?
Bu duruma göre değişir, kesinlikle düşük seviyeli yaklaşıma aşina ve rahat olmanız gerekecektir. Gömülü tarayıcı yaklaşımı her şey için işe yarar, uygulaması çok daha kolay olacak ve kazımadaki en zorlu sorunların bazılarını ortadan kaldıracaktır. Aynı zamanda, anlamanız gereken oldukça karmaşık bir makine parçası. Bu sadece HTTP istekleri ve yanıtları değil, istekleri, gömülü tarayıcı oluşturma, site javascript, enjekte edilmiş javascript, kendi kodunuz ve gömülü tarayıcı süreciyle 2 yönlü etkileşimdir.
Gömülü tarayıcı, oluşturma ek yükü nedeniyle ölçeğe göre çok daha yavaştır, ancak çok sayıda farklı alan adı kazmadığınız sürece bu neredeyse kesinlikle önemli olmayacaktır. Taleplerinizi sınırlama ihtiyacınız, tek bir alan adı durumunda işleme süresini tamamen önemsiz hale getirecektir.
Hız Sınırlama / Bot davranışı
Bunun çok farkında olmalısın. Hedef alanlarınıza makul bir oranda talepte bulunmanız gerekir. Web sitelerini tararken iyi davranan bir bot yazmanız gerekir ve bu, robots.txt'ye saygı duymak ve sunucuyu isteklere boğmamak anlamına gelir. Buradaki hatalar veya ihmaller çok etik değildir, çünkü bu bir hizmet reddi saldırısı olarak kabul edilebilir. Kabul edilebilir oran, kime sorduğunuza bağlı olarak değişir, 1req / s, Google tarayıcısının çalıştığı maksimum değerdir, ancak siz Google değilsiniz ve muhtemelen Google kadar hoş karşılanmıyorsunuz. Makul olduğu kadar yavaş tutun. Her sayfa isteği arasında 2-5 saniye öneririm.
Botunuzu tanımlayan ve botunuz için amacını açıklayan bir web sayfası olan bir kullanıcı aracısı dizesiyle isteklerinizi tanımlayın. Bu url aracı dizesine giriyor.
Site sizi engellemek isterse, kolayca engelleyeceksiniz. Uçlarındaki akıllı bir mühendis, botları kolayca tanımlayabilir ve sonunda birkaç dakikalık çalışma, sizin tarafınızdan kazıma kodunuzu değiştiren haftalarca çalışmanıza veya bunu imkansız hale getirmesine neden olabilir. İlişki düşmanca ise, hedef bölgedeki akıllı bir mühendis, bir dahi mühendisi bir tarayıcı yazarken tamamen engelleyebilir. Kazıma kodu doğası gereği kırılgandır ve bu durumdan kolayca yararlanılır. Bu yanıtı tetikleyecek bir şey zaten neredeyse kesinlikle etik değildir, bu yüzden iyi huylu bir bot yazın ve bunun için endişelenmeyin.
Test yapmak
Birim / entegrasyon test görevlisi değil misiniz? Çok kötü. Şimdi bir olmak zorundasın. Siteler sık sık değişir ve kodunuzu sık sık değiştirirsiniz. Bu, zorluğun büyük bir kısmı.
Modern bir web sitesini kazımayla ilgili pek çok hareketli parça vardır, iyi test uygulamaları çok yardımcı olacaktır. Bu tür bir kodu yazarken karşılaşacağınız hataların çoğu, bozuk verileri sessizce döndüren türden olacaktır. Gerilemeleri kontrol etmek için iyi testler olmadan, bir süredir farkına varmadan gereksiz bozuk verileri veritabanınıza kaydettiğinizi göreceksiniz. Bu proje sizi veri doğrulama (kullanmak için bazı iyi kütüphaneler bulun) ve test etme konusunda oldukça aşina hale getirecektir. Kapsamlı testler gerektiren ve test edilmesi çok zor olan başka birçok sorun yoktur.
Testlerinizin ikinci kısmı, önbelleğe alma ve değişiklik algılamayı içerir. Kodunuzu yazarken, sebepsiz yere aynı sayfa için sunucuyu tekrar tekrar kullanmak istemezsiniz. Birim testlerinizi çalıştırırken, kodunuzu kırdığınız için veya web sitesi yeniden tasarlandığınız için testlerinizin başarısız olup olmadığını bilmek istersiniz. İlgili url'lerin önbelleğe alınmış bir kopyasına karşı birim testlerinizi çalıştırın. Önbelleğe alma proxy'si burada çok kullanışlıdır, ancak doğru şekilde yapılandırılması ve kullanılması zordur.
Ayrıca sitenin değişip değişmediğini de bilmek istersiniz. Siteyi yeniden tasarlamışlarsa ve tarayıcınız bozulmuşsa, önbelleğe alınmış bir kopyada çalıştıkları için birim testleriniz yine de geçecektir! Ya yayındaki siteye karşı seyrek olarak çalıştırılan başka, daha küçük bir entegrasyon testleri setine ya da tam sorunları günlüğe kaydeden, sizi soruna karşı uyaran ve taramayı durduran tarama kodunuzda iyi günlüğe kaydetme ve hata tespitine ihtiyacınız olacak. Artık önbelleğinizi güncelleyebilir, birim testlerinizi çalıştırabilir ve neyi değiştirmeniz gerektiğini görebilirsiniz.
Yasal sorunlar
Aptalca şeyler yaparsanız buradaki kanun biraz tehlikeli olabilir. Yasa dahil olursa, düzenli olarak wget ve curl'den "hackleme araçları" olarak bahseden insanlarla uğraşıyorsunuz demektir. Bunu istemezsin.
Durumun etik gerçekliği, bir url istemek ve bazı verilere bakmak için tarayıcı yazılımını kullanmak ile bir url istemek ve bazı verilere bakmak için kendi yazılımınızı kullanmak arasında hiçbir fark olmamasıdır. Google, dünyanın en büyük kazıma şirketidir ve onun için sevilmektedir. Bot adınızı kullanıcı aracısında tanımlamak ve web tarayıcınızın hedefleri ve niyetleri hakkında açık olmak, yasa Google'ın ne olduğunu anladığından burada yardımcı olacaktır. Sahte kullanıcı hesapları oluşturmak veya sitenin yapmamanız gereken alanlara erişmek gibi gölgeli bir şey yapıyorsanız (robots.txt tarafından "engellenmiş" veya bir tür yetkilendirme istismarı nedeniyle), o zaman etik olmayan bir şey yaptığınızı unutmayın. ve hukukun teknoloji konusundaki bilgisizliği burada olağanüstü derecede tehlikeli olacaktır. Gülünç bir durum ama gerçek bir durum.
Dürüst bir vatandaş olarak yeni bir arama motoru denemek ve inşa etmek, bir hata yapmak veya yazılımınızda bir hata olması ve bir bilgisayar korsanı olarak görülmek tam anlamıyla mümkündür. Mevcut politik gerçekliği düşündüğünüzde isteyeceğiniz bir şey değil.
Bu devasa metin duvarını yine de ben kimim?
Hayatımda çok sayıda web tarama ile ilgili kod yazdım. On yıldan fazla bir süredir danışman, çalışan ve girişim kurucusu olarak web ile ilgili yazılım geliştirme yapıyorum. İlk günler perl tarayıcıları / kazıyıcıları ve php web siteleri yazıyordu. XMLHTTPRequest bir fikirden önce, Jesse James Garrett ona ajax adını vermeden önce ajax yapmak için web sayfalarına csv verilerini yükleyen gizli iframe'leri gömerken. JQuery'den önce, json'dan önce. 30'lu yaşlarımın ortasındayım, görünüşe göre bu iş için eski kabul ediliyor.
Bir medya şirketinde (Perl'de) büyük bir ekip için bir kez ve son zamanlarda bir arama motoru başlangıcında (Python / Javascript'te) CTO olarak küçük bir ekip için olmak üzere iki kez büyük ölçekli tarama / kazıma sistemleri yazdım. Şu anda danışman olarak çalışıyorum, çoğunlukla Clojure / Clojurescript'te kodlama yapıyorum (genel olarak harika bir uzman dili ve tarayıcı / kazıyıcı sorunlarını bir zevk haline getiren kitaplıkları var)
Başarılı tarama önleme yazılım sistemleri de yazdım. Sevmediğiniz botları tespit etmek ve sabote etmek istiyorsanız, neredeyse hiç bozulmayan siteler yazmak oldukça kolaydır.
Tarayıcı, kazıyıcı ve ayrıştırıcı yazmayı diğer yazılım türlerinden daha çok seviyorum. Zorlu, eğlenceli ve harika şeyler yaratmak için kullanılabilir.