Javascript web scraping

Lep pozdrav vsem.

Naletel sem na problem, kjer želim v javascriptu z moduloma 'cheerio' in 'request' poscrapat source kodo neke spletne strani. Zadeva mi je celo uspela, ampak mi deluje samo v terminalu na lokalnem pc-ju, ne pa tudi, če isto kodo zalaufam z browserjem.

test.js (deluje):

var request = require('request');
var cheerio = require('cheerio');

console.log("bla1");

request('https://news.ycombinator.com', function (error, response, html) {

console.log(html);

});

test.html (ne deluje):

<html>
<head>
</head>
<body>
<script>

document.write("bla1");

var request = require('request');
var cheerio = require('cheerio');

document.write("bla2");

request('https://news.ycombinator.com', function (error, response, html) {

document.write(html);

});
</script>
</body>
</html>

(koda je identična, edino console.log funkcije so zamenjane z document.write, ker želim izpisovat v browserju, ne pa v terminalu)

Z navadnimi document.write("blabla") sem testiral, na kateri točki se zatakne, in ugotovil, da pri importanju knjižnic (tam kjer sta request in cheerio).

Zanima me:

  • Kako sploh pravilno importat knjižnice? V .js fajlu mi ista stvar gre, v .html pa ne.
  • So morda v browserju kakšne omejitve, ki mi preprečujejo scrapanje?
  • Sem ga kje drugje zeznil?

Mogoče se sliši butasto, ampak prvič imam opravka z Javascriptom in že da mi je preko terminala ratalo, sem zapravil cel dan.

Much appreciated!

7 odgovorov

Jaz osebno bi zadevo dal v head:

<script src="request.js"></script>
    <script src="cheerio.js"></script>

Meni se zdita dve stvari tuki problematični.
1. Node.js modul hočeš uporabiti na client sideu (v browserju).
2. Ter Cross-Browser AJAX Requests kar ima veliko strežnikov onemogočeno.

Ali sem kaj narobe razumel?

Ja, prav si razumel. Drugač pa to sem že ugotovil, da načeloma strežniki take requeste zavrnejo. Še vedno mi pa ne gre v glavo, kako je pol možno, da v terminalu stvar deluje?

Našel sem workaround, da si setupam svoj strežnik, na katerem mi php file fetchne source kodo neke druge strani, hkrati pa ima še allow tag za avtomatične poizvedbe. Potem pa pač preko posredništva mojega strežnika lahko poscrapam karkoli želim.

Mi je pa to taka butasta rešitev, ki zahteva svoj dedicated server, česar bi se vsaj zaenkrat rad izognil. Pa tudi sicer mi ni jasno, kako profesionalen scraperski softver rešuje ta problem? Je pa ful pomembno, da stvar nardim znotraj html-ja z javascriptom, če je to sploh možno.

Aja, sem probal dat v head. Še vedno mi ne deluje.

Strežnik - strežnik pogovor gre brez problema.Ti nisi uporabljal terminala za klic. Ampak strežnik node.js kateri je pognal skripto in poklical stran.

Sej html parsing knjižnice imaš v vseh jeziki. Torej če ti to dela php pol lahko še podatke dobiš ven iz scrapanega htmlja z phpjem.

Hmm, sicer ne vem, koliko procesorskih resourcov pobere obdelava podatkov, ampak želel bi tako stvar držati čim bolj na client-endu in čim manj na server-endu. Delam vbistvu eno iOS aplikacijo, ki bi scrapala podatke z ene strani, jih obdelala, nato pa prikazala grafe itd. In telefonskih resourcov je neomejeno (vsak uporabnik ima svoj telefon s svojim procesorjem), medtem ko server ti pa verjetno ob dosti requestih lahko tudi pade. Vsaj common sense mi tako pravi.

Hmm, tak da očitno bo res treba z AJAX-om retrievat preko posredniškega php fajla, če ni druge client-side rešitve. To sem sprobal, pa mi vsaj sigurno dela. API-jem se načeloma poskušam izogibat, ker si lastniki lahko vedno kaj zmislijo... ali ti skos omejujejo poizvedbe, ali ti na tak ali drugačen način probajo zakasirat itd. Če pa mi kdaj poizvedbe z neke domene zablokirajo, pa jih vedno lahko posplitam na druge oz. jih zamenjam.

Načeloma ne smeš kr podatkov zajemat s kr ene strani in jih prikazovat javno. V vsakem primeru rabiš dovoljenje.

Pravnega vidika me je tukaj rše najbolj strah. Sploh, ker v mojem primeru gre za komercialno aplikacijo.

Samo po drugi strani... kako pa potem razni keyword research tooli in SERP rank trackerji funkcionirajo? Imajo direkten dogovor z Googlom? Brad Callenov Niche finder, kot primer, ti recimo da na izbiro, ali želiš podatke z Googla črpat preko Firefoxa ali IE browserja. Če greš tovrstne podatke pridobivat po 'uradni' poti, boš to skoraj zagotovo počel preko API-jev, ne pa preko direktnega scrapanja. Dvomim, da oni imajo dovoljenje tudi zaradi tega, ker od googla dobiš temporary ip ban če preveč vneto researchaš (ki ga po želji zaobideš s proxyji.) Logično sklepam, da bi Google uporabnikom Niche finderja dodelil neke vrste exception, če bi imeli kako posebno dovoljenje.

Čeprav res, da ko malo berem po internetu, vidim, da se zadnja leta legalna strogost do web scrapanja precej zaostruje. Pa v TOS Ebay tud prepoveduje scraping. Bah, better safe than sorry.

Malo me matra, da bom zdaj moral dobit kar 2 approvala; enega od Appla, drugega od Ebaya. Fun times.