[Tutorial PHP]Cum sa scrii un crawler

#1
Nume Tutorial:Cum sa scrii un crawler
Descriere:Cum sa scrii un crawler
Download:Nu necesita
Autor:In script
Sursa (Link-ul oficial):
tutorialeonline.net
Propria parere:Util.
Tutorialul:
Am avut nevoie să preiau odată mai multe informaţii de pe un site extern (un forum). În continuare o să vă prezint cum să substrageţi informaţiile despre userii dintr-un forum, deci practic cum să scrieţi un crawler. Desigur nu vă gândiţi că puteţi să indexaţi orice site cu ce am scris eu mai jos, eu doar vă expun ideile de bază, ceva minimal şi bun de folosit în anumite cazuri.
Am intrat pe un forum şi m-am uitat la un user. Văd acolo că linkul este de forma:

http://www.unsite/forum/profile.php?mod ... ile&u=9497

deci dacă aş putea să fac un program care să meargă de la primul până la ultimul user aş putea să extrag toate informaţiile de acolo.
Prima oară trebuie să fac program de test şi blablabla, deci:
completez la profilul meu tot ce se poate completa ca să fac testele pe această pagină, apoi iau pagina local cu wget din command line:

wget "http://www.unsite/forum/profile.php?mod ... ile&u=9497

redenumesc fişierul pe care mi l-a downloadat în "profile" şi mă apuc să scriu expresiile regulate.
Într-un final iese acest script:
Cod:

Cod: Selectaţi tot

 <?php
 $page = file_get_contents("profile");
 
 $founduser =      preg_match("/Viewing profile :: (.*?)<\/b><\/th>/", $page, $user);
 $foundmail =      preg_match("/href=\"mailto:(.*?)\"><img src=\"templates\/AdInfinitum\/images\/lang_english\/icon_email.gif\"/", $page, $mail);
 $foundyahooid =   preg_match("/\"http:\/\/edit\.yahoo\.com\/config\/send_webmesg\?\.target=(.*?)&\.src=pg\"/", $page, $yahooid);
 $foundaimid =     preg_match("/aim:goim\?screenname=(.*?)&message=Hello\+Are\+you\+there/", $page, $aimid);
 $foundicqid =     preg_match("/http:\/\/wwp\.icq\.com\/scripts\/search\.dll\?to=(.*?)\"><img src=\"templates\/AdInfinitum\/images\/lang_english\/icon_icq_add\.gif\"/", $page, $icqid);
 
 if ($founduser)      echo "user=".$user[1] ."\n";
 if ($foundmail)      echo "mail=".$mail[1] ."\n";
 if ($foundyahooid)   echo "yahooid=".$yahooid[1] ."\n";
 if ($foundaimid)     echo "aimid=".$aimid[1] ."\n";
 if ($foundicqid)     echo "icqid=".$icqid[1] ."\n";
 ?>
Ca să scrii expresiile regulate pur şi simplu te uiţi în sursa paginii şi selectezi o bucată de text ce cuprinde informaţia pe care vrei să o extragi.
Acum dacă ştii puţin expresii regulate ştii că unele caractere au semnificaţii speciale, ceea ce înseamnă că trebuie sa le dai "escape", deci să punem un "\"
Nu pot să intru în amănunt pentru că sunt destul de complexe expresiile regulate, şi nu este cazul în acest tutorial.
Bun, vedem că scriptul php merge "like a lucky charm".
Mai departe facem mici modificări pentru a salva toate aceste informaţii într-o baza de date :)
Prima oară creem baza de date, să zicem unsitedb şi o tabelă de această structură:

user <- primary si unic, string
mail <- string
yahooid <- string
aimid <- string
icqid <- string

Sql-ul pentru crearea tabelei poate să fie de forma:
Cod:

Cod: Selectaţi tot

 CREATE TABLE IF NOT EXISTS `users`
 (`user` varchar(30) NOT NULL,
 `mail` varchar(30) NOT NULL,
 `yahooid` varchar(30) NOT NULL,
 `aimid` varchar(30) NOT NULL,
 `icqid` varchar(30) NOT NULL,
 PRIMARY KEY (`user`)
 ) ENGINE=MyISAM DEFAULT CHARSET=latin1;
 ?>
Am creat baza de date, am creat tabela, avem şi scriptul care introduce în baza de date:
Cod:

Cod: Selectaţi tot

 <?php
 //link-ul fara numarul unic al fiecarui user
 $baselink = "http://www.unsite/forum/profile.php?mode=viewprofile&u=";
 
 //de la ce user pana la ce user sa faca extragerea informatiilor
 $min = 0;
 $max = 9500;
 
 //ne conectam la baza de date
 mysql_connect("localhost", "user", "parola");
 mysql_select_db("unsite");
 
 //inceputul query-ului de insert
 $queryInsertInfo = "INSERT INTO users VALUES (";
 
 for($i = $min ; $i <= $max ; $i++ )
 {
 //putem sa tragem o pagina de pe net chiar cu aceasta functie
 //am facut append la $baselink cu id-ul userului la care suntem
 $page = file_get_contents($baselink . $i);
 
 $founduser = preg_match("/Viewing profile :: (.*?)<\/b><\/th>/", $page, $user);
 $foundmail = preg_match("/href=\"mailto:(.*)\"><img src=\"templates\/AdInfinitum\/images\/lang_english\/icon_email.gif\"/", $page, $mail);
 $foundyahooid = preg_match("/\"http:\/\/edit\.yahoo\.com\/config\/send_webmesg\?\.target=(.*?)&\.src=pg\"/", $page, $yahooid);
 $foundaimid = preg_match("/aim:goim\?screenname=(.*?)&message=Hello\+Are\+you\+there/", $page, $aimid);
 $foundicqid = preg_match("/http:\/\/wwp\.icq.com\/scripts\/search\.dll\?to=(.*?)\"><img src=\"templates\/AdInfinitum\/images\/lang_english\/icon_icq_add\.gif\"/", $page, $icqid);
 
 //introducem informatiile in stringul de query
 $tempQuery = $queryInsertInfo;
 if ($founduser)
 $tempQuery .= "'". $user[1] ."',";
 else
 $tempQuery .= "'',";
 
 if ($foundmail)
 $tempQuery .= "'". $mail[1] ."',";
 else
 $tempQuery .= "'',";
 
 if ($foundyahooid)
 $tempQuery .= "'". $yahooid[1] ."',";
 else
 $tempQuery .= "'',";
 
 if ($foundaimid)
 $tempQuery .= "'". $aimid[1] ."',";
 else
 $tempQuery .= "'',";
 
 if ($foundicqid)
 $tempQuery .= "'". $icqid[1] ."'";
 else
 $tempQuery .= "''";
 
 $tempQuery .= ");";
 //inchidem query-ul
 
 //afisam pe ecran la ce user suntem si cum arata query-ul
 echo "id=$i\n";
 echo $tempQuery ."\n\n";
 mysql_query($tempQuery);
 }
 ?>
Dacă sunt useri care au fost şterşi aceştia nu se vor adăuga de 2 ori pentru că coloana "user" din tabela mysql este primară şi unică.
În continuare stăm şi ne uităm pe ecran cum sunt strânse informaţiile despre fiecare user :)
Autorul nu îşi asumă nici o responsabilitate în cazul folosirii acestor informaţii în scopuri ilegale, scopul acestui tutorial este pur informativ.
N-am cerut la nimeni niciodata,
Chiar de-a fost sa rabd, in viata mea.
Am dat totul fara nici o plata,
Nevoind nimic sa mi se dea.

@Virgil Carianopol
Vezi-ti de treaba si retine:
"E treaba ta sa spui ce vrei si sa nu conteze pentru nimeni".

@Kazi Ploae

Înapoi la “Tutoriale PHP”

Cine este conectat

Utilizatori răsfoind acest forum: Niciun utilizator înregistrat și 1 vizitator