Парсим yandex, google, rambler

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

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

Для работы нужен 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=&#187;.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=&#187;.rawurlencode($word).»»;
if ($by==3) $q = «http://www.rambler.ru/srch?set=www&words=&#187;.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;
}

Реклама

4 Responses to Парсим yandex, google, rambler

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

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

  2. Ага, пасиба :) Я все на 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. Насчет google api — не разбирался. А в яндекс хмл — 1000 запросов бесплатных и то нужен статический айпи.. Казлы они короче :)

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

Заполните поля или щелкните по значку, чтобы оставить свой комментарий:

Логотип WordPress.com

Для комментария используется ваша учётная запись WordPress.com. Выход / Изменить )

Фотография Twitter

Для комментария используется ваша учётная запись Twitter. Выход / Изменить )

Фотография Facebook

Для комментария используется ваша учётная запись Facebook. Выход / Изменить )

Google+ photo

Для комментария используется ваша учётная запись Google+. Выход / Изменить )

Connecting to %s

%d такие блоггеры, как: