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.
Odpowiedzi:
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).
źródło
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 .
źródło
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.
źródło
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.
źródło
HTTP_X_REQUESTED_WITH
jestXMLHttpRequest
. 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ń).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ń.
źródło