Pull to refresh

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

Здравствуйте, пользователи хабра!
Сегодня мы будем писать "Парсер картиночной выдачи яндекса".

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

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

Напишем простую форму:
<form action="" method="post">
Запрос:<input type="text" name="text"><br>
Сколько картинок:<input type="text" name="num"><br>
<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"><br>
Сколько картинок:<input type="text" name="num"><br>
<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.'<br>'.$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
Tags:
Hubs:
You can’t comment this publication because its author is not yet a full member of the community. You will be able to contact the author only after he or she has been invited by someone in the community. Until then, author’s username will be hidden by an alias.