Odpowiedziałem na kilka pytań do wywiadu, a pytanie dotyczyło sposobu, w jaki zrobię skrobanie ekranu. Oznacza to, że wybieranie treści ze strony internetowej, zakładając, że nie masz lepiej zorganizowanego sposobu bezpośredniego wyszukiwania informacji (np. Usługi internetowej).Skrobanie ekranu: wyrażenia regularne lub wyrażenia XQuery?
Moim rozwiązaniem było użycie wyrażenia XQuery. Wyrażenie było dość długie, ponieważ zawartość, której potrzebowałem, była dość głęboka w hierarchii HTML. Musiałem przeszukać przodków w uczciwy sposób, zanim znalazłem element z atrybutem id
. Na przykład, zgarniania stronę Amazon.com o produkt Wymiary wygląda następująco:
//a[@id="productDetails"]
/following-sibling::table
//h2[contains(child::text(), "Product Details")]
/following-sibling::div
//li
/b[contains(child::text(), "Product Dimensions:")]
/following-sibling::text()
To dość nieprzyjemny wyraz, ale dlatego Amazon udostępnia API usług internetowych. W każdym razie to tylko jeden przykład. Pytanie nie dotyczyło Amazona, chodzi o skrobanie ekranu.
Wywiad nie spodobał się mojemu rozwiązaniu. Myślał, że jest delikatny, ponieważ zmiana projektu strony przez Amazon może wymagać przepisania wyrażenia XQuery. Debugowanie wyrażenia XQuery, które nie pasuje do niczego na stronie, na które zostało zastosowane, jest trudne.
Nie zgadzałem się z jego oświadczeniami, ale nie sądziłem, że jego rozwiązanie stanowi jakąkolwiek poprawę: pomyślał, że lepiej użyć wyrażenia regularnego i wyszukać treść i oznaczenia w pobliżu ciężaru przesyłki. Na przykład, przy użyciu Perl:
$html =~ m{<li>\s*<b>\s*Product Dimensions:\s*</b>\s*(.*?)</li>}s;
mój kontrargument, że to jest również podatne na Amazon zmieniając ich kod HTML. Mogą literować znaczniki HTML wielkimi literami (<LI>
) lub dodawać atrybuty CSS lub zmienić <b>
na <span>
lub zmienić etykietę "Wymiary produktu:" na "Wymiary:" lub wiele innych rodzajów zmian. Chodzi mi o to, że wyrażenia regularne nie rozwiązują słabości, które wywoływał w moim rozwiązaniu XQuery.
Ale dodatkowo wyrażenia regularne mogą znajdować fałszywe trafienia, chyba że dodasz wystarczająco kontekstu do wyrażenia. Może także przypadkowo dopasować zawartość, która znajduje się wewnątrz komentarza, lub ciąg znaków atrybutu lub sekcji CDATA.
Moje pytanie brzmi, jakiej technologii używasz do skrobania ekranu? Dlaczego wybrałeś to rozwiązanie? Czy jest jakiś ważny powód, aby go użyć? Lub nigdy nie używać drugiej? Czy istnieje trzeci wybór oprócz tych, które pokazałem powyżej?
PS: Załóżmy dla celów argumentu, że nie ma interfejsu API usług internetowych ani innego bardziej bezpośredniego sposobu zdobycia pożądanej treści.
Jest to główny powód uniknięcia skrobania w Internecie opartego na XML. Żaden procesor XML nie jest tak wyrozumiały jak przeglądarka. Strona musi tylko złamać jedną zasadę dobrego uformowania, aby całkowicie zrezygnować z XQuery. – harpo