Jaki jest najlepszy sposób pobierania danych ze strony internetowej? [Zamknięte]

107

Muszę wyodrębnić zawartość ze strony internetowej, ale aplikacja nie zapewnia żadnego interfejsu programowania aplikacji ani innego mechanizmu umożliwiającego programowy dostęp do tych danych.

Znalazłem przydatne narzędzie innej firmy o nazwie Import.io, które zapewnia funkcję `` kliknij i idź '' do skrobania stron internetowych i tworzenia zestawów danych, jedyne, co chcę, to zachować moje dane lokalnie i nie chcę subskrybować żadnych planów subskrypcji .

Jakiego rodzaju techniki używa ta firma do zgarniania stron internetowych i tworzenia ich zbiorów danych? Znalazłem pewne frameworki do skrobania stron internetowych, pjscrape & Scrapy, czy mogłyby zapewnić taką funkcję

0x1ad2
źródło
4
PHP z pewnością nie jest wykluczone, to oczywiście błąd. gist.github.com/krakjoe/b1526fcc828621e840cb
Joe Watkins
@JoeWatkins, który wygląda naprawdę fajnie, czy do działania wymaga specjalnej konfiguracji PHP? A jak wygląda wydajność w porównaniu z narzędziami / językami podanymi poniżej?
0x1ad2
1
Wymaga bezpiecznej wątkowo kompilacji PHP i pthreads, przeczytaj github.com/krakjoe/pthreads/blob/master/README.md , możesz mnie znaleźć na czacie, jeśli chcesz pomóc, ja lub ktokolwiek inny :)
Joe Watkins
@ 0x1ad2 Jeśli chcesz przechowywać dane lokalnie, powinieneś wypróbować oprogramowanie ( datascraping.co ) zamiast Web API. Większość narzędzi wykorzystuje Xpath, selektor CSS i REGEX do wyodrębniania danych ze stron internetowych, a Data Scraping Studio obsługuje wszystkie te 3 funkcje.
Vikash Rathee
Istnieją dwa sposoby, jeden to wdrożenie własnego przy użyciu bibliotek bezpłatnych / open source, co wymaga dużo wysiłku. Możesz dosłownie wygenerować robota sieciowego Ajax dla dowolnej witryny za pomocą scrape.it Jest to płatne narzędzie, ale działało, gdy żadne z bezpłatnych narzędzi, takich jak import.io lub kimono, nie mogło renderować.
I Love Python

Odpowiedzi:

271

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.

Jesse Sherlock
źródło
4
Kiedyś zgadzałem się z tobą, że PHP jest złym wyborem, ale przy odpowiednich bibliotekach nie jest tak źle. Manipulacja regeksami i tablicami / żądłami jest niezręczna, ale z drugiej strony jest szybka i wszędzie.
pguardiario
3
W środowisku, w którym jest kilka bibliotek, które sprawiają, że jest to przyjemnością, i wiele, które sprawiają, że jest to całkiem proste i całkiem łatwe… dlaczego miałbyś zadowolić się „nieźle”. Zgadzam się, jest to wykonalne w PHP (i FORTRAN, C, VB itp.), Ale jeśli twój problem nie jest naprawdę prosty, o wiele lepszym pomysłem byłoby użycie odpowiednich narzędzi do pracy. I znowu, jeśli nie masz niewiarygodnie prostego problemu do rozwiązania ... jakie to ma znaczenie, że wyrażenie regularne jest wszędzie? Instalowanie bibliotek jest znacznie prostsze niż prawie każdy problem związany ze skrobaniem. W rzeczywistości wyrażenie regularne jest często dość powolne w przypadku tego problemu.
Jesse Sherlock,
5
Możesz mieć rację, ale wiem na pewno, że nie mogę tego zrobić tak łatwo w PHP. Zanim odszedłem od PHP, miałem blisko dekadę doświadczenia zawodowego w PHP. Spędziłem ponad rok na pełnym etacie, budując system do skrobania na dużą skalę, w Pythonie i nie wyobrażam sobie radzenia sobie bez niektórych fajnych bibliotek, które nie są dostępne w PHP lub bez zwięzłych technik metaprogramowania dostępnych w Pythonie . Z tego powodu przeniosłem się do Clojure, aby uzyskać jeszcze potężniejsze umiejętności metaprogramowania.
Jesse Sherlock
4
Enlive, wraz z mocą samego Clojure dla kodu konkretnego projektu, są największymi zwycięzcami. Schemat to świetna biblioteka walidacyjna, która jest tak dużą częścią kodu wyodrębniania informacji. Obecnie jestem bardzo zadowolony z łatwego współdziałania ze światem Java dla rzeczy takich jak Mahout, a także Nashorn / Rhino dla niektórych rodzajów wykonywania js. A ludzie Clojure są typami, którzy piszą biblioteki takie jak ten github.com/shriphani/subotai, więc nie musisz. ... ciąg dalszy w następnym komentarzu ...
Jesse Sherlock
3
Odkryłem również, że kiedy naprawdę potrzebujesz prawdziwej przeglądarki i musisz korzystać z phantomjs / casperjs, naprawdę świetnie jest użyć clojurescript (często kod współdzielony między clj i cljs za pomocą cljx) do napisania js, które wstrzykujesz na stronę zamiast clojurescript . Core.async doskonale nadaje się do koordynowania wysoce współbieżnego kodu indeksującego na serwerze, a także do wychodzenia z piekła zwrotnego w środowisku js (koordynowanie automatyzacji przeglądarki z kodem core.async cljs wewnątrz phantomjs to raj w porównaniu z alternatywami).
Jesse Sherlock
21

Tak, możesz to zrobić sam. Wystarczy pobrać źródła strony i przeanalizować je tak, jak chcesz.

Istnieje wiele możliwości. Dobre połączenie wykorzystuje żądania Pythona (zbudowane na bazie urllib2, jest urllib.requestw Python3) i BeautifulSoup4 , które ma swoje metody wybierania elementów, a także pozwala na selektory CSS :

import requests
from BeautifulSoup4 import BeautifulSoup as bs
request = requests.get("http://foo.bar")
soup = bs(request.text) 
some_elements = soup.find_all("div", class_="myCssClass")

Niektórzy wolą parsowanie xpath lub pyquery w stylu jquery, lxml lub coś innego .

Kiedy żądane dane są tworzone przez jakiś JavaScript , powyższe nie będzie działać. Potrzebujesz ducha Pythona lub Selenu. Wolę to drugie w połączeniu z PhantomJS , dużo lżejszym i prostszym w instalacji oraz łatwym w użyciu:

from selenium import webdriver
client = webdriver.PhantomJS()
client.get("http://foo")
soup = bs(client.page_source)

Radziłbym rozpocząć własne rozwiązanie. Zrozumiesz korzyści jakie daje Scrapy.

ps: spójrz na scrapely: https://github.com/scrapy/scrapely

pps: spójrz na Portię, aby zacząć wyodrębniać informacje wizualnie, bez znajomości programowania: https://github.com/scrapinghub/portia

Ehvince
źródło
W porządku, dzięki za odpowiedź, jedynym problemem jest to, że Python nie jest w moich umiejętnościach. Czy istnieją inne dobre języki programowania, które mogą wykonywać te same zadania? Pracuję głównie z PHP i Javascriptem.
0x1ad2
Przepraszam za zamieszanie (wspomniałem o frameworku Pythona w moim pytaniu), ale jeśli Python jest najlepszym sposobem na zrobienie tego, to mogę się tego nauczyć.
0x1ad2
Python sprawia, że ​​scrapy są bardzo łatwe. Jest również łatwy do nauczenia. Najlepszym skrobakiem, który w tej chwili dobrze się sprawdza, jest skrobak. Mają też bardzo dobrą dokumentację.
Abhishek,