Мар 25
2009curl. парсим сайты защищенные авторизацией. мастеркласс :)
Рубрики: (phpdude Curl) Автор: phpdude 25-03-2009
Теги : пиздец
добрый
давно чото я не писал тут, думаю многие подумали что я уже забросил этот блог к чертовой матери, но это не так. суть в том, что я сам редко брожу по интернету, и не постую в блог всякую хуйню с хабрахабра и новостных лент других людей ..
ладно к делу.
буквально вчера меня попросил друг сделать для него парсер сайта с сохранением результато в эксель. эксель мы опустим так как это статья для пхпклуба или как их там.
а вот парсинг данных это уже интересно, и как не странно сайт был закрыт авторизацией
код.
<?php
require_once ‘init.php’;
ну эту часть пропустим
if(!$_SESSION['curl'] || time() > $_SESSION['curluntil'])
{
$curl = new Curl();
$post = array(«justloggedin»=>1,«login»=>SITELOGIN,«password»=>SITEPASS);
$curl->init(«http://www.horseracebase.com/horsebase1.php»)->serverfriendly()->setopt(«post»,$post)->exec();
$_SESSION['curl'] = $curl;
$_SESSION['curluntil'] = time() + AUTHCACHE;
}
а вот это уже интересно: подготавливаем объект курл для последующей работы с ним.
бля, только что позвонили и испортили настроение, так что дальше просто код.
if(!$_POST)
{
echo «<form method=’post’>»;
echo «<select name=’day’>»;
for($i=1;$i<=31;$i++)
{
echo «<option value=’$i’>$i</option>»;
}
echo «</select>»;
echo «<select name=’month’>»;
for($i=1;$i<=12;$i++)
{
$date = date(«M»,mktime(0,0,0,$i,1,2009));
echo «<option value=’$i’>$date</option>»;
}
echo «</select>»;
echo «<select name=’year’>»;
for($i=2009;$i>=1997;$i–)
{
echo «<option value=’$i’>$i</option>»;
}
echo «</select>»;
echo « <input type=’submit’ value=’get list’ />»;
echo «</form>»;
}
elseif(!$_POST['id'])
{
$curl = $_SESSION['curl'];
$content = $curl->init(«http://www.horseracebase.com/tracerace.php»)->serverfriendly()->setopt(«post»,$_POST)->exec();
preg_match_all(«#<a href=’races.php\\?id=(\\d+)’ target=’_blank’>(.*?)</a>#ism»,$content,$races);
$races = (array)@array_combine($races[1],$races[2]);
echo «<form method=’post’>»;
foreach($races as $id=>$title)
{
echo «<label><input type=’checkbox’ name=’id[$id]‘ value=’$title’> $title</label><br/>»;
}
foreach($_POST as $i=>$v)
{
echo «<input type=’hidden’ name=’$i’ value=’$v’/>»;
}
echo «<input type=’submit’ value=’get it’ /> <input type=’submit’ value=’get all them!’ onclick=’aa = document.getElementsByTagName(\»input\»);for(a in aa) { b= aa[a]; b.checked=true;}’/></form>»;
}
else
{
$curl = $_SESSION['curl'];
$items = array();
foreach((array)$_POST['id'] as $id=>$title)
{
$content = $curl->init(«http://www.horseracebase.com/races.php?id=$id»)->serverfriendly()->exec();
preg_match(«#<td class=’class=databreakdown16′>(.*?)</td>#ism»,$content,$info);
preg_match_all(«#<span class=’texttype1′>(.*?): </span><span class=’texttype2′>(.*?)</span>#ism»,$info[1],$info);
$info = array_combine($info[1],$info[2]);
preg_match_all(«#</table>\\s+<table width=’1024′ align=’center’>(.*?)</table>#ism»,$content,$data);
preg_match_all(«#<tr><td.*?>(.*?)</td>\\s*<td.*?>(.*?)</td>\\s*<td.*?>(.*?)</td>\\s*<td.*?>(.*?)</td>\\s*<td.*?>(.*?)</td>\\s*<td.*?>(.*?)</td>\\s*<td.*?>(.*?)</td>\\s*<td.*?>(.*?)</td>\\s*<td.*?>(.*?)</td>\\s*<td.*?>(.*?)</td>#ism»,$data[1][1],$data,PREG_SET_ORDER);
$items[$id] = array(«info»=>$info,«data»=>$data,«title»=>$title);
}
require_once dirname(__FILE__).‘/libs/Spreadsheet/Excel/Writer.php’;
$date = $_POST['day'].«-».$_POST['month'].«-».$_POST['year'];
$file = dirname(__FILE__).«/tmp/horseracebase $date.xls»;
$xls = new Spreadsheet_Excel_Writer($file);
$xls->setVersion(8);
$f1 = $xls->addFormat(array(«bold»=>true));
$f2 = $xls->addFormat(array(«bold»=>true,«color»=>«white»,«bgcolor»=>«black»,«align»=>«center»));
// $xls->send(«horseracebase $date.xls»);
$i=0;
$sheet = $xls->addWorksheet(«races»);
foreach($items as $id=>$item)
{
foreach($item['info'] as $k=>$v)
{
$sheet->writeString($i,0,«$k»,$f1);
$sheet->writeString($i,1,«$v»);
$sheet->mergeCells($i,1,$i,10);
$i++;
}
$i++;
$sheet->writeString($i,1,«Place»,$f2);
$sheet->writeString($i,2,«Dist Bt»,$f2);
$sheet->writeString($i,3,«Stall»,$f2);
$sheet->writeString($i,4,«Horse»,$f2);
$sheet->writeString($i,5,«Age»,$f2);
$sheet->writeString($i,6,«Weight»,$f2);
$sheet->writeString($i,7,«OR»,$f2);
$sheet->writeString($i,8,«Trainer»,$f2);
$sheet->writeString($i,9,«Odds»,$f2);
$sheet->writeString($i,10,«Jockey (Claim)»,$f2);
$i++;
foreach($item['data'] as $v)
{
$sheet->writeString($i,1,$v[1]);
$sheet->writeString($i,2,$v[2]);
$sheet->writeString($i,3,$v[3]);
preg_match(«#href=’(.*?)’.*?>(.*?)<#ism»,$v[4],$url);
$sheet->writeUrl($i,4,«http://www.horseracebase.com/».$url[1],$url[2]);
$sheet->writeString($i,5,$v[5]);
$sheet->writeString($i,6,$v[6]);
$sheet->writeString($i,7,$v[7]);
preg_match(«#href=’(.*?)’.*?>(.*?)<#ism»,$v[8],$url);
$sheet->writeUrl($i,8,«http://www.horseracebase.com/».$url[1],$url[2]);
$sheet->writeString($i,9,$v[9]);
preg_match(«#href=’(.*?)’.*?>(.*?)<#ism»,$v[10],$url);
$sheet->writeUrl($i,10,«http://www.horseracebase.com/».$url[1],$url[2]);
$i++;
}
$i += 5;
}
$sheet->setColumn(0,0,15);
$sheet->setColumn(4,4,25);
$sheet->setColumn(8,8,25);
$sheet->setColumn(10,10,30);
$xls->close();
header(«Location: tmp/horseracebase $date.xls?».rand(0,10000000));
}
вот только нужен ли он кому то. ладно, удачи
кстати ссылочка http://phpdude.ru/code/0ugPon может кому там поудобнее смотреть
кстати до кучи вот рабочая версия http://phpdude.ru/matt/horseracebase/ если кому интересно
Всея ПЫХА
adw0rd
Мавр
ГО
Irinax
Спасибо, полезная вещица вышла. Жаль только что телефонными разговорами настроение испортили. Хотелось бы больше комментов.
да там вроде бы все просто такто)
просто это показательный пример как буквально в 100 строчек можно сделать грабер сайта с авторизацией, причем из 100 – 60 на всякую ебань типа вывода в эксель + генерацию формы
dude, я пока нубке, так что не бей.
нужно напарсить список тем определенного юзера с форума на булке. этот способ подойдет али нет
подойдет конечно. сейчас как раз делаю скриптик для покупки товаров на ебай.ком в один клик:)
нубке конечно подойдет. хоть откуда подойдет
Здравствуйте, меня интересует как сделать такой парсер под wp только мне нужно брать части из страницы которая обновляется очень часто. Как сделать так чтобы скрипт переходил по ссылкам и вырезал нужное и публиковал на моем новостном блоге <a href="http://4x4sell.ru" 4 на 4 можете прислать примеры скриптов в почту.
Здравствуйте, меня интересует как сделать такой парсер под wp только мне нужно брать части из страницы которая обновляется очень часто. Как сделать так чтобы скрипт переходил по ссылкам и вырезал нужное и публиковал на моем новостном блоге http://4x4sell.ru 4 на 4 можете прислать примеры скриптов в почту.
после получения 5 килобаксов – обязательно пришлю
пока благотворительностью не занимаюсь и фрилансом закончен, так что могу только посоветовать найти кого нибудь кто это сделает