Парсим yandex, google, rambler

April 4, 2007 Всякое

В продолжение серии противоправных постов.

Функции для парсинага результатов поиска гугла, яндекса и рамблера.

Для работы нужен curl, хотя можно переписать с простым fopen. Curl используется в надежде на большую продолжительность работы без бана (добавляет user-agent мозилу).

Ключевая функция fuckit($word, $by), где word - строка для поиска, by - какой поисковик юзать (1-yandex, 2-google, 3-rambler). возвращает данные массивом:

array(array(title, desc, url, place),array(title, desc, url, place)….)

Но помните!!! :) Поисковики против этого, они не любят, чтоб их парсили, а им не говорили. Сие противозаконно. Так что, будте бдительны! :)
Формат выдачи поисковиков также периодически меняется, так что со временем могут быть ошибки…

//search result parcing with php

define (”DD”,”((http|https):(([A-Za-z0-9_$.+!*(),;/?:@&~=-])|%[A-Fa-f0-9]{2}){2,}(#([a-zA-Z0-9][a-zA-Z0-9_$.+!*(),;/?:@&~=%-]*))?([A-Za-z0-9_$+!*();/?:~-]))”);
function Encode ( $str, $type )
{
// $type:
// ‘w’ - encodes from UTF to win
// ‘u’ - encodes from win to UTF

static $conv=”;
if (!is_array ( $conv ))
{
$conv=array ();
for ( $x=128; $x <=143; $x++ )
{
$conv['utf'][]=chr(209).chr($x);
$conv['win'][]=chr($x+112);
}

for ( $x=144; $x <=191; $x++ )
{
$conv['utf'][]=chr(208).chr($x);
$conv['win'][]=chr($x+48);
}

$conv['utf'][]=chr(208).chr(129);
$conv['win'][]=chr(168);
$conv['utf'][]=chr(209).chr(145);
$conv['win'][]=chr(184);
}
if ( $type==’w’ )
return str_replace ( $conv['utf'], $conv['win'], $str );
elseif ( $type==’u’ )
return str_replace ( $conv['win'], $conv['utf'], $str );
else
return $str;
}

//error_reporting(0);

function fuckem($data)
{

$ridfirst = “<ol class=\”results\”>”;
$ridlast = “</ol>”;
$data = explode($ridfirst,$data);
$data = explode($ridlast,$data[1]);
$data = preg_split(”/<li[ ]+value=[0-9\" ]+>/”,$data[0]);

$topush = array();

$place = 0;
for ($i=0;$i<count($data);$i++)
{

if (ereg(DD,$data[$i],$regs))
{
$p['url'] = $regs[0];
} else continue;

$p['place'] = ++$place;
$exp = explode(”<div class=\”text\”>”,$data[$i]);
$p['title'] = trim(strip_tags($exp[0]));
$exp = explode(”</div>”,$exp[1]);
$p['desc'] = trim(strip_tags($exp[0]));

array_push($topush,$p);
}

return $topush;

}

function fuckem2($data)
{
$ridfirst = “<div class=g>”;
//$ridlast = “<font size=-1>”;
$data = explode($ridfirst,$data);
//$data = explode($ridlast,$data[1]);

//return $data;

//$data = preg_split(”/<li[ ]+value=[0-9\" ]+>/”,$data[0]);

$topush = array();

$place = 0;
for ($i=1;$i<count($data);$i++)
{

if (ereg(DD,$data[$i],$regs))
{
$p['url'] = $regs[0];
} else continue;

$p['place'] = ++$place;
$exp = explode(”<font size=-1>”,$data[$i]);
$p['title'] = Encode(trim(strip_tags($exp[0])),”w”);
$exp = explode(”<span class=a>”,$exp[1]);
$p['desc'] = Encode(trim(strip_tags($exp[0])),”w”);

array_push($topush,$p);
}

return $topush;

}

function fuckem3($data)
{
$ridfirst = “<ol start=\”1\”>”;
$ridlast = “</ol>”;
$data = explode($ridfirst,$data);
$data = explode($ridlast,$data[1]);

$data = explode(”<li>”,$data[0]);

$topush = array();

$place = 0;
for ($i=1;$i<count($data);$i++)
{

if (ereg(DD,$data[$i],$regs))
{
$p['url'] = $regs[0];
} else continue;

$p['place'] = ++$place;
$exp = explode(”</a>”,$data[$i]);
$p['title'] = trim(strip_tags($exp[0]));
$exp = explode(”<div class=info>”,$exp[1]);
$p['desc'] = str_replace(array(chr(10),chr(13)),”",trim(strip_tags($exp[0])));

array_push($topush,$p);
}

return $topush;

}

function fuckit($word,$by = 1)
{
$ch = curl_init();
if ($by==2) $q = “http://www.google.com/search?q=”.rawurlencode($word).”&btnG=%D0%9F%D0%BE%D0%B8%D1%81%D0%BA+%D0%B2+Google&lr=”;
if ($by==1) $q = “http://www.yandex.ru/yandsearch?text=”.rawurlencode($word).”";
if ($by==3) $q = “http://www.rambler.ru/srch?set=www&words=”.rawurlencode($word).”";
curl_setopt($ch, CURLOPT_URL, $q);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_USERAGENT, ‘Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.5) Gecko/20041107 Firefox/1.0′);
curl_setopt($ch,CURLOPT_ENCODING,’WIN-1251′);

$content = curl_exec($ch);
curl_close($ch);

if ($by==1) $data = fuckem($content);
if ($by==2) $data = fuckem2($content);
if ($by==3) $data = fuckem3($content);

return $data;
}

О-о, а вот это?

Комментарии (5)

  1. MiRacLe

    а вот если использовать simplexml вся эта портянка кода лаконично замениться на 3-4 рабочих строчки
    1. скачать (например file_get_contents)
    2. преобразовать в simplexml-объект (например DomDocument::loadHTML, simplexml_import_dom)
    3. выполнить xpath для полученного объекта (например simplexml::xpath(’//li//div//a[2]‘) для результатов выдачи яндекса)

    Удачного размышления ;o)

  2. jeka911

    Ага, пасиба :) Я все на 5-й не перепрыгну…

  3. Sokol

    A pochemu by ne vospolzovatsa Google API i Yandex XML? takie silnie ogranicheniya po kol-vu zaprosov v sutki?

    po povodu curl i fopen - mojno samomu sockety otkryvat’ i http-request pravit’ tak kak nado :)
    P.S. pereprygivayet na 5y. simplexml rulit. i ne tolko on

  4. jeka911

    Насчет google api - не разбирался. А в яндекс хмл - 1000 запросов бесплатных и то нужен статический айпи.. Казлы они короче :)

  5. jMas

    Поисковики вообще чтото по-наглели… Рубят $ и делиться не хотят((

Добавить комментарий

Вход с one-face