Pobieranie danych ze strony internetowej w stabilny i wydajny sposób

11

Ostatnio dowiedziałem się, że użycie wyrażenia regularnego do parsowania kodu HTML strony internetowej w celu uzyskania potrzebnych danych nie jest najlepszym rozwiązaniem.

Więc moje pytanie jest proste: co zatem jest najlepszym / najbardziej wydajnym i ogólnie stabilnym sposobem na uzyskanie tych danych?

Powinienem zauważyć, że:

  • Brak interfejsów API
  • Nie ma innego źródła, z którego mogę uzyskać dane (brak baz danych, kanałów itp.)
  • Nie ma dostępu do plików źródłowych. (Dane z publicznych stron internetowych)
  • Powiedzmy, że dane to zwykły tekst wyświetlany w tabeli na stronie HTML

Obecnie używam Pythona do mojego projektu, ale fajne byłoby rozwiązanie / wskazówki niezależne od języka.

Jako pytanie poboczne: jak byś to zrobił, gdy strona internetowa jest zbudowana z wywołań Ajax?

EDYTOWAĆ:

W przypadku parsowania HTML wiem, że nie ma stabilnego sposobu na uzyskanie danych. Gdy tylko strona się zmieni, twój parser jest gotowy. W tym przypadku chodzi mi o stabilny: skuteczny sposób parsowania strony, który zawsze daje mi te same wyniki (oczywiście dla tego samego zestawu danych), pod warunkiem, że strona się nie zmienia.

Mikrofon
źródło
8
Nie ma stabilnego sposobu, bez względu na to, jak zaimplementujesz skrobanie, może łatwo zepsuć się po prostej zmianie strony internetowej. Stabilnym sposobem na uzyskanie danych jest skontaktowanie się z autorami danych i pośrednictwo w transakcji, aby uzyskać dane w rozsądnym formacie. Czasami to nawet nie kosztuje.
Joachim Sauer
1
@JachachSSauer - Na pytanie można nadal odpowiedzieć metodą „najlepszą”.
Anonimowy
Ponieważ większość stron internetowych jest dynamiczna i przechowuje swoje dane w bazach danych, najlepszym sposobem jest pobranie bazy danych ze strony internetowej. Jeśli witryna ma interfejs API, możesz go użyć. Jeśli chcesz zeskrobać strony statyczne, wbudowane moduły urllib i HTMLParser w Pythonie działają dobrze. Kilka pakietów do zgarniania HTML jest również dostępnych w PyPi.
Ubermensch
Skrobanie witryny to skąpy biznes. Naprawdę nie ma stabilnego sposobu, aby to zrobić, ponieważ właściciele witryn tego nie chcą, a cała branża próbuje powstrzymać ludzi przed zrobieniem tego.
Steven Evers
1
Może osadzić przeglądarkę internetową, taką jak Webkit, a następnie użyć skryptów DOM, aby uzyskać informacje z renderowanej strony? Prawie każda platforma może to zrobić, ale oto jak to zrobić w Qt: doc.qt.nokia.com/4.7-snapshot/qtwebkit-bridge.html
user16764

Odpowiedzi:

2

Cóż, oto moje 2 centy:

Jeśli nie jest zaangażowany AJAX lub można go łatwo usunąć, „napraw” HTML do XHTML (na przykład używając HTMLTidy), a następnie wyodrębnij informacje za pomocą XPath zamiast wyrażeń regularnych.
Na dobrze ustrukturyzowanej stronie internetowej, logicznie oddzielone byty informacji znajdują się w różnych <div>s lub dowolnym innym znaczniku, co oznacza, że ​​można łatwo znaleźć właściwe informacje za pomocą prostego wyrażenia XPath. Jest to również świetne, ponieważ można go przetestować, powiedzmy, w konsoli Chrome lub konsoli programisty Firefox i sprawdzić, czy działa przed napisaniem choćby jednego wiersza innego kodu.
Podejście to ma również bardzo wysoki stosunek sygnału do szumu, ponieważ zwykle wyrażenia mające na celu wybranie odpowiedniej informacji będą jednowierszowe. Są również o wiele łatwiejsze do odczytania niż wyrażenia regularne i zostały zaprojektowane do tego celu.

Jeśli na stronie jest zaangażowany AJAX i poważne JavaScript, należy osadzić komponent przeglądarki w aplikacji i użyć jej DOM do wyzwalania potrzebnych zdarzeń, a XPath do wyodrębnienia informacji. Istnieje wiele dobrych, możliwych do osadzenia komponentów przeglądarki, z których większość korzysta z prawdziwych przeglądarek pod maską, co jest dobre, ponieważ strona internetowa może być niepoprawna (X) HTML, ale nadal renderuje się dobrze na wszystkich głównych przeglądarkach ( właściwie większość stron w końcu dostaje się w ten sposób).

K.Steff
źródło
Dzięki, z pewnością przyjrzę się jeszcze trochę XPath. Nie jestem przyzwyczajony do pracy z tym, więc miło będzie się uczyć. +1 :)
Mike
5

Z mojego doświadczenia wynika, że ​​korzystając ze środowiska .NET możesz korzystać z pakietu HTML Agility Pack .

Jeśli strona jest sformatowana jako XHTML, możesz również użyć zwykłego analizatora składni XML. Jest wiele możliwości dla każdego środowiska, jakie możesz sobie wyobrazić.

W przypadku pytania dodatkowego dotyczącego AJAX można użyć zwykłego kodu sieciowego HTTP, aby uzyskać dane i je przeanalizować.

Ponownie, jeśli Twój stos AJAX zwraca XML, będziesz mieć wiele możliwości wyboru. Jeśli zwraca JSON, rozważ bibliotekę, która pozwala zmapować strumień na wpisane obiekty. W .NET sugeruję ci Newtonsoft.Json .

gsscoder
źródło
A przez „kod sieci HTTP” masz na myśli przechwytywanie odpowiedzi serwera, gdy żądanie zostanie wysłane? Dzięki za sugestie, z pewnością zajrzę do nich. +1
Mike
Dokładnie. W .NET możesz użyć System.Net.WebClient lub biblioteki takiej jak RestSharp | restsharp.org . Użyłem go również w Mono dla Droida.
gsscoder,
4

Analiza HTML nie jest całkowicie trywialnym zadaniem, ponieważ trzeba poradzić sobie z potencjalnie nieprawidłowym znacznikiem (zupa znaczników). Na przestrzeni lat przeglądarki wdrożyły mniej więcej tę samą strategię radzenia sobie z błędami, a ten algorytm został ochrzczony w specyfikacji HTML5 (tak, specyfikacja HTML5 określa, co zrobić z rzeczami, które nie są HTML5).

Są to biblioteki dla wszystkich głównych języków do analizowania HTML, na przykład tego .

W każdym razie to, co dostaniesz, nie jest stabilne w żadnym sensie. Za każdym razem, gdy zmienia się format strony, musisz dostosować swój skrobak.

Andrea
źródło
Dzięki, używałem Pięknej Zupy do wykonania pracy. Wiem, że to nie będzie stabilne, prawdopodobnie powinienem to wyjaśnić w moich pytaniach. +1 dla ciebie :)
Mike
4

Jako pytanie poboczne: jak byś to zrobił, gdy strona internetowa jest zbudowana z wywołań Ajax?

Jeśli wywoływane są aukcje ajax, to jest bardzo prawdopodobne, że jest to albo URL POST albo GET z pewnymi zmiennymi.

Sprawdziłbym JavaScript, aby dowiedzieć się, jakie są punkty końcowe i parametry. Po tym bardzo prawdopodobne jest, że zwrócone dane to json / xml / zwykły tekst lub być może częściowy HTML.

Po zapoznaniu się z powyższymi informacjami wystarczy wysłać żądanie GET lub POST do tego punktu końcowego i przeanalizować zwrócone dane.

Ciemna noc
źródło
2
Warto zauważyć, że wiele usług sprawdzić nagłówki HTTP w celu zapewnienia HTTP_X_REQUESTED_WITHjest XMLHttpRequest. Dobre wprowadzą także pewien rodzaj ochrony XSRF dla żądań POST, więc będziesz potrzebować również tego magicznego ciasteczka. Łaskotanie punktów końcowych AJAX, które nie zostały celowo ujawnione przez niektóre publiczne interfejsy API, jest dla mnie trochę obrzydliwe, a twój skrobak jest tak samo podatny na uszkodzenie, jeśli zmieni się wyjście (lub polityka żądań).
Tim Post
@ TimPost masz 100% poprawności. Zgadzam się, że to „chytry” rzeczywiście :), ale przy braku publicznego API musi być potrzebny ..
Darknight
Mógłbym użyć tego w mojej własnej aplikacji opartej na AJAX (i przez „własną” nie mam na myśli, że to napisałem, ale konfiguracja jest moja), ale nie byłoby dobrze próbować ominąć system innego serwera, więc muszę się zgodzić z @ TimPost, wydaje się to trochę „obrzydliwe”. To jednak dobry pomysł, dzięki! +1!
Mike
1

Nie ma stabilnego ani lepszego sposobu na to, strony internetowe HTML nie zostały zmanipulowane przez komputery. To jest dla użytkowników, ale jeśli musisz to zrobić, sugeruję, że użyje przeglądarki i trochę javascript. W swojej pracy brałem udział w projekcie, który wymaga wyodrębnienia niektórych informacji z witryny innej firmy. Aplikacja została opracowana jako rozszerzenie Chrome. Logika aplikacji jest zapisywana za pomocą javascript, który jest wstrzykiwany w witrynie po zakończeniu ładowania strony. Wyodrębnione dane są wysyłane do bazy danych przez serwer http. To nie jest najlepsze podejście, ale działa. Ps: Właściciel strony upoważnił nas do takich działań.

nohros
źródło
Wiem, że strony HTML nie powinny być analizowane przez komputery, ale czasami po prostu nie ma innej opcji. Ponadto używam publicznie dostępnych informacji do osobistego projektu, który w żaden sposób nie jest komercyjny, nie sądzę, że potrzebuję wyraźnej autoryzacji, prawda? Dzięki za wkład! +1 również dla ciebie;)
Mike
@MikeHeremans Aby dowiedzieć się, czy masz uprawnienia do otrzymywania informacji ze strony internetowej, przeczytaj ToS i robots.txt. Jeśli oboje nie odmawiają ci prawa do automatycznego usuwania informacji, prawdopodobnie w większości przypadków powinno być w porządku. Oczywiście, IANAL ...
K.Steff,
Jeśli chcesz zobaczyć kod wspomnianego projektu: code.google.com/p/acao-toolkit/source/browse/… . Sprawdź content_script.js, jest to kod wprowadzany na stronę.
nohros