Na pewno będziesz chciał zacząć od dobrego frameworka do skrobania sieci. Później możesz zdecydować, że są one zbyt ograniczające i możesz złożyć własny stos bibliotek, ale bez dużego doświadczenia w skrobaniu Twój projekt będzie znacznie gorszy niż pjscrape lub scrapy.
Uwaga: Używam tutaj terminów indeksowanie i skrobanie zasadniczo zamiennie. To jest kopia mojej odpowiedzi na twoje pytanie z Quory, jest dość długa.
Przybory
Zapoznaj się z narzędziami programistycznymi Firebug lub Chrome w zależności od preferowanej przeglądarki. Będzie to absolutnie konieczne podczas przeglądania witryny, z której pobierasz dane, i mapowania, które adresy URL zawierają dane, których szukasz, i jakie formaty danych składają się na odpowiedzi.
Będziesz potrzebował dobrej praktycznej wiedzy na temat HTTP i HTML i prawdopodobnie będziesz chciał znaleźć porządnego człowieka w oprogramowaniu pośredniego proxy. Będziesz musiał być w stanie sprawdzić żądania i odpowiedzi HTTP oraz zrozumieć, w jaki sposób przekazywane są pliki cookie i informacje o sesji oraz parametry zapytań. Popularnymi narzędziami są Fiddler ( http://www.telerik.com/fiddler ) i Charles Proxy ( http://www.charlesproxy.com/ ). Często używam mitmproxy ( http://mitmproxy.org/ ), ponieważ jestem bardziej typem klawiatury niż myszy.
Nieocenione będzie środowisko typu konsola / powłoka / REPL, w którym można wypróbować różne fragmenty kodu z natychmiastową informacją zwrotną. Takie zadania inżynierii odwrotnej to wiele prób i błędów, więc potrzebujesz przepływu pracy, który to ułatwi.
Język
PHP jest w zasadzie wyłączony, nie nadaje się do tego zadania, a obsługa bibliotek / frameworków jest słaba w tym obszarze. Python (Scrapy to świetny punkt wyjścia) i Clojure / Clojurescript (niesamowicie potężny i produktywny, ale duża krzywa uczenia się) to świetne języki do rozwiązania tego problemu. Ponieważ wolisz nie uczyć się nowego języka i znasz już Javascript, zdecydowanie sugerowałbym pozostanie przy JS. Nie używałem pjscrape, ale wygląda całkiem nieźle z szybkiego czytania ich dokumentów. Jest dobrze dopasowany i wdraża doskonałe rozwiązanie problemu, który opisuję poniżej.
Uwaga na temat wyrażeń regularnych: NIE UŻYWAJ WYRAŻEŃ REGULARNYCH DO PARZYSTANIA HTML. Wielu początkujących robi to, ponieważ znają już wyrażenia regularne. To ogromny błąd, używaj selektorów xpath lub css do nawigacji po html i używaj tylko wyrażeń regularnych do wyodrębniania danych z rzeczywistego tekstu w węźle html. To może być już dla Ciebie oczywiste, szybko stanie się oczywiste, jeśli spróbujesz, ale wiele osób z jakiegoś powodu marnuje dużo czasu na tę drogę. Nie bój się selektorów xpath lub css, są one DUŻO łatwiejsze do nauczenia niż wyrażenia regularne i zostały zaprojektowane, aby rozwiązać dokładnie ten problem.
Witryny z dużą liczbą skryptów JavaScript
W dawnych czasach wystarczyło wysłać żądanie http i przeanalizować odpowiedź HTML. Teraz prawie na pewno będziesz musiał radzić sobie z witrynami, które są połączeniem standardowych żądań / odpowiedzi HTTP w formacie HTML i asynchronicznych wywołań HTTP wykonywanych przez część javascript witryny docelowej. W tym miejscu bardzo przydatne jest oprogramowanie proxy i karta sieciowa firebug / devtools. Odpowiedzi na te pliki mogą być w formacie HTML lub JSON, w rzadkich przypadkach będą to pliki XML lub coś innego.
Istnieją dwa podejścia do tego problemu:
Podejście niskopoziomowe:
Możesz dowiedzieć się, jakie adresy URL w AJAX wywołuje witryna javascript i jak wyglądają te odpowiedzi, i samodzielnie wykonać te same żądania. Możesz więc pobrać kod HTML z http://example.com/foobar i wyodrębnić jedną część danych, a następnie pobrać odpowiedź json z http://example.com/api/baz?foo=b ... do uzyskać drugą część danych. Musisz być świadomy przekazywania prawidłowych plików cookie lub parametrów sesji. Jest to bardzo rzadkie, ale czasami niektóre parametry wymagane dla wywołania Ajax będą wynikiem szalonych obliczeń wykonanych w javascript witryny, inżynieria wsteczna może być denerwująca.
Podejście wbudowanej przeglądarki:
Dlaczego musisz dowiedzieć się, jakie dane są w html i jakie dane pochodzą z wywołania Ajax? Zarządzasz wszystkimi danymi sesji i plików cookie? Nie musisz tego robić, gdy przeglądasz witrynę, przeglądarka i witryna javascript to robią. O to chodzi.
Jeśli po prostu załadujesz stronę do bezgłowego silnika przeglądarki, takiego jak phantomjs, załaduje stronę, uruchomi javascript i poinformuje Cię, kiedy wszystkie wywołania Ajax zostały zakończone. W razie potrzeby możesz wstawić własny skrypt javascript, aby wywołać odpowiednie kliknięcia lub cokolwiek jest konieczne, aby JavaScript w witrynie załadował odpowiednie dane.
Masz teraz dwie opcje: wypluj gotowy kod HTML i przeanalizuj go lub wstrzyknij trochę javascript do strony, która wykonuje parsowanie i formatowanie danych oraz wypluwa dane (prawdopodobnie w formacie json). Możesz również dowolnie łączyć te dwie opcje.
Które podejście jest najlepsze?
To zależy, na pewno będziesz musiał być zaznajomiony i komfortowy z podejściem niskiego poziomu. Podejście wbudowanej przeglądarki działa w każdym przypadku, będzie znacznie łatwiejsze do wdrożenia i sprawi, że niektóre z najtrudniejszych problemów ze skrobaniem znikną. Jest to również dość skomplikowana maszyna, którą musisz zrozumieć. To nie tylko żądania i odpowiedzi HTTP, to żądania, wbudowane renderowanie przeglądarki, JavaScript witryny, wstrzyknięty javascript, Twój własny kod i dwukierunkowa interakcja z osadzonym procesem przeglądarki.
Wbudowana przeglądarka jest również znacznie wolniejsza w skali ze względu na obciążenie renderowania, ale prawie na pewno nie będzie to miało znaczenia, chyba że zeskrobujesz wiele różnych domen. Twoja potrzeba ograniczenia szybkości żądań sprawi, że czas renderowania będzie całkowicie znikomy w przypadku pojedynczej domeny.
Ograniczanie szybkości / zachowanie botów
Musisz być tego bardzo świadomy. Musisz wysyłać żądania do domen docelowych po rozsądnej cenie. Musisz napisać dobrze zachowującego się bota podczas indeksowania stron internetowych, a to oznacza przestrzeganie pliku robots.txt i nie wbijanie serwera żądaniami. Błędy lub zaniedbania są tutaj bardzo nieetyczne, ponieważ można to uznać za atak typu „odmowa usługi”. Akceptowalna stawka różni się w zależności od tego, kogo pytasz, 1req / s to maksimum, na którym działa robot Google, ale nie jesteś Google i prawdopodobnie nie jesteś tak mile widziany jak Google. Utrzymuj to tak wolno, jak rozsądnie. Sugerowałbym 2-5 sekund między każdym żądaniem strony.
Zidentyfikuj swoje żądania za pomocą ciągu agenta użytkownika, który identyfikuje twojego bota i przygotuj stronę internetową dla bota wyjaśniającą jego cel. Ten adres URL znajduje się w ciągu agenta.
Łatwo będzie Cię zablokować, jeśli witryna będzie chciała Cię zablokować. Inteligentny inżynier na ich końcu może łatwo zidentyfikować boty, a kilka minut pracy nad ich końcem może spowodować tygodnie pracy nad zmianą kodu skrobania po twojej stronie lub po prostu uniemożliwić. Jeśli relacja jest antagonistyczna, inteligentny inżynier w miejscu docelowym może całkowicie przeszkodzić genialnemu inżynierowi w napisaniu robota. Skrobanie kodu jest z natury kruche i można to łatwo wykorzystać. Coś, co sprowokowałoby tę reakcję, i tak jest prawie na pewno nieetyczne, więc napisz dobrze zachowującego się bota i nie przejmuj się tym.
Testowanie
Nie jesteś osobą testującą jednostkę / integrację? Szkoda. Będziesz teraz musiał zostać jednym. Witryny często się zmieniają, a kod będzie często zmieniany. To duża część wyzwania.
Skrobanie nowoczesnej strony internetowej wymaga wielu ruchomych części, dobre praktyki testowe bardzo pomogą. Wiele błędów, które napotkasz podczas pisania tego typu kodu, będzie typem, który po cichu zwraca uszkodzone dane. Bez dobrych testów sprawdzających regresje dowiesz się, że przez jakiś czas zapisywałeś w swojej bazie bezużyteczne uszkodzone dane, nie zauważając tego. Dzięki temu projektowi będziesz bardzo dobrze zaznajomiony z walidacją danych (znajdź dobre biblioteki do użycia) i testowaniem. Nie ma wielu innych problemów, które wymagają kompleksowych testów i są bardzo trudne do przetestowania.
Druga część testów obejmuje buforowanie i wykrywanie zmian. Podczas pisania kodu nie chcesz w kółko wbijać serwera dla tej samej strony bez powodu. Podczas przeprowadzania testów jednostkowych chcesz wiedzieć, czy testy kończą się niepowodzeniem, ponieważ zepsułeś kod lub przeprojektowano witrynę. Uruchom testy jednostkowe na kopii adresów URL w pamięci podręcznej. Buforujący serwer proxy jest tutaj bardzo przydatny, ale trudny do skonfigurowania i prawidłowego użycia.
Chcesz również wiedzieć, czy witryna się zmieniła. Jeśli przeprojektowali witrynę, a twój robot jest uszkodzony, testy jednostkowe będą nadal działać, ponieważ działają na kopii z pamięci podręcznej! Będziesz potrzebować albo innego, mniejszego zestawu testów integracyjnych, które są rzadko uruchamiane w działającej witrynie, albo dobrego rejestrowania i wykrywania błędów w kodzie indeksowania, który rejestruje dokładne problemy, ostrzega o problemie i zatrzymuje indeksowanie. Teraz możesz zaktualizować pamięć podręczną, uruchomić testy jednostkowe i zobaczyć, co musisz zmienić.
Zagadnienia prawne
Prawo tutaj może być nieco niebezpieczne, jeśli robisz głupie rzeczy. Jeśli w grę wchodzi prawo, masz do czynienia z ludźmi, którzy regularnie nazywają wget i curl „narzędziami hakerskimi”. Nie chcesz tego.
Etyczna rzeczywistość tej sytuacji jest taka, że nie ma różnicy między używaniem oprogramowania przeglądarki do żądania adresu URL i przeglądania niektórych danych a używaniem własnego oprogramowania do żądania adresu URL i przeglądania niektórych danych. Google jest największą firmą zajmującą się skrobaniem na świecie i jest za to kochana. Zidentyfikowanie nazwy botów w kliencie użytkownika i otwartość na cele i zamiary robota internetowego pomoże tutaj, ponieważ prawo rozumie, czym jest Google. Jeśli robisz coś podejrzanego, np. Tworzysz fałszywe konta użytkowników lub uzyskujesz dostęp do obszarów witryny, których nie powinieneś („blokować” w pliku robots.txt lub z powodu jakiegoś rodzaju exploita autoryzacyjnego), pamiętaj, że robisz coś nieetycznego a nieznajomość technologii przez prawo będzie tutaj niezwykle niebezpieczna. To niedorzeczna sytuacja, ale prawdziwa.
Dosłownie można spróbować zbudować nową wyszukiwarkę na coraz wyższym poziomie jako uczciwy obywatel, popełnić błąd lub mieć błąd w oprogramowaniu i być postrzeganym jako haker. Nie jest to coś, czego chcesz, biorąc pod uwagę obecną rzeczywistość polityczną.
Kim w ogóle jestem, żeby pisać tę wielką ścianę tekstu?
Napisałem w życiu wiele kodu związanego z indeksowaniem sieci. Od ponad dziesięciu lat zajmuję się tworzeniem oprogramowania związanego z siecią WWW jako konsultant, pracownik i założyciel startupów. Wczesne dni to pisanie robotów indeksujących / skrobaków perlowych i stron php. Kiedy osadzaliśmy ukryte elementy iframe ładujące dane csv na stronach internetowych, aby wykonać ajax, zanim Jesse James Garrett nazwał go ajax, zanim XMLHTTPRequest był pomysłem. Przed jQuery, przed json. Jestem w połowie trzydziestki, to najwyraźniej uważane za starożytne w tej branży.
Dwa razy napisałem systemy indeksowania / skrobania na dużą skalę, raz dla dużego zespołu w firmie medialnej (w Perlu), a ostatnio dla małego zespołu jako CTO startującego w wyszukiwarce (w Pythonie / Javascript). Obecnie pracuję jako konsultant, głównie kodując w Clojure / Clojurescript (ogólnie wspaniały język ekspercki i mam biblioteki, które sprawiają, że problemy z robotami / skrobakami są przyjemnością)
Napisałem również skuteczne oprogramowanie anty-crawlingowe. Jeśli chcesz zidentyfikować i sabotować boty, których nie lubisz, niezwykle łatwo jest pisać prawie niemożliwe do pobrania witryny.
Lubię pisać crawlery, skrobaki i parsery bardziej niż jakikolwiek inny rodzaj oprogramowania. To wyzwanie, zabawa i można go wykorzystać do tworzenia niesamowitych rzeczy.