Descriere:Cum sa scrii un crawler
Download:Nu necesita
Autor:In script
Sursa (Link-ul oficial): 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";
?>
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;
?>
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);
}
?>
Î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.