Se afișează postările cu eticheta crawler. Afișați toate postările
Se afișează postările cu eticheta crawler. Afișați toate postările

luni, 26 noiembrie 2007

Crawler pentru Blogger.com ( tema 2 IE)

Pentru tema 2 mi-am ales analiza site-ului blogger.com
Scopul temei este de a scrie un crawler care sa obtina diverse tipuri de relatii dintre utilizatori/bloguri.

Ca tehnologie folosita am ales Java si Mysql.

Prima problema pe care am intalnit-o a fost cand am incercat sa obtin un obiect DOM alcatuit prin parsarea html-ului unui blog. Html-ul nu este conform standardelor si nu am reusit sa-l parsez.
Rezolvarea problemei a fost utilizarea JTidy un parser HTML care permite corectarea greselilor de sintaxa.
Dupa apelul :
document = tidy.parseDOM(urlConnection.getInputStream(), outputStream);
vom avea in document structura paginii.
Atentie: dupa incercari repetate am descoperit ca daca in loc sa apelez metoda parseDOM care returneaza DOM-ul asociat stream-ului parsat se foloseste metoda parse care doar scrie stream-ul parsat intr-un output stream, urmata de creearea unui DOM din acel stream se pot intampina dificultati la creearea DOM-ului.

Din acest moment totul ar fi trebuit sa decurga usor prin folosirea XPath-ului pt a gasi informatiile relevante.
Search-uri pe expresii de tipul expression = "//a[@class=\"comment-link\"]";
care returneaza toate nodurile < a > oriunde s-ar afla, cu parametrul "class" = "comment-link" returneaza liste de noduri sau noduri ce pot fi prelucrate usor.
De exemplu urmatoarea bucata de cod cauta toate comments-urile si le adauga intr-o lista de comments dupa ce in prealabil a scos atributele pop-up din url.

expression = "//a[@class=\"comment-link\"]";
nodeList = (NodeList) xpath.evaluate(expression, document,
XPathConstants.NODESET);
for (int i = 0; i < nodeList.getLength(); i++) {
aux = nodeList.item(i);

String auxS = aux.getAttributes().getNamedItem("href")
.getNodeValue();
// daca linkul e de tip popup scoate parametrul popup
if (auxS.indexOf("&isPopup=true") > 0)
auxS = auxS.substring(0, auxS.indexOf("&isPopup=true"));
// adaugam comment-ul in lista de comments
if (!(aux.getChildNodes().item(0).getNodeValue().indexOf("0") >= 0))
comments.add(auxS);

}


Insa cu aceasta ocazie am observat ca nu toate paginile blogger sunt formate pe baza aceluiasi template html. Se pare ca exista o diferenta intre vechile pagini blogger 1.0 si noile blogger 2.0.
De exemplu link-urile din textul din entry-uri este gasit cu string-ul XPATH:
expression = "//div[@class=\"post-body entry-content\"]/a";

in timp ce in alta versiune este gasit cu:
expression = "//div[@class=\"post-body\"]/p/a";

Un alt lucru pe care l-am observat este ca daca pentru majoritatea paginilor structura dupa corectarea paginii cu JTIDY este aceeasi doar ca au fost inchise toate tag-urile, corectate toate greselile de semantica si sintaxa samd, pagina de profile ale utilizatorilor sufera o transformare radicala dupa "curatarea" cu JTIDY.

De aceea trebuie sa fim atenti cand folosim JTIDY si sa analizam structura paginii obtinute si nu a paginii initiale.

O alta problema este ca datorita structurii customizabile a template-urilor blogger nu putem fi siguri ca toate informatiile pe care le cautam se gasesc intotdeauna pe fiecare pagina.De exemplu am gasit in cursul parsarii bloguri care nu aveau pe ele profilul userilor lucru ce mi-a creeat probleme, sau profile care nu erau publice.

O analiza atenta va reusi totusi sa extraga extrem de multe informatii din paginile blogger.

Codul pentru tema mea se va gasi dupa expirarea termenului limita de trimitere a temelor aici.

Ca un ultim sfat: acest proiect ar fi fost mult mai usor de realizat in python.

sâmbătă, 24 noiembrie 2007

Tema 2 Interfete Evoluate

Enuntul temei:

Pe internet exista un mare numar de comunitati online. Prin comunitate pe internet intelegem o multime de oameni ce efectueaza o activitate impreuna (scriu mesaje pe un forum, joaca un joc multiplayer, etc.). Pe baza acestor activitati se formeaza retele sociale – grafuri de mari dimensiuni ale relatiilor online dintre membrii comunitatii. Pentru a extrage un astfel de graf dintr-o aplicatie online metoda uzuala este de a scrie un program care analizeaza paginile web ale site-ului comunitatii si extrage datele referitoare la colaborarile dintre persoane. Acest program trebuie sa-l faceti voi ca tema

Aplicatia se bazeaza pe urmatoarele proprietati ale acestor site-uri:

  • Paginile site-ului sunt generate dinamic => toate vor avea aceeasi structura.
  • Cea mai mare parte a linkurilor din aceste pagini duc tot in pagini ale site-ului.
Din aceste proprietati rezulta ca este suficient sa se scrie un script/clasa/functie care sa analizeze o pagina HTML si sa se aplice aceasta functie pe toate linkurile din interiorul site-ului.

Exemple de comunitati online ce pot fi analizate:
  • Bloguri gazduite pe acelasi server (blogspot.com, wordpress.com, etc)
  • Forumuri (forumuri bazate pe phpbb, vBulletin, etc)
  • Jocuri online (hattrick.org, online.bridgebase.com/myhands, etc., sah sau pool de pe yahoo games)

Aplicatia poate fi realizata intr-un limbaj la alegere.


Membrii echipei au ales:
Alecsandrescu Razvan - blogger.com
Morosan Catalin - kernelnewbies.org
Tanase Claudia - Hi5.com
Vasile Mugurel - 360.yahoo.com

Temele rezolvate vor fi disponibile in curand pe site, la sectiunea proiecte.