Ti-a trecut vre-o data prin cap sa faci asa ceva? Ti se pare interesanta ideea? Nu-i greu deloc. Ideea e simpla, scrii un program/script care partseaza continutul unui site si extrage continutul acestuia (doar ce te intereseaza). In functie de continut, poti alege sa vizitezi anumite link-uri. Toata aceasta informatie este apoi pusa intr-o forma usor accesibila (un XML sau baza de date).
Exista cateva alegeri pe care va trebui sa le faci inainte:
- Ce limbaj foloses? Cam orice iti convine de la C, C++, Java la limbaje de scripting gen Perl, Pythom, Ruby, etc. Cam toate au mai multe implementari de parsere HTML si XML. Eu am ales Python, pentru ca imi este foarte comod si este rapid de implementat.
- Ce parser folosesc? Aici conteaza ce tip de site vrei sa parsezi. Sa zicem ca dorim sa extragem informatiile dintr-un blog de pe blogger.com. Asta inseamna ca avem XHTML. Buun, simplu, folosim un parser de XML! Sau nu... Exista o mica problema aici, legata de corectitudinea XML-ului. La o validare a XML-ului, vom primi un raspuns negativ. Ce e de facut? Pai, cel mai simplu, facem un pas inapoi in istorie si ne amintim de SGML, tatal XML-ului si HTML-ului. Acum avem un grad mai mare de flexibilite si putem folosi scheme malformate, ceea ce si cautam. Nu am specificat tehnologia de parsare XML, SAX sau DOM. Ei bine, SAX este mai potrivit scopului, deoarece este mai rapid si nu avem nevoie de toate informatiile din pagina.
- Cat de mult vreau sa parsez, care este volumul de date cu care se va lucra si viteza dorita? In functie de acestea vom obtine gradul de complexitate si scalabilitate al crawler-ului. Pentru exercitiul nostru nu avem nevoie de ceva prea complicat, volumul de date nu e prea mare, datele parsate sunt destul de putine. Daca totus vrei ceva mai bun este recomandat sa cauti crawlere deja existente. Daca tii mortis sa iti faci propriul crawler care parseaza un volum foarte mare de date si mai este si rapid, iata niste idei: foloseste thread-uri multiple (dooh), foloseste un model de procesare paralela (boss worker, work crew, etc), pentru a tine minte site-urile gata vizitate foloseste una sau mai multe stive (desi ar merge si alte structuri de date...).
- Ce vreau sa fac cu datele obtinute? Un crawler n-are nici un folos daca nu folosim datele obtinute in urma rularii sale. Un functie de nevoi, datele se pot scrie intr-un fisier format XML , in propriul format sau intr-o baza de date. Un exercitiu interesant este sa se creeze un graf al datelor citite. Cu graphwiz se face foarte usor asta: un graf este reprezentat de un fisier text care specifica legaturile dintr nod-uri.
Dupa ce ai raspuns la toate acestea poti sa te apuci de partea cea mai simpla, implementarea ;) . Glumesc, nu e cea mai simpla, dar nici grea nu este, deoarece exista o gramada de parsere care ne vin in ajutor.
Atat pentru partea 1. In partea a doua va exista si o implementare.
Exista cateva alegeri pe care va trebui sa le faci inainte:
- Ce limbaj foloses? Cam orice iti convine de la C, C++, Java la limbaje de scripting gen Perl, Pythom, Ruby, etc. Cam toate au mai multe implementari de parsere HTML si XML. Eu am ales Python, pentru ca imi este foarte comod si este rapid de implementat.
- Ce parser folosesc? Aici conteaza ce tip de site vrei sa parsezi. Sa zicem ca dorim sa extragem informatiile dintr-un blog de pe blogger.com. Asta inseamna ca avem XHTML. Buun, simplu, folosim un parser de XML! Sau nu... Exista o mica problema aici, legata de corectitudinea XML-ului. La o validare a XML-ului, vom primi un raspuns negativ. Ce e de facut? Pai, cel mai simplu, facem un pas inapoi in istorie si ne amintim de SGML, tatal XML-ului si HTML-ului. Acum avem un grad mai mare de flexibilite si putem folosi scheme malformate, ceea ce si cautam. Nu am specificat tehnologia de parsare XML, SAX sau DOM. Ei bine, SAX este mai potrivit scopului, deoarece este mai rapid si nu avem nevoie de toate informatiile din pagina.
- Cat de mult vreau sa parsez, care este volumul de date cu care se va lucra si viteza dorita? In functie de acestea vom obtine gradul de complexitate si scalabilitate al crawler-ului. Pentru exercitiul nostru nu avem nevoie de ceva prea complicat, volumul de date nu e prea mare, datele parsate sunt destul de putine. Daca totus vrei ceva mai bun este recomandat sa cauti crawlere deja existente. Daca tii mortis sa iti faci propriul crawler care parseaza un volum foarte mare de date si mai este si rapid, iata niste idei: foloseste thread-uri multiple (dooh), foloseste un model de procesare paralela (boss worker, work crew, etc), pentru a tine minte site-urile gata vizitate foloseste una sau mai multe stive (desi ar merge si alte structuri de date...).
- Ce vreau sa fac cu datele obtinute? Un crawler n-are nici un folos daca nu folosim datele obtinute in urma rularii sale. Un functie de nevoi, datele se pot scrie intr-un fisier format XML , in propriul format sau intr-o baza de date. Un exercitiu interesant este sa se creeze un graf al datelor citite. Cu graphwiz se face foarte usor asta: un graf este reprezentat de un fisier text care specifica legaturile dintr nod-uri.
Dupa ce ai raspuns la toate acestea poti sa te apuci de partea cea mai simpla, implementarea ;) . Glumesc, nu e cea mai simpla, dar nici grea nu este, deoarece exista o gramada de parsere care ne vin in ajutor.
Atat pentru partea 1. In partea a doua va exista si o implementare.
2 comentarii:
Un articol foarte interesant! Good work!
Un articol bun si un titlu ce te deruta. Am crezut ca exista si o sectiune in care trecem la practica.
Trimiteți un comentariu