2009-08-03 10 views
28

Jak inteligentnie analizować dane zwracane przez wyniki wyszukiwania na stronie?"Inteligentny" sposób analizowania i korzystania z danych strony internetowej?

Na przykład, powiedzmy, że chciałbym stworzyć usługę internetową, która wyszukuje książki online, analizując wyniki wyszukiwania na wielu stronach internetowych dostawców książek. Mogę pobrać surowe dane HTML strony i zrobić kilka wyrażeń regularnych, aby dane działały dla mojej usługi internetowej, ale jeśli jakakolwiek strona internetowa zmieni formatowanie stron, mój kod zepsuje się!

RSS jest rzeczywiście cudowną opcją, ale wiele witryn nie ma wyszukiwania opartego na XML/JSON.

Czy są jakieś zestawy, które pomagają automatycznie rozpowszechniać informacje na stronach? Szalony pomysł byłoby mieć rozmyty moduł AI rozpoznawać wzory na stronie wyników wyszukiwania i analizowania wyników odpowiednio ...

+0

jeśli chodzi o język, jestem zaawansowany w php, ale jestem gotów użyć asp.net, jeśli to konieczne. dzięki za wszystkie odpowiedzi! – bluebit

+0

Dobra ekspresja regularna może być zaskakująco elastyczna i tolerancyjna w użyciu. Dobrą techniką jest dopasowanie obszaru * przed * elementem danych, następnie umieszczenie danych w grupie przechwytującej za pomocą leniwego kwantyfikatora, a następnie dopasowanie obszaru * po * danych. Jeśli w elastyczny sposób definiujesz dopasowania przed/po, potrafią bardzo dobrze radzić sobie ze zmianami formatowania. www.regular-expressions.info oferuje dobre wyjaśnienia na temat tej i innych technik. – BobMcGee

Odpowiedz

23

Zrobiłem trochę tego niedawno i oto moje doświadczenia.

Istnieją trzy podstawowe podejścia:

  1. wyrażeń regularnych.
    • Najbardziej elastyczny, najłatwiejszy w użyciu z luźno ustrukturyzowanymi informacjami i zmieniającymi się formatami.
    • Trudniejsze do analizy strukturalnej/tagów, ale łatwiejsze do dopasowania tekstu.
    • Wbudowane sprawdzanie poprawności formatowania danych.
    • trudniejsze w utrzymaniu niż inni, bo trzeba napisać wyrażenie regularne dla każdego wzoru, którego chcesz użyć, aby wyodrębnić/przekształcić dokument
    • Generalnie wolniejszy niż 2 i 3.
    • działa dobrze na listach similarly- sformatowane elementy
    • Pomocne będzie dobre narzędzie do programowania i testowania regex oraz kilka przykładowych stron. Mam dobre rzeczy do powiedzenia na temat RegexBuddy tutaj. Wypróbuj ich wersję demonstracyjną.
    • Odniosłem największy sukces w tej kwestii. Elastyczność pozwala pracować z nieprzyjemnym, brutalnym, ukrytym kodem HTML.
  2. Konwertuj HTML na XHTML i użyj narzędzi do ekstrakcji XML. Oczyść HTML, przekonwertuj go do legalnego XHTML i użyj XPath/XQuery/X-whatever, aby wysłać zapytanie jako dane XML.
    • Narzędzia: TagSoup, HTMLTidy itp
    • Jakość konwersji HTML do XHML jest bardzo ważne i bardzo zmienny.
    • Najlepsze rozwiązanie, jeśli żądane dane są uporządkowane według układu HTML i znaczników (dane w tabelach HTML, listach, grupach DIV/SPAN itp.).
    • Najbardziej odpowiednie do tworzenia struktur linków, tabel zagnieżdżonych, obrazów, list i tak dalej
    • Powinien być szybszy niż opcja 1, ale wolniejszy niż opcja 3.
    • Działa dobrze, jeśli formatowanie treści zmienia się/jest zmienne, ale struktura dokumentu/układ nie.
    • Jeśli dane nie są uporządkowane według znaczników HTML, masz kłopoty.
    • Może być używany z opcją 1.
  3. parser generator (ANTLR, etc) - stworzyć gramatykę dla parsowania & analizowania strony.
    • Nie próbowałem to dlatego, że nie była odpowiednia dla moich (bałagan) Strony
    • Najbardziej odpowiednie, jeśli struktura HTML jest wysoce zorganizowany, bardzo stały, regularny, i nigdy się nie zmienia.
    • Użyj tego czy są łatwe do opisania wzorów w dokumencie, ale nie wiążą tagów HTML i obejmują rekursji lub złożonych zachowań
    • Nie wymaga wkładu XHTML
    • NAJSZYBCIEJ przepustowość, zazwyczaj
    • Big krzywa uczenia się, ale łatwiejsze do utrzymania

mam majstrował web harvest dla opcji 2, ale uważam, że ich składnia się trochę dziwne. Mieszanka XML i trochę języka skryptowego pseudo-Java. Jeśli lubisz Javę, i jak ekstrakcja danych w stylu XML (XPath, XQuery), które mogą być biletem dla ciebie.


Edit: jeśli używasz wyrażeń regularnych, upewnij się, że korzystać z biblioteki z leniwych kwantyfikatorów i grup przechwytywania! W starszych bibliotekach regex PHP brakuje ich i są one niezbędne do dopasowania danych między tagami open/close w HTML.

3

bez struktury stałe HTML analizować, nie chciałbym, aby utrzymać wyrażeń regularnych do znajdowania dane. Możesz mieć więcej szczęścia analizując kod HTML za pomocą odpowiedniego parsera, który buduje drzewo. Następnie wybierz elementy ... które byłyby łatwiejsze w utrzymaniu.

Oczywiście najlepszym sposobem jest wyjście XML z silnika ze stałym znacznikiem, który można analizować i sprawdzać. Wydaje mi się, że parsowanie biblioteki HTML z "ciemnymi" sondowaniami wytworzonego drzewa byłoby łatwiejsze do utrzymania niż wyrażeń regularnych.

W ten sposób wystarczy sprawdzić <a href="blah" class="cache_link">... zmieniając się w <a href="blah" class="cache_result">... lub cokolwiek innego.

Dolna linia, grepping konkretnych elementów z regexp byłaby ponura. Lepszym rozwiązaniem jest zbudowanie modelu DOM takiego jak strona i szukanie "zakotwiczeń" w danych znakowych w tagach.

Lub wyślij e-mail na adres na stronie z opisem interfejsu API XML ... możesz zostać zatrudniony!

+0

Wyrażenia regularne mogą być obsługiwane, jeśli zostaną wykonane prawidłowo. Niektóre smaki dopuszczają osadzone komentarze, które mogą pomóc LOT. Możesz także użyć grup przechwytywania i leniwych kwantyfikatorów, aby dopasować elementy strukturalne przed i po, i przechwycić dane (z leniwym kwantyfikatorem) pomiędzy. Zachowuje się podobnie do analizy DOM lub drzewa, ale nie wymaga czystego XML. – BobMcGee

1

Czy zapoznałeś się z biblioteką do obsługi html? Ruby ma całkiem niezłe. np. hpricot

Przy dobrej bibliotece można określić części strony za pomocą selektorów CSS lub xpath. Byłoby to o wiele bardziej solidne niż użycie wyrażeń regularnych.

Przykład z hpricot wiki:

doc = Hpricot(open("qwantz.html")) 
(doc/'div img[@src^="http://www.qwantz.com/comics/"]') 
    #=> Elements[...] 

Jestem pewien, że można znaleźć biblioteki, który robi podobne rzeczy w .NET lub Python, itd

3

nie mówisz co język jesteś za pomocą. W języku Java możesz używać TagSoup i XPath, aby zminimalizować ból. Jest to przykład od this blog (oczywiście XPath można uzyskać o wiele bardziej skomplikowane w miarę potrzeb dyktować):

URL url = new URL("http://example.com"); 
SAXBuilder builder = new SAXBuilder("org.ccil.cowan.tagsoup.Parser"); // build a JDOM tree from a SAX stream provided by tagsoup 
Document doc = builder.build(url); 
JDOMXPath titlePath = new JDOMXPath("/h:html/h:head/h:title"); 
titlePath.addNamespace("h","http://www.w3.org/1999/xhtml"); 
String title = ((Element)titlePath.selectSingleNode(doc)).getText(); 
System.out.println("Title is "+title); 

Polecam uzewnętrzniania wyrażenia XPath więc masz jakieś środki ochrony w przypadku zmiany lokacji.

Oto przykład XPath, którego zdecydowanie nie używam do screencrape tej witryny.Nie ma mowy, nie ja:

"//h:div[contains(@class,'question-summary')]/h:div[@class='summary']//h:h3" 
0

Jeśli można użyć czegoś podobnego Tag Soup, że byłoby to miejsce, aby rozpocząć. Wtedy możesz traktować stronę jak XML API, trochę.

Ma implementację Java i C++, może działać!

1

Niestety "skrobanie" jest najczęstszym rozwiązaniem, jak powiedziałeś, próbując parsować HTML ze stron internetowych. Możesz wykryć zmiany strukturalne na stronie i zgłosić ostrzeżenie, abyś mógł je naprawić, więc zmiana na ich końcu nie spowoduje zapisania danych. Dopóki sieć semantyczna nie stanie się rzeczywistością, jest to jedyny sposób na zagwarantowanie dużego zbioru danych.

Alternatywnie można trzymać się małych zestawów danych udostępnianych przez interfejsy API. Yahoo bardzo ciężko pracuje nad udostępnianiem danych do przeszukiwania poprzez API (zobacz YDN), myślę, że Amazon API otwiera wiele danych książkowych itp.

Nadzieję, że trochę pomaga!

EDIT: A jeśli używasz PHP polecam SimpleHTMLDOM

2

Nie wspomniano która technologia stos używasz. Jeśli jesteś parsowania HTML, chciałbym użyć parsowania Biblioteka:

Istnieją również usługi sieciowe, które robią dokładnie to, czego powtarzam - komercyjne i bezpłatne. Zgarniają witryny i oferują interfejsy do usług sieciowych.

Ogólny serwis internetowy oferujący skrobanie ekranu to Pipety Yahoo. previous stackoverflow question on that

2

Nie jest to niezawodne rozwiązanie, ale warto przyjrzeć się analizatorowi składni, np. Beautiful Soup Nie będzie on w stanie znaleźć tych samych informacji, jeśli układ ulegnie zmianie, ale jest o wiele łatwiejszy niż pisanie złożonych wyrażeń regularnych. Zauważ, że jest to moduł python.

1

Wypróbuj google do skrobania ekranu + preferowany język. Znam kilka opcji dla Pythona, można znaleźć odpowiednika preferowany język:

  • Beatiful Soup
  • Mechanize: podobne Perl WWW: Mechanize.Daje przeglądarkę podobnego obiektu ineract ze stron internetowych
  • lxml: Python wiązania się libwww
  • scrapemark: wykorzystuje szablony, aby zeskrobać kawałki stronach
  • pyquery: pozwala na wykonywanie zapytań jQuery w XML/dokumentów XHTML
  • scrapy: AN wysoki poziom skrobanie i indeksowania internetu ramy do pisania pająki indeksować i analizowania stron internetowych

w zależności od strony zeskrobać może trzeba zastosować jedną lub więcej z powyższych metod.

-2

Dość, zamierzam użyć metody zupy Tag jak zalecono.

Jako pytanie uzupełniające - jak to robią te duże witryny typu skrobak? Widziałem wyszukiwarkę ofert pracy (np. Indeed.com), która skanuje tysiące witryn! Czy to tysiące wyrażeń regularnych? To jest prawie niemożliwe ...

0

Pietruszka pod numerem http://www.parselets.com wygląda ładnie.

Pozwala zdefiniować "parslets" przy użyciu JSON, co definiujesz, czego szukać na stronie, a następnie analizuje te dane dla Ciebie.

+2

Co, linki nie trwają 6 lat? –

Powiązane problemy