Franta – Občasník malého ajťáka

Domény, Hosting, Cestování

Jak jsem zas crawloval internet

thin wild ants eating in forest

Po dlouhe dobe jsem se opet pustil do sveho crawlera. Preci jen jsem za posledni dobou docela postoupil jak v programovani v Go, tak i v praci s ElasticSearch (alespon myslim :D) tak i snad v chapani domen samotnych.

Tenhle clanek je vysledkem testu, ktery jsem udelal ted predchozi dva dny.


Testovani

Pro testovaci prostredi jsem mel pripraven server o konfiguraci:

  • AMD EPYC 7302P 16-Core Processor (32 vlaken s HT)
  • 256 GB RAM
  • 500 GB NVMe disk pro ES data

Pro crawlovani mam napsanou vlastni aplikaci v Go, ve ktere vyuzivam knihovnu http://go-colly.org ktera se mi uz v minulosti dobre osvedcila na zpracovavani HTML dokumentu a jejich crawlovani.

Co jsem se rozhodl sbirat ?

  • seznam odkazu (odkud / kam)
  • adresy obrazku pouzitych na webu
  • adresy externich JS pouzitych na webu
  • meta hlavicky z navstiveneho webu
  • title tag z navstiveneho webu
  • adresy RSS zdroju ktere se na webu nachazi (z link tagu jen)
  • chyby 4xx, 5xx, a „no such host“
  • redirecty 3xx

Co jsem z provozu zjistil ze neumim sbirat, nebo ze me trapi ?

  • weby generovane skrze jS – colly v tuto chvili nema zadny JS parser, tedy nacte adresu tak jak vraci HTM. Pokud je obsah generovany pres JS (napriklad firmy.cz) pak v takovym pripade se k obsahu nedostanu
  • src JS scriptu ktere jsou injectovane jinym JS – duvod je stejny jako v predchozim bode
  • obrazky nacteny pres CSS nebo JS, nebot ziskavam ciste src parametr tagu img
  • kvuli webum nepouzivajicim hezka URL musim akceptovat query parametry v adrese – jenze tak se casto generuje i duplicitni obsah, kde v nejhorsim pripade dochazi napriklad k situaci, ze na strance je kalendar, ktery v query ma parametr pro oznaceni dne – a prvek sam obsahuje pak odkazy dopredu/dozadu. V takovem pripade jsem pak schopny navstivit web nekonecne mnohokrat s pokazdy unikatni URL adresou 🙁

Pri crawlovani jsem musel take pristoupit k urcitym omezenim:

  • v hodinove periode dovoluji maximalne XX navstev jedne domeny
  • kazdou navstivenou domenu co me skonci chybou (timeout, refushed, atd..) davam na pul hodky na blacklist
  • protoze detailni vysledky nevyuzivam k vyhledavani, ignoruju robots.txt, nebot data slouzi pro vnitrni analytiku

Prvni vysledky

Crawler fungoval od nedelniho odpoledne az do uterniho dopoledne, tedy necelych 48 hodin. Pote jsem ho vypnul, nebot datovy disk pro ElasticSearch mel zabrano necelych 90% kapacity.

Z hrubych dat jsem nakonec vytahl tyto hodnoty:

  • Crawler navstivil 19.380.723 odkazů (schválně nepíšu stránek, kvuli problému s query viz výše)

Co typove z hledanych veci crawler nalezl ?

  • 754.833.186 – unikatnich odkazovych paru (z / na)
  • 323.014.862 – unikatnich odkazu
  • 79.410.714 – nalezenych obrazku
  • 20.131.066 – nactenych meta tagu
  • 10.881.407 – nalezenych externich JS scriptu
  • 9.220.607 – stranek s chybou
  • 4.923.198 – titulku stranek
  • 1.799.386 – externich presmerovani
  • 678.068 – RSS zdroju

A domenove:

  • Navstivenych 155.441 domen
  • Cilove odkazy jsou z 327.286 domen

TOP 5 TLD nalezenych odkazu:

  • com: 121.968
  • cz: 50.400
  • org: 32.908
  • co.za: 15.885
  • net: 12.786
  • de: 12.626
  • ru: 9.965
  • fr: 6.287
  • co.uk: 6.284
  • jp: 4.071

Asi zrejme zaujme, proc je na 4. miste domena co.za 🙂 Duvod je jednoduchy. Abych nejak rozlozil odkazy do skupin na domene nezavisle, a pri vyberu odkazu pro prochazeni mel vyssi sanci ze neziskam XX URL ze stejny domeny, vyuzivam v DB pro URL SHA hashe. A protoze jsem chtel vyzkouset crawlovani co me vykon dovoli, ale zaroven jsem nemel moznost pustit crawler pro vsechny prvni pismkenka hashe, pustil jsem to nasledne:

  • TLD: *, hash: 0*
  • TLD: *, hash: 7*
  • TLD: *, hash: a*
  • TLD: *, hash: f*
  • TLD: cz, hash: *
  • TLD: co.za, hash: *

Tedy posledni dve instance crawlera prochazeli domeny ne podle hashe, ale podle TLD. Diky tomu tyto dve domeny maji taky nejvice vysledku aktualne.


Obrazky

Odkud nejcasteji nacitame obrazky na webech ?

  • gravatar.com – 1.030 unikatnich domen
  • wp.com – 368 unikatnich domen
  • toplist.cz – 330 unikatnich domen
  • bp.blogspot.com – 283 unikatnich domen
  • googleusercontent.com – 264 unikatnich domen

A jake typy obrazku to vlastne byly ?

  • JPG: 26.908.229
  • PNG: 10.198.187
  • SVG: 6.189.649
  • WEBP: 46.130
  • BMP: 10.688

Chyby

Jak jsem zminil na zacatku, samostatne loguju chyby 4xx, 5xx a „no such host“. Posledni chyba znamena, ze dotycna domena/subdomena v dobe okamziku pristupu nefungovala na urovni DNS.

Zde je TOP 10 chyb:

  • 502 Bad Gateway – 941.237 adres na 307 domenach
  • 429 Too Many Requests  – 554.818 adres na 121 domenach (toto je jednoznacne moje chyba)
  • 503 Service Unavailable – 317.905 adres na 787 domenach
  • 403 Forbidden – 313.351 adres na 3.439 domenach
  • 404 Not Found – 104.770 adres na 19.467 domenach
  • 500 Internal Server Error – 95.046 adres na 1.708 domenach
  • 504 Gateway Timeout – 27.603 adres na 25 domenach
  • 0 (no such host) – 15.284 adres na 9.730 domenach
  • 430 Request Header Fields Too Large – 14.092 adres na 33 domenach

Chyba 429 je vic nez rikajici – musim lepe poresit omezeni dotazu na konkretni IP adresy webserveru aby me neblokovali. U chyb 502 a 504 je otazkou, nakolik problem vznikl stejnym zpusobem – tj prilis mnoho dotazu ze strany crawlera. Chyby 500 a 503 jsou dle me uz opravdu chybama na strane nefunkcnich webserveru. Chyby 403 a 404 jsou uplne jasne – bud jsem sel kam jsem nemel pristup, nebo stranka neexistovala 🙂 K chybe 430 dochazelo napriklad na webu clarkesbooks.co.za kde jsou v URL nazvy knih, ktere jsou nekdy extremne dlouhe – zrejme automaticky generovano z nejakyho eshopovyho reseni a je otazka jestli vubec majitele o tom vedi ze par tisic odkazu jim nefunguje.

Z hlediska domainingu je zajimavy samozrejme i pocet domen u kterych jsem dostal DNS chybu. Neznamena to, ze je 9.730 domen volnych, ale nefunkcnich. Podle TOP 5 TLD listu to vypada takto:

  • cz – 3.627 domen
  • com – 2.846 domen
  • org – 1.775 domen
  • co.za – 1.774 domen
  • eu – 511 domen
  • ru – 374 domen
  • net – 350 domen
  • nl – 301 domen
  • gov – 236 domen
  • de – 219 domen

Domeny .cz, .com, a co.za jsem i schvalne overil a uvidime kolik jich je realne volnych:

  • cz – 2.088 domen volnych
  • com – 527 domen volnych
  • co.za – 898 domen volnych

Domeny jsem projel i pres Similarweb 😀 K memu uzasu pres 350 domen ma nejaky data ze Similarwebu!!


Meta Tagy

Weby se nam, robotum a prohlizecum snazi rict spousta veci skrze meta tagy … jake jsou nejpouzivanejsi meta tagy na strankach ktere jsem nacrawloval ?

  • viewport: 2.015.766
  • description: 1.695.941
  • DC.relation: 1.131.429
  • robots: 964.228
  • keywords: 717.973
  • theme-color: 605.936
  • google-site-verification: 605.537
  • referrer: 591.001
  • twitter:card: 580.961
  • twitter:description: 427.140

Zajimava je i stats z meta tagu „generator“:

  • 96.023 – MediaWiki 1.37.0-wmf.19
  • 33.007 – WordPress 5.8
  • 32.771 – Drupal 7 (http://drupal.org)
  • 27.294 – Powered by WPBakery Page Builder – drag and drop page builder for WordPress.
  • 25.568 – WordPress 5.7.2
  • 11.132 – Government Site Builder
  • 9.127 – WordPress 5.3.6
  • 8.980 – Joomla! – Open Source Content Management
  • 8.560 – WordPress 3.7.7
  • 7.583 – WordPress 3.9.8″

Scripty

Jake nejcastejsi scripty se volaji z externich zdroju ? Tento prehled je trochu zkresleny tim kde se crawler potuloval. Na druhou stranu je ale zase pravda, ze napriklad Shopify ma miliony eshopu na svych domenach, ktere volaji scripty prave z shopify … nu coz:

  • 2.112.580 – shopify.com
  • 493.090 – akamaized.net
  • 457.406 – tacdn.com
  • 430.601 – classistatic.com
  • 419.885 – ajax.googleapis.com
  • 365.249 – vivantis.net
  • 355.355 – cloudflare.com
  • 345.905 – googletagmanager.com
  • 330.943 – google.com
  • 295.513 – st-hatena.com

Uprimne jsem cekal vyrazne vetsi zastoupeni ruznych pocitadel a JS knihoven/sluzeb …

Nicmene statistiky nikoliv podle poctu stranek, ale poctu unikatnich domen vypadaji uz trochu jinak:

  • 4.970 – googletagmanager.com
  • 4.495 – google.com
  • 2.699 – ajax.googleapis.com
  • 2.049 – cloudflare.com
  • 1.942 – googlesyndication.com
  • 1.270 – jquery.com
  • 1.134 – twitter.com
  • 1.078 – maps.googleapis.com
  • 937 – imedia.cz
  • 918 – addthis.com

Celkove bylo volano 10.881.407 scriptu z 4.173 unikatnich domen – z toho dokonce 12 domen volnych


Zaver

Na zaver musim dodat, ze jsem z vysledku celkem spokojeny. Za necelych 48 hodin ziskat takovou hromadu dat se kterou se da hrat, analyzovat a trebas i neco najit k monetizaci.

Co vim ze musim do dalsi verze upravit:

  • Nastavit limit per IP serveru aby me hostingovky zbytecne neblokovali
  • Zkusit implementovat nejaky JS scrappery pro only-JS weby, a takove weby i umet detekovat
  • Zoptimalizovat trochu cely proces, protoze nejnarocnejsi byl defakto update „links“ v Elasticu, kde se pridavali nove, ale zaroven oznacovali ty ktere uz script navstivil, aby se pri dalsim vyberu nevybirali.
  • Pri navstivenych odkazech nacitat prve content-type, abych se nesnazil parsovat HTML na PDFku a tak 🙂
  • Mozna kdyz omezim pocet naraz zpracovavanych adres (10k) na nizsi pocet, tak sice budu crawlovat pomaleji, ale budu moc pustit zase instance pro vsechny prvni pismenka hashu, a tim rozlozit definitivne celou zatez
  • Pri vytahovani dat pro tenhle clanek jsem zjistil, ze nektere veci musim resit komplikovane pro spatny navrh indexu v Elastiku 🙂 Tak lepsi opravit ted, nez pak predelavat index o nekolika desitkach TB 😀
  • Mozna vubec by to chtelo promyslet lepe ty indexy v ES. Bohuzel se mi delo to, ze pri crawlovani se nedalo takmer z DB v rozumnym case cist, protoze delat agregace nad miliony zaznamu v situaci kdy jich tam dalsich desitky tisic leti neni uplne idealni. Pri dlouhodobym provozu crawlera je ale nutne mit data k dispozici okamzite.
  • Musim nejak lip promyslet jak resit ty Query parametry v URL. Opravdu nemohu odstrihnout weby co nepouzivaj hezke URL, ale zaroven nemuzu generovat miliony a miliony linku s dynamickymi odkazy ktere fakticky na webu nic nemeni. Bohuzel delat hash celeho webu nema smysl, protoze se muze menit nejaka kravinka co to cely rozbije … mozna generovat hash z „head“ a doufat, ze stranky maj ruzne title/meta. Tezko rict, ale na druhou stranu mam aktualne ruzny data ke studiu ze kterych muzu zjistit proc se to cyklilo.

Kazdopadne uz se chystam pomalu na „Test 2“. Zde zkusim analyzovat primarne jen .CZ a .CO.ZA domeny od kterych mam vicemene kompletni DB domen, a to tak, ze predvyplnim DB prave URL vsech domen – takze crawler defakto nebude mit potrebu hledat nove domeny, ale rovno projede vsechny a teprve na nich bude hledat provazanosti.

Zaujal Vas tento clanek ? Je neco co by Vas zajimalo z webu vic, co by mohlo byt zajimave crawlovat ? Napiste do komentaru a trebas priste budete prekvapeni 🙂

(2) Comments

Napsat komentář: Petr Zrušit odpověď na komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *

Tato stránka používá Akismet k omezení spamu. Podívejte se, jak vaše data z komentářů zpracováváme..