Парсер картиночной выдачи яндекса

17 октября 2011 г.

Сегодня мы будем писать “Парсер картиночной выдачи яндекса“.

Наши задачи:

  1. На входе вводить запрос для поиска и количество картинок
  2. Получение текста и нужное количество картинок
  3. Обработка запроса
  4. Вывод комментарий и ссылок

Итак поехали.
1.

Напишем простую форму:

<form action="" method="post">
Запрос:<input type="text" name="text">
Сколько картинок:<input type="text" name="num">
<button>ok</button>
</form>


2.

Как известно что перебор слов идет не через пробел, а через знака плюс.
Делаем так:

$text=str_replace(" ","+",trim($_POST['text']));

Теперь по поводу количество страниц…
На каждой страницы находятся 20картинок.
Всего 100страниц.
Мы должны поделить количество изображений на 20, чтобы понять сколько запросов нужно нам… и округлить к большему.

  $n=intval($_POST['num']);
  $ns=ceil(($n/20));

3.
Теперь самое основное. Обработка запроса.
Для примерна я взял слово «Абстракции», смотрим исходный код странцы:

<ul class="b-image-info"> 
<li class="text"><strong>Абстракция</strong> от Joey G. <strong><wbr />Абстракция</strong> 3D.  </li> 
<li class="info"> 
<a class="b-image-info__double" title="Все размеры" href="/yandsearch?rpt=imagedups&text=%D0%B0%D0%B1%D1%81%D1%82%D1%80%D0%B0%D0%BA%D1%86%D0%B8%D0%B8&img_url=kilobit.hit.bg%2Fk21%2520copy.jpg&from=p%3D0%26nl%3D1%26rpt%3Dimage%26ed%3D1" onmousedown="w(this,'8.505.574');"> 
500×312 … 1920×1080</li> 
</a> 
</li> 
<li class="link"> 
<a target="_blank" class="domain" href="http://dreamworlds.ru/flame/46216-abstrakciya.html" onmousedown="ic(2, this);;w(this,'8.86.13.141');;" onclick="return {'pos': 1, 'extUrl': 'dreamworlds.ru'}">dreamworlds.ru</a> 
<a class="like" href="/yandsearch?rpt=image&text=%D0%B0%D0%B1%D1%81%D1%82%D1%80%D0%B0%D0%BA%D1%86%D0%B8%D0%B8&like=kilobit.hit.bg%2Fk21%2520copy.jpg" onmousedown="w(this,'8.469.471');" onclick="return {'pos': 1}">похожие</a> 
</li> 
</ul>

То что нам нужно.
Получим его:

  for($i=0;$i<$ns;$i++){
  $str=file_get_contents("http://images.yandex.ru/yandsearch?p=".$i."&text=".$text."&nl=1&rpt=image&ed=1");
  preg_match_all('|<ul class="b-image-info">(.*?)</ul>|sui',$str,$proxy);
/* */

Сейчас будем разбирать исходный код по частям.
Сначало ссылки:

preg_match('|img_url=(.*?)&from|sui',$a,$d);
$arr=array('img_url=','&from'); 
$url=str_replace($arr,'',urldecode($d[0]));

Текст:

preg_match('|<li class="text">(.*?)</li>|sui',$a,$s);
$text=htmlspecialchars(strip_tags($s[0]));

И у нас остался счетчик:

    $j++;
    if($j==$n){
      exit();
    } 

При получение нужное количество картинок, скрипт останавливает работу.

Весь код такой:

<form action="" method="post">
Запрос:<input type="text" name="text">
Сколько картинок:<input type="text" name="num">
<button>ok</button>
</form>
<?
if(isset($_POST['text']) and isset($_POST['num'])){
  $text=str_replace(" ","+",trim($_POST['text']));
  $n=intval($_POST['num']);
  $ns=ceil(($n/20));
  for($i=0;$i<$ns;$i++){
  $str=file_get_contents("http://images.yandex.ru/yandsearch?p=".$i."&text=".$text."&nl=1&rpt=image&ed=1");
  preg_match_all('|<ul class="b-image-info">(.*?)</ul>|sui',$str,$proxy);  
  
   foreach($proxy[0] as $a){
      preg_match('|img_url=(.*?)&from|sui',$a,$d);
      preg_match('|<li class="text">(.*?)</li>|sui',$a,$s);
      $arr=array('img_url=','&from');
      $url=str_replace($arr,'',urldecode($d[0]));
      $text=htmlspecialchars(strip_tags($s[0]));
      echo $text.'
'.$url.'<hr>';
    $j++;
    if($j==$n){
      exit();
    } 
   }
  }
}
?>

Результат работы скрипта:

Абстракция от Joey G. Абстракция 3D.
kilobit.hit.bg/k21%20copy.jpg
Абстракция.
img-fotki.yandex.ru/get/5705/dunaygald.1/0_5e038_b02b5e59_XL
Кисть для фотошопа - Взрывная абстракция.
www.bati-referaty.net.ua/uploads/posts/2008-10/1224857031_vzryv_kisti.jpg
Абстракция для твоего рабочего стола.
img12.nnm.ru/f/c/6/9/a/dd708b0344e874d925d9a60306b_prev.jpg
Сообщений: n/a. Абстракция.
www.allipodtouchwallpapers.com/images/wallpapers/j2i3jb4py.jpg
Графика, узоры, абстракции Фотохостинг.
i15.ltalk.ru/26/86/28626/67/745367/1451.jpeg

Теги: рубрика PHP