Парсер картиночной выдачи яндекса
Сегодня мы будем писать “Парсер картиночной выдачи яндекса“.
Наши задачи:
- На входе вводить запрос для поиска и количество картинок
- Получение текста и нужное количество картинок
- Обработка запроса
- Вывод комментарий и ссылок
Итак поехали.
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