marți, 4 decembrie 2007

Web Crawler

Un web crawler(sau web spider, web robot) este o aplicatie/ script automatizat care urmareste ceva pe internet. In alte cuvinte daca ii dam ca target un anumit site, acest crawler va aduna informatii si le va structura.

Internetul este o sursa nelimitata de informatii, dar in ultimul timp a devenit si un loc de joaca, fara sa iti incarce sistemul cu aplicatii mari, costisitoare si mai ales scumpe. O noua strategie in aceasta privinta o reprezinta jocurile online multiplayer sau MMOG (Massive multiplayer online game).

Aparut relativ de curand in Romania, Travian, a reusit intr-un timp destul de scurt sa isi stranga fani, fiind disponibile 5 servere : s1 (7900), s2 (9300), s4 (13760),s3(9500), s5(13100) - ultimul a fost lansat pe 5.11.2007 si are deja peste 13000 utilizatori.

Ce legatura are Travian cu un crawler web? Simplu: EU!
Am facut un parser care poate scoate orice informatie de pe server. As vrea totusi sa ma opresc asupra unuei singure facilitati: aceea de a structura toate aliantele din top 20. Cu alte cuvinte, dandu-i-se o alianta de pe server, gaseste toate relatiile sale : Razboi, PNA sau Ally. Un asemenea tool este de ajutor pentru cei din conducerea aliantelor, pentru a vedea cine ce a mai schimbat in relatiile de alianta, si mai ales, cine cu cine se razboieste!

Sa incepem descrierea tacticii de atac a crawler-ului:

1. Conectarea la server. (How to login to travian web site)
Conectarea din pacate a fost una dintre cele mai dificile taskuri, din cauza autentificarii care nu este documentata (evident) si a trebuit sa fac putin de reverse engineering :)
Asadar am folosit un tool de sniffing :WIREshark - care este free dar e destul de dificil de utilizat - tip puteti folosi IEWatch care se integreaza de minune cu InternetExplorer (pentru fainii acestui program), dar din pacate ca orice creeat de Microsoft nu este gratuit. Folosind Wireshark, am descoperit secventa de POST HTML care este trimisa la login. Spre fericirea mea userul si password-ul se trimit in plain text, deci e destul de simplu sa indentific secventa, in schimb partea mai grea a fost restul de campuri. Dau un indiciu mic mic, restul pe privat.

TIP:
Valoarea "1196721665" este foarte importanta si se modifica pentru orice tentativa de login. Restul lagurilor se gasesc in "Text", "Password", "autologin".

TIP2:
Solutia cea mai simpla in loc de login manual folosind Http POST, se poate folosi wget.exe - aplicatie care suporta cookies si functioneaza de minune.
Asadar :
wget.exe --load-cookies "full_path_cookies.txt" --output-document "_nume_fisier_output" http://mysite.ro
Functioneaza de minune!

2. Identifincarea aliantei.
Nu mi-am batut capul sa parsez site-ul de la inceput si sa identific alianta dupa eticheta sa, ci am cerut direct link catre descrierea sa.

3. Parsarea html-ului.
Deci este un format foarte popular, o sa fiti surprinsi ca nu exista prea multe parsere care sa identifice corect toate tagurile unui fisier html. O sa dau cateva exemple, dar care nu au functionat pe site-ul meu.
DOM
SAX
Un limbaj usor de folosit pentru aplicatii web, dar personal nu am o afinitate pentru el: Python

M-am oprit la un singur limbaj : C# pentru care am gasit un Parser Open Source.

4. Identificarea relatiilor.
Parserul pe care l-am gasit si care NU CRAPA, avea un mic bug: nu parsa Textele adica pentru un html
< href = "http://www.blogger.com/logout.php"> Iesire < / a >
reusea sa identifice numai href["logout.php"]; nu asta a fost problema pentru ca am reusit sa il modific astfel incat sa poata parsa si textul - multumita open source.
Asadar am reusit sa identific relatiile tocmai datorita acestei modifcari, intrucat pe serverul travian.ro relatiile sunt definite de 3 stringuri "Alinate:", "In razboi cu:", "PNA-uri", apoi o lista cu alintele din aceasta categorie.

5. Do you database??
No, thank you! Desi finalitatea temei trebuia sa fie o baza de date, nu mi-a placut ideea de a avea pur si simplu un DB... asa ca am folosit un tool GraphViz pentru vizualizarea output-ului.


Cam atat!!! Asteptam comentarii si sugestii.

3 comentarii:

Podariu Cosmin spunea...

Amuzant...dar interesant.
Poti gasi orice informatie despre jucatori/aliante aici s[x].travian.[y]/map.sql

Unde x- serverul si y- domeniu.
Mult noroc!

Iulia spunea...

Asta e doar inceputul - se poate dezvolta aplicatia pentru a tool-uri "ajutatoare"... Use your imagination :)

Pop Adrian spunea...

un mic bug: nu parsa ..... reusea sa identifice numai href["logout.php"]



Pai e normal ca nu parsa url-ul complet, acel parser e un parser pentru text, ca sa primesti un url complet, trebuie sa folosesti un parser pentru DOM.

Mai exact, tu incarci pagina, probabil intr-un string. De obicei, paginile web, sunt facute in asa fel incat folosesc link-uri relative de genul celui care lai zis tu (href="logout.php"), in loc sa foloseasca cai absolute pentru link-uri (de genul href="http://blogger.com/logout.php"; e foarte normal ca un parser de text sa nu poata scoate calea absoluta :(

eu am rezolvat problema asta odata, mai demult.... o sa incerc sa postez rezolvarea la problema asta pe unul din blogurile mele, cel care au ca tema crawlingul, in general, si datele: The Data Provider