Students Save 30%! Learn & create with unlimited courses & creative assets Students Save 30%! Save Now
Advertisement
  1. Code
  2. Web Development
Code

Screen škrábání s Node.js

by
Difficulty:IntermediateLength:LongLanguages:

Czech (Čeština) translation by Jakub Dokoupil (you can also view the original English article)

Možné příčiny@* NodeJS jako webový server, ale věděli jste, že můžete také použít jej pro web škrábání? V tomto kurzu budeme přezkoumávat jak skřípání statické webové stránky - a ty otravné s dynamickým obsahem - s pomocí NodeJS a pár užitečné moduly NPM.



Něco o webu škrábání

Webové škrábání měla vždy negativní konotace na světě, vývoj webových aplikací - a k tomu dobrý důvod. V moderní rozvoj rozhraní API jsou k dispozici pro nejoblíbenější služby a by měl použít k načtení dat, spíše než škrábání. Inherentní problém s škrábání je, že se spoléhá na vizuální strukturu stránky je poškrábaný. Při každé změně tohoto HTML - bez ohledu na to, jak malá změna může být - zcela rozbije váš kód.

I přes tyto nedostatky je důležité se naučit trochu o webu škrábání a některé nástroje, které jsou k dispozici pro pomoc s tímto úkolem. Když web neodhalí, rozhraní API nebo jakékoliv syndikačního informačního kanálu (RSS/Atom, atd.), jedinou možností, kterou jsme vlevo s získat obsah... je škrábání.

Poznámka: Pokud prostřednictvím rozhraní API nebo krmivo nemůže získat informace, které požadujete, to je dobré znamení, že majitel nechce, aby se tyto informace přístupné. Existují však výjimky.


Proč používat NodeJS?

Shrnovače lze zapsat v libovolném jazyce, opravdu. Důvod, proč si užívám, pomocí uzlu je jeho asynchronní charakter, což znamená, že kód není blokován v libovolném bodě v procesu. Jsem docela obeznámen s JavaScript, tak to je bonus navíc. Konečně, tam jsou některé nové moduly, které byly napsány pro NodeJS, které usnadňuje vyškrábnout weby spolehlivě (dobře, tak spolehlivé, jak škrábání může dostat!). Pojďme začít!


Jednoduché, škrábání s YQL

Začněme s jednoduchý případ použití: statické webové stránky. Toto jsou standardní run-of-the-mill webové stránky. Pro tyto Yahoo! Query Language (YQL) měly dělat svou práci velmi dobře. Pro ty neobeznámený s YQL to je podobné SQL syntaxi, která slouží k práci s různými API v konzistentním způsobem.

YQL má některé skvělé tabulky usnadňující vývojářům vystoupit na stránce HTML. Ty, které chcete zvýraznit jsou:

Projdeme si každý z nich a zkontrolujte jejich implementace v NodeJS.

HTML tabulka

Tabulka html je základní způsob škrábání HTML z adresy URL. Běžný dotaz používající tato tabulka vypadá takto:

Tento dotaz obsahuje dva parametry: "url" a "xpath". Adresa url je samozřejmý. Výraz XPath je tvořen XPath řetězec říká YQL, jakou část HTML by měla být vrácena. Zkuste tento dotaz zde.

Další parametry, které lze použít patří prohlížeč (boolean), znaková sada (řetězec) a compat (řetězec). Jsem ještě musel použít tyto parametry, ale pokud máte specifické potřeby naleznete v dokumentaci.

Není pohodlné s XPath?

Bohužel XPath není velmi populární způsob procházení stromové struktury HTML. To může být obtížné číst a psát pro začátečníky.

Pojďme se podívat na další tabulku, která dělá totéž, ale umožňuje použít CSS místo

data.html.cssselect tabulka

Data.html.cssselect tabulka je můj preferovaný způsob škrábání HTML stránce. Funguje stejným způsobem jako tabulku html, ale umožňuje CSS namísto XPath. V praxi se tato tabulka převede CSS XPath pod kapotou a pak zavolá tabulky html, takže je to trochu pomalejší. Rozdíl by měl být zanedbatelné pro škrábání potřeb.

Vypadá to jako běžný dotaz používající tuto tabulku:

Jak můžete vidět, je mnohem čistší. Doporučuji že nejprve vyzkoušet tuto metodu když si snaží škrabat HTML pomocí YQL. Zkuste tento dotaz zde.

HtmlString – tabulka

Htmlstring tabulka je užitečná pro případy, kde se snaží vyškrábnout velký kus formátovaný text z webové stránky.

Použití této tabulky umožňuje načíst celý obsah HTML stránky v jediném řetězci, nikoli jako JSON, která je rozdělena na základě DOM struktury.

Například, pravidelné JSON odpověď, že škrábance <a>značka vypadá takto:</a>

Vidíte, jak jsou definovány atributy jako vlastnosti? Místo toho odpověď od htmlstring tabulky by měla vypadat takto:

Takže, proč by to použít? No z mých zkušeností, to přijde velké využití při pokusu o získání velké množství formátovaný text. Zvažte například následující úryvek:

S použitím tabulky htmlstring, jste schopni dostat tento HTML jako řetězec a použít regex k odstranění HTML značky, které ve vás zanechá pouze text. To je snazší úkol než iterace JSON, které bylo rozděleno na vlastnosti a podřízené objekty založené na struktuře DOM stránky.


Pomocí YQL NodeJS

Teď, když víme něco o některých tabulek, které jsou k dispozici v YQL, pojďme implementovat web škrabky pomocí YQL a NodeJS. Naštěstí to je opravdu jednoduché, díky uzel yql modul od Derek Gathright.

Můžeme nainstalovat modul pomocí npm:

Modul je velmi jednoduché, sestávající z pouze jednu metodu: YQL.exec() metoda. Je definována jako následující:

Můžeme ji použít jemnocit a voláním YQL.exec(). Například řekněme, že chceme dát titulky ze všech příspěvků na hlavní stránce Nettuts:

Skvělá věc, o YQL je její schopnost vašich dotazů a zjistěte, jaké JSON, dostanete zpět v reálném čase. Přejděte na konzole, zkuste tento dotaz, nebo klepnutím sem zobrazíte raw formátu JSON.

Parametry a httpOptions objekty jsou volitelné. Parametry mohou obsahovat vlastnosti, například env (ať už používáte specifické prostředí pro tabulky) a formát (xml nebo json). Všechny vlastnosti, které jsou předány do parametry jsou zakódována URI a připojena k řetězci dotazu. HttpOptions objekt je předán do hlavičky požadavku. Zde můžete určit, zda chcete povolit protokol SSL, například.

Soubor jazyka JavaScript, s názvem yqlServer.js, obsahuje minimální kód nutný škrábat pomocí YQL. Můžete spustit zadáním následujícího příkazu v terminálu:

Výjimky a další nástroje

YQL je mou preferovanou volbou pro škrábání obsah mimo statických webových stránek, protože je snadno čitelné a snadno použitelné. YQL se však nezdaří, pokud je na webu soubor robots.txt, který odepře odpověď na něj. V takovém případě můžete podívat na některé z níže uvedených nástrojů, nebo použít PhantomJS, který vám popíšeme v následující části.

Node.IO je užitečný nástroj uzel, který je speciálně navržen pro dat škrábání. Můžete vytvořit pracovní místa, které berou vstupní, jeho zpracování a vrátí nějaký výstup. Node.IO je dobře sledované na Github a má několik užitečných příkladů, které vám pomohou začít.

JSDOM je velmi oblíbený projekt, který implementuje W3C DOM v JavaScriptu. Pokud HTML, můžete vytvořit DOM, který můžete komunikovat s. Podívejte se na dokumentaci a zjistěte, jak můžete použít JSDOM a všechny JS knihovny (například jQuery) společně pro získání dat z webových stránek.


Škrábání stránky s dynamickým obsahem

Zatím podívali jsme se na některé nástroje, které nám mohou pomoci skřípání webové stránky se statickým obsahem. S YQL je poměrně snadné. Bohužel jsme se často zobrazí stránky, které mají obsah, který je načtena dynamicky s JavaScriptem. V těchto případech stránky je často prázdný zpočátku a pak obsah je přidán později. Jak se můžeme vypořádat s tímto problémem?

Příklad

Dovolte mi uvést příklad toho co mám na mysli; Nahrál jsem soubor HTML do své vlastní webové stránky, která připojí nějaký obsah, přes JavaScript, dvě sekundy po document.ready() funkce je volána. Můžete zkontrolovat na stránce zde. Zde je zdroj vypadá jako:

A teď Zkusme škrábání text uvnitř<div id="content">pomocí YQL.</div>

Určitě jste si všimli, že YQL vrátí hodnotu undefined, protože, když je načtena stránka,<div id="content">je prázdný.</div> Obsah nebyl dosud přidán. Můžete vyzkoušet dotaz sami zde.

Pojďme se podívat na to, jak se můžeme dostat tomuto problému!

Zadání PhantomJS

PhantomJS mohou načítat webové stránky a napodobují Webkit založené prohlížeče bez GUI.

Můj upřednostňovanou metodou pro škrábání informace z těchto stránek je použití PhantomJS. PhantomJS sama sebe popisuje jako "bezhlavé Webkit s JavaScript API. Zjednodušeně to znamená, že PhantomJS mohou načítat webové stránky a napodobují Webkit založené prohlížeče bez GUI. Jako vývojář můžeme volat na konkrétní metody, které PhantomJS poskytuje spuštění kódu na stránce. Vzhledem k tomu, se chová jako prohlížeč, spustit skripty na webové stránce stejně jako v pravidelných prohlížeči.

Chcete-li získat data off naši stránku, budeme používat PhantomJS-uzel, skvělý malý open-source projekt, který spojuje PhantomJS s NodeJS. Pod kapotou tento modul pracuje PhantomJS jako podřízený proces.

Instalace PhantomJS

Před instalací modulu PhantomJS-uzel NPM, je nutné nainstalovat PhantomJS. Instalace a budování PhantomJS může být trochu složité, ale.

Za prvé, vedoucí přes na PhantomJS.org a stáhnout příslušnou verzi pro váš operační systém. V mém případě to byl Mac OSX.

Po stažení rozbalte někam jako/Applications /. Dále budete chtít přidat do vaší cesty:

1.5.0 nahradíte staženou verzi PhantomJS. Upozorňujeme, že ne všechny systémy/usr/local/bin /. Některé systémy budou mít: / usr/bin /, / bin/či usr/X11/bin místo.

Pro uživatele Windows Podívejte se na krátký návod zde. Budete vědět, že jsi vše nastavíte když otevřete terminál a napište phantomjs, a nemusíte dostat nějaké chyby.

Pokud nepříjemné úpravy vaší cesty, Poznamenejte kde jste rozbalili PhantomJS a já vám ukážu další způsob, jak nastavíte ji v další části, i když doporučuji upravujete cestu.

Instalace PhantomJS uzel

Nastavení PhantomJS-uzel je mnohem jednodušší. Pokud máte NodeJS nainstalován, můžete nainstalovat přes npm:

Jestliže při instalaci PhantomJS, úpravy vaší cestu v předchozím kroku, můžete jít do fantom / adresář tažených npm a upravte tento řádek v phantom.js.

Změňte cestu k:

Jakmile je toto Hotovo, můžete ji otestovat spuštěním tohoto kódu:

Běží to na příkazovém řádku by měl vyvolat následující:

Pokud to máte, jste připraveny jít. Pokud tomu tak není, post komentář a budu se snažit vám pomoci!

Pomocí PhantomJS uzel

Aby bylo snazší pro vás, jsem součástí JS souboru, s názvem phantomServer.js v stažení, který využívá některé z PhantomJS' rozhraní API k načtení webové stránky. Čeká na 5 sekund před provedením JavaScript, že škrábance na stránku. Můžete spustit navigaci do adresáře a zadáním následujícího příkazu v terminálu:

Já dám přehled jak to zde funguje. Za prvé požadujeme PhantomJS:

Dále realizujeme některé metody z rozhraní API. Jmenovitě vytvořit instanci stránky a potom voláním metody open():

Jakmile je stránka otevřena, vstřikujeme některé JavaScript do stránky. Pojďme založit jQuery přes page.injectJs() Metoda:

jQuery je nyní zaveden, ale my nevíme, zda se dosud načten dynamický obsah na stránce. K účtu pro toto, většinou dávám škrábání kód uvnitř funkce setTimeout(), která spustí po určitý časový interval. Pokud chcete více dynamické řešení, PhantomJS API umožňuje poslouchat a napodobovat určité události. Pojďme s jednoduchý případ:

Dát to všechno dohromady, naše phantomServer.js soubor vypadá takto:

Tato implementace je poněkud hrubý a nepřehledné, ale to dělá bod. Pomocí PhantomJS, jsme schopni vyškrábnout stránku, která má dynamický obsah! Konzole by výstup následující:


Závěr

V tomto tutoriálu jsme přezkoumána dvěma různými způsoby pro provádění webové škrábání. Pokud škrábání z statické webové stránky, můžeme využít YQL, které lze snadno nastavit a používat. Na druhé straně pro dynamické stránky, můžeme využít PhantomJS. To je o něco těžší nastavit, ale poskytuje další funkce. Pamatujte: můžete použít PhantomJS pro statické stránky příliš!

Pokud máte nějaké dotazy na toto téma, obrázky níže a já budu dělat moje nejlepší aby vám pomohli.

Advertisement
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.