Bir web sayfasından istikrarlı ve verimli bir şekilde veri alma


11

Son zamanlarda, ihtiyacınız olan verileri elde etmek için bir web sitesinin HTML'sini ayrıştırmak için bir normal ifade kullanmanın en iyi eylem yolu olmadığını öğrendim.

Benim sorum basit: Peki, bu verileri elde etmenin en iyi / en verimli ve genel olarak kararlı bir yolu nedir?

Şunu not etmeliyim:

  • API yok
  • Verileri alabileceğim başka bir kaynak yok (veritabanları, yayınlar vb.)
  • Kaynak dosyalara erişim yok. (Herkese açık web sitelerinden veriler)
  • Verilerin, html sayfasındaki bir tabloda görüntülenen normal metin olduğunu varsayalım

Şu anda projem için python kullanıyorum ama dilden bağımsız bir çözüm / ipuçları iyi olurdu.

Bir yan soru olarak: Web sayfası Ajax çağrıları tarafından oluşturulduğunda bu konu hakkında ne düşünüyorsunuz?

DÜZENLE:

HTML ayrıştırma durumunda, verileri elde etmek için gerçek kararlı bir yol olmadığını biliyorum. Sayfa değişir değişmez ayrıştırıcınız tamamlanır. Ne bu durumda değilse ahır demek: sayfa ayrıştırmak için etkili bir yoldur, her zaman eller bana (besbelli aynı veri kümesi için) aynı sonuçları sayfası koşuluyla o değil değiştirin.


8
Kararlı bir yol yoktur, kazıma işleminizi nasıl uygularsanız yapın, web sayfasındaki basit bir değişiklikle kolayca kırılabilir. Verilerinizi almanın istikrarlı yolu, verilerin yazarlarıyla iletişim kurmak ve verileri aklı başında bir biçimde almanız için bir anlaşma yapmaktır. Bazen paraya bile mal olmaz.
Joachim Sauer

1
@JoachimSauer - Soru yine de 'en iyi' yöntemiyle cevaplanabilir.
İsimsiz

Çoğu web sitesi dinamik olduğundan ve verilerini veritabanlarında depoladığından, en iyi yol veritabanını web sitesinden almaktır. Web sitesinde bir API varsa onu kullanabilirsiniz. Statik sayfaları kazımak istediğinizde, yerleşik Python urllib ve HTMLParser modülleri iyi çalışır. HTML kazıma için birkaç paket PyPi'de de mevcuttur.
Ubermensch

Site kazıma skeezy işi. Bunu yapmanın gerçekten istikrarlı bir yolu yok çünkü site sahipleri sizi istemiyor ve sektör bir bütün olarak insanların bunu yapmasını engellemeye çalışıyor.
Steven Evers

1
Belki Webkit gibi bir web tarayıcısı katıştırın ve sonra oluşturulan sayfadan bilgi almak için DOM komut dosyasını kullanın? Hemen hemen her platform bunu yapabilir, ancak Qt: doc.qt.nokia.com/4.7-snapshot/qtwebkit-bridge.html
user16764

Yanıtlar:


2

İşte benim 2 sentim:

Herhangi bir AJAX yoksa veya kolayca temizlenebilirse, HTML'yi XHTML'ye 'düzeltin' (örneğin HTMLTidy kullanarak), ardından bilgileri ayıklamak için normal ifadeler yerine XPath kullanın.
İyi yapılandırılmış bir web sayfasında, mantıksal olarak ayrılmış bilgi varlıkları farklı <div>s veya başka bir etikette bulunur; bu, basit bir XPath ifadesiyle doğru bilgileri kolayca bulabileceğiniz anlamına gelir. Bu harika bir özellik, örneğin Chrome'un konsolunda veya Firefox'un geliştirici konsolunda test edebileceğiniz ve başka bir kod satırı bile yazmadan önce çalıştığını doğrulayabileceğiniz için de harika.
Bu yaklaşım ayrıca çok yüksek sinyal-gürültü oranına sahiptir, çünkü genellikle ilgili bilgileri seçmek için kullanılan ifadeler tek satırlı olacaktır. Ayrıca okunması normal ifadelerden çok daha kolaydır ve bu amaçla tasarlanmıştır.

Sayfada AJAX ve ciddi JavaScriptler varsa, uygulamaya bir tarayıcı bileşeni gömün ve ihtiyacınız olan olayları tetiklemek için DOM'sini ve bilgi ayıklamak için XPath'ı kullanın. Birçoğu kaputun altında gerçek dünya tarayıcıları kullanan çok iyi gömülebilir tarayıcı bileşenleri var, bu iyi bir şey, çünkü bir web sayfası yanlış (X) HTML olabilir, ancak yine de tüm büyük tarayıcılarda iyi işliyor ( aslında, sayfaların çoğu sonunda bu şekilde elde edilir).


Teşekkürler, kesinlikle XPath'a biraz daha bakacağım. Onunla çalışmaya alışkın değilim, bu yüzden öğrenmek güzel bir şey olacak. +1 :)
Mike

5

Deneyimlerime göre, .NET ortamını kullanarak HTML Çeviklik Paketi'nden yararlanabilirsiniz .

Sayfa XHTML olarak biçimlendirilmişse, normal bir XML ayrıştırıcı da kullanabilirsiniz. Hayal edebileceğiniz herhangi bir ortam için çok şey var.

AJAX ile ilgili yan soru için, veri almak ve ayrıştırmak için normal HTTP ağ kodunu kullanabilirsiniz.

Yine AJAX yığınınız XML döndürürse, birçok seçeneğiniz olur. JSON döndürürse, akışı yazılan nesnelere eşlemenize izin veren bir kitaplık düşünün. .NET size Newtonsoft.Json öneririm .


Ve 'HTTP ağ kodu' ile bir istek yapıldığında sunucunun yanıtını yakalamak mı demek istiyorsunuz? Öneriler için teşekkürler, onlara bakacağımdan emin olacağım. +1
Mike

Kesinlikle. .NET'te System.Net.WebClient veya RestSharp | restsharp.org . Droid için Mono'da da kullandım.
gsscoder

4

HTML'nin ayrıştırılması tamamen önemsiz bir görev değildir, çünkü biri muhtemelen yanlış işaretleme (etiket çorbası) ile uğraşmak zorundadır. Yıllar boyunca tarayıcılar, hatalarla başa çıkmak için aşağı yukarı aynı stratejiyi uyguladılar ve bu algoritma HTML5 belirtiminde vaftiz edildi (evet, HTML5 belirtimi, HTML5 olmayan şeylerle ne yapılacağını belirtir).

HTML'yi ayrıştırmak için tüm büyük dillerin kütüphaneleridir, örneğin bu .

Her durumda, alacağınız şey hiçbir anlamda sabit değildir. Web sayfası biçimi her değiştiğinde sıyırıcıyı uyarlamanız gerekir.


Teşekkürler, işi yapmak için Güzel Çorba kullanıyorum . Kararlı olmayacağını biliyorum, muhtemelen sorularımda açıklığa kavuşturmalıyım. +1 sizin için :)
Mike

4

Bir yan soru olarak: Web sayfası Ajax çağrıları tarafından oluşturulduğunda bu konu hakkında ne düşünüyorsunuz?

Ajax çağrıları yapılıyorsa, büyük olasılıkla bazı POST veya bazı değişkenlerle GET URL'si olabilir.

Uç noktaların ve parametrelerin ne olduğunu öğrenmek için JavaScript'i inceleyeceğim. Bundan sonra, döndürülen verilerin json / xml / düz metin veya belki de kısmi html olması muhtemeldir.

Yukarıdaki bilgileri öğrendikten sonra, o uç noktaya bir GET veya POST isteği yaparsınız ve döndürülen verileri ayrıştırırsınız.


2
Worth birçok hizmet HTTP başlıkları sağlamak için teftiş belirterek HTTP_X_REQUESTED_WITHolduğunu XMLHttpRequest. İyi olanlar da POST istekleri için bir çeşit XSRF koruması uygulayacaktır, bu yüzden bu sihirli çereze de ihtiyacınız olacak. Bazı herkese açık API'lar tarafından kasıtlı olarak açığa çıkmayan AJAX uç noktalarını gıdıklamak bana biraz rahatsızlık verir ve çıktı (veya talep politikası) değişirse kazıyıcı kırılmaya eğilimlidir.
Tim Post

@TimPost% 100 doğru. Gerçekten onun "icky" katılıyorum :) ama herhangi bir kamu API yokluğunda, gerekir gerekir ..
Darknight

Bunu kendi AJAX destekli uygulamamda kullanabilirdim (ve 'kendi' ile yazdım demek istemiyorum ama kurulum benim) ama başka bir sunucunun sistemini denemek ve atlamak doğru hissetmeyecek, bu yüzden @ TimPost, bir nevi 'ick' hissediyor. Ancak iyi bir fikir, teşekkürler! 1!
Mike

1

Bunu yapmanın istikrarlı veya daha iyi bir yolu yoktur, HTML web sayfaları bilgisayarlar tarafından değiştirilmek üzere yapılmamıştır. İnsan kullanıcılar içindir, ancak yapmanız gerekiyorsa bir tarayıcı ve bazı javascript kullanmasını öneririm. Çalışmamda, üçüncü taraf bir siteden bazı bilgileri çıkarması gereken bir projeye dahil oldum. Uygulama bir Chrome uzantısı olarak geliştirildi. Uygulama mantığı, Sayfa yükleme işlemi tamamlandıktan sonra siteye enjekte edilen javascript kullanılarak yazılır. Ayıklanan veriler bir http sunucusu üzerinden bir veritabanına gönderilir. En iyi yaklaşım değil, işe yarıyor. Not: Site sahibi böyle bir şey yapmamıza izin verdi.


HTML sayfalarının bilgisayarlar tarafından ayrıştırılmasının gerekmediğini biliyorum, ancak bazen başka bir seçenek yoktur. Ayrıca, hiçbir şekilde ticari olmayan kişisel bir proje için halka açık bilgiler kullanıyorum, açık bir izne ihtiyacım olduğunu düşünmüyorum, değil mi? Girdiniz için teşekkürler! +1 sizin için de;)
Mike

@MikeHeremans Bir web sitesinden bilgi almaya yetkili olup olmadığınızı öğrenmek için, ToS ve robots.txt dosyalarını okuyun. Her ikisi de bilgileri otomatik olarak kazıma hakkınızı inkar etmezse, çoğu durumda yasal olarak iyi olmalısınız. Tabii ki, IANAL ...
K.Steff

Söz konusu projenin kodunu görmek istiyorsanız: code.google.com/p/acao-toolkit/source/browse/… . Content_script.js dosyasını kontrol edin, sayfaya eklenen koddur.
nohros
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.