Парсим прямой эфир Яндекса
Написал PHP скрипт для парсинга поисковых запросов с прямого эфира Яндекса. Код ниже:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 | <?php ############################################################### # # Parser Yandex pryamoj efir by beerhack from http://beerhack.name # ICQ: 274717 # ############################################################### header('Content-Type: text/html;charset=utf-8'); set_time_limit(0); if(!empty($_POST['howmany'])): ?> <?php $howmany = $_POST['howmany']; $seconds = $_POST['sleep']; $filename = $_POST['filename']; function curlFunc($url){ $ch = curl_init(); curl_setopt($ch, CURLOPT_HEADER, 0); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_TIMEOUT, 10); curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/536.11 (KHTML, like Gecko) Chrome/20.0.1132.57 Safari/536.11"); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); $result = curl_exec($ch); curl_close($ch); return $result; } for($i=1; $i<=$howmany; $i++){ $url ='http://livequeries-front.corba.yandex.net/queries/?ll1=41.17915089295261,20.867207593750013&ll2=55.63987388074816,47.278340406250024&limit=1000'; $str = curlFunc($url); if(preg_match_all('/query text="([^"]+)"/i',$str,$match)>0){ foreach($match[1] as $key){ $key = trim($key); $f = fopen($filename,'at'); fwrite($f,$key."\n"); fclose($f); } echo "$i тыс. - готово<br>"; flush(); ob_flush(); } else { echo "Ой, что-то на $i тыс. какие-то проблемки. Попробуем снова.<br>"; flush(); ob_flush(); $i--; } sleep($seconds); } ?> <?php else : ?> <html> <form method="POST" action=""> Сколько тысяч собрать? <input type="text" name="howmany" value="1"><br> Можно задержку поставить в секундах <input type="text" name="sleep" value="0"><br> Куда сохранить? <input type="text" name="filename" value="resultp.txt"><br> <input type="submit" value="START"> </form> </html> <?php endif; ?> |
Либо скачать скрипт — ParserYandex.rar пароль к файлу: beerhack.name
В скрипте править ничего не надо. Сделал небольшой GUI, поэтому просто запускаем скрипт, вводим данные: сколько тысяч поисковых запросов собрать, задержку в секундах и имя файла куда всё сохранить.
Спарсил около 1 000 000 поисковых запросов, проблем не возникло. Только чистку на дубли сами делайте отдельно, там их аж около 80% будет.
Обновлено 15.01.2013
Обновил скрипт. Добавил проверку на уникальность.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 | <?php ############################################################### # # Parser Yandex pryamoj efir by beerhack from http://beerhack.name # ICQ: 274717 # ############################################################### header('Content-Type: text/html;charset=utf-8'); set_time_limit(0); if(!empty($_POST['howmany'])): ?> <?php $howmany = $_POST['howmany']; $seconds = $_POST['sleep']; $filename = $_POST['filename']; $unic = (isset($_POST['unic']) && $_POST['unic']=='ok'); function curlFunc($url){ $ch = curl_init(); curl_setopt($ch, CURLOPT_HEADER, 0); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_TIMEOUT, 10); curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.97 Safari/537.11"); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); curl_setopt($ch, CURLOPT_REFERER, 'http://company.yandex.ru/researches/interes/'); $result = curl_exec($ch); curl_close($ch); return $result; } for($i=1; $i<=$howmany; $i++){ $url ='http://livequeries-front.corba.yandex.net/queries/?ll1=-1.7356459922329044,-1.9623822499999828&ll2=84.54750547846963,209.32668025&limit=1000'; $str = curlFunc($url); if(preg_match_all('/query text="([^"]+)"/i',$str,$match)>0){ foreach($match[1] as $key){ $key = str_replace('"', '"', $key); $keyArray[] = trim($key); } if($unic){ $keyArray = array_unique($keyArray); if(file_exists($filename)){ $keysInFile = file($filename); foreach($keysInFile as $key){ $keysInFileArray[] = trim($key); } $unicKeys = array_diff($keyArray, $keysInFileArray); } else { $unicKeys = $keyArray; } $howmanyfact += sizeof($unicKeys); $keys = $unicKeys; } else { $keys = $keyArray; } foreach($keys as $key){ $f = fopen($filename,'at'); fwrite($f,$key."\n"); fclose($f); } echo "$i тыс. - готово<br>"; flush(); ob_flush(); } else { echo "Ой, что-то на $i тыс. какие-то проблемки. Попробуем снова.<br>"; flush(); ob_flush(); $i--; } sleep($seconds); } if($unic){ echo "Закончили работу. Собрали все $howmany тысяч кейвордов. Из них $howmanyfact уникальных, которые сохранены в файл $filename."; } else { echo "Закончили работу. Собрали все $howmany тысяч кейвордов, которые сохранены в файл $filename. На уникальность не проверялись."; } ?> <?php else : ?> <html> <form method="POST" action=""> Сколько тысяч собрать? <input type="text" name="howmany" value="1"><br> Можно задержку поставить в секундах <input type="text" name="sleep" value="0"><br> Куда сохранить? <input type="text" name="filename" value="resultp.txt"><br> Проверить на уникальность по окончании? <input type="checkbox" name="unic" value="ok"><br> <input type="submit" value="START"> </form> </html> <?php endif; ?> |
Можете наблюдать за ходом развития скрипта на гитхабе https://github.com/beerhack/ParserYandexOnline
Пакуй файлы в zip. Или вообще выкладывай где-то на гитхабе. Rar это не круто, для таких маленьких файлов =\
Ответитьmr.The, я вообще не вижу/не знаю разницы между rar и zip)
ОтветитьРазница, например, в том, что зип есть в винде по умолчанию, а рар надо, по идее, покупать, хотя хз, кто это делает, он на каждом углу валяется «вылеченный» :)
ОтветитьDimaX, я думал винрар у всех есть)
ОтветитьДа практически у всех, наверное, я тоже в рар все пакую по привычке.
З.Ы. Поставил бы плагин subscribe to comments, чтобы на мыло приходили уведомления о новых комментах там.
ОтветитьСпасибо за скрипт, расскажи как много напарсил им ключевиков, дублей реально слишком много :)
Ответитьnoq3d, как выше писал, 1кк спарсил, больше не запускал пока.
ОтветитьСкрипт хороший. При нулевой задержке парсит очень быстро. Мне казалось прямой эфир отдайт 20 слов в секунду. Но тут сбор идёт намного быстрее. Но хотелось бы иметь поле куда можно прокси поместить, а то приходится часто перезапускать.
ОтветитьПо крону запустить не получится, так как там ещё кнопку старт надо нажать. Или нужно в скрипт добавить принудительный перезапуск без изменения параметров каждый 5 минут к примеру.
ОтветитьЯ поторопился с выводами. Когда стал проверять результаты, выяснилось, что если ставить нулевую задержку, то скрипт много раз дёргает одни и те же данные видимо. В общем порядка 200 дублей одного ключа в файле. После удаления повторов в kwk – из 200 мегового файла получается 600 килобайт. Я с 3-х гигов в UTF-8, получил после удаления дублей до чистки 163 тыс ключей всего. Вот пример 200 мегового файла: http://rghost.ru/private/40853101/b2444587cae33c811e9ad39f3bd9297c
ОтветитьСергей, у меня при нулевой задержке получается 80-90% дублей.
ОтветитьБирхак (автор), бля, пиздато ты спалил урл этот, у тебя там какие координаты стоят по умолчанию? Я тут устроил парсинг с 10 серверов last20.xml который, на капчу уже потратил бабла) но код гавно) надо написать здесь чтобы чекал на кол-во дублей, если скажем 200 дублей – увеличивать задержку, если 10 – уменьшать, курл походу вообще не нужен. Там еще один параметр есть – nc, не знаешь что он определяет?
ОтветитьСпасибо автору!!) прям то что искал.
я не критикую, но
курл соединение лучше не закрывать каждый раз.
дописал, и чуток сократил, покоментил.
http://files.mail.ru/QAXQMN
разрешаю автору по желанию удалить мой пост))
ОтветитьИЗЗВИНЯЮСЬ , не та ссылка
Ответитьhttp://files.mail.ru/JC7VRH
Станислав, я на днях переписал скрипт, скоро обновлю и здесь.
Ответитьсделал чтоб повторения в файл не записывались.
правда, учтите что пока все страницы не скачает – в файл писать не станет, а будет складывать все себе в оперативку.
если вы поставите 100 000 тыс. (100 миллионов) у вас примерно 4 гига оперативки забъеться)) и все слетит.. и в файлик ни одна запись не попадет
http://vasia.p.ht/parseryandex.zip
Ответитьможете пожалуйста рассказать, как вы нашли эту ссылку?
http://livequeries-front.corba.yandex.net/queries/?ll1=41.17915089295261,20.867207593750013&ll2=55.63987388074816,47.278340406250024&limit=1000
на какой странице можно ее найти? я бы хотел разобраться что за параметры в ней. по тому что кажеться, перестало выдавать эта ссылка новые запросы, а выдает только старые.
Ответитья разобрался. береться с от сюда.
http://company.yandex.ru/researches/interes/
если разобрать ссылку то получаеться что
ll1 (долгота, широта) — левая нижняя точка на карте
ll2 (долгота, широта) — правая верхняя точка на карте
limit — максимум результатов в выдаче
nc — рандомное число
(нашел в интернете эту расшифровку)
получаеться что лучше парсить по вот такой ссылке:
$url =’http://livequeries-front.corba.yandex.net/queries/?ll1=0,0&ll2=100,100&limit=10000&nc=0.18833153694868088′;
будут выводиться русские запросы со всего мира. меньше повторений, больше результата, да и выводиться 3тыс+ за каждое скачивание.
Ответитьэти запросы даже умудряються продавать))) хах) и даже… покупать.
http://forum.searchengines.ru/archive/index.php/t-744967.html
оно ж все в открытом доступе есть!
ОтветитьСтанислав, я тоже добавил проверку на уникальность, но у меня сразу пишет. Надеюсь на выходных обновлю и здесь скрипт. А вообще можно вот у меня на гитхабе посмотреть https://github.com/beerhack/ParserYandexOnline
ОтветитьТолько у меня одни дубли выдает ? 50000 спарсил и все, одни повторы.
ОтветитьЕвгений, я выше и писал, что дублей будет процентов 80. Попробуй задержку больше поставить.
ОтветитьЗадержки ? Неделя прошла. У мня все пишется в базу и идет подсчет. Я вижу что уже все, 50000 ключей и больше уникальных не добавляет ( одни повторы
ОтветитьСкажите пожалуйста в какой кодировке скрипт txt файл пишет? Мне нужно в win-1251 как это сделать?
Ответитьserg, UTF-8. Если нужна другая — открой файл, допустим в Notepad++, и преобразуй в нужную тебе кодировку.
ОтветитьА можно сделать что бы скрипт изначально писал файл resultp.txt в кодировке 1251?
ОтветитьСайт на Joomla 1/5 файл resultp.txt на сайте Joomla 1/5 открывается в кракозябрах, хотя сайт в UTF-8
ОтветитьРазобрался оказывается сервер сам кодировку менял, прописал нужную директиву все ок. Еще вопрос можно ли так сделать, что бы данные прописывались в файл resultp.txt каждый раз новые, удаляя предыдущие?
Ответитьserg, не вижу необходимости.
ОтветитьА Яндекс не ЗАБАНИТ?
ОтветитьAzZ, пока что не банит.
ОтветитьПодскажите, какие надо координаты сделать чтобы собирать запросы только с России. Заранее спасибо!
ОтветитьВасилий, где-то вот такие ll1=46.04435783386966,30.557149000000035&ll2=80.06850482006591,136.37746150000007
Ответитьпри первом запуске
количество записей 10
задержка 0
проверка на уникальность да
было сохранено 30000 ключей
далее пробовал менать параметры
количество записей 10-100
задержка 0-60
во всех случаях в конце процесса было 0 новых записей записано в файл
вопрос
есть зависимость количества сбора ключей, задержки на парсинг новых ключей?
предположение..
Ответитьданные парсятся из базы яндеха где они отсортированы по времени и
и к показу по запросу выданы самые «старые» с ограничением .. ну скажем первые 100000 записей, по прошествии времени (узнать бы какого) яндех пишет первые 100000 в архив, удаляет их из текущей таблицы и тогда их место занимают новые записи..
Алекс, поэкспериментируй – напиши результат, думаю, всем будет интересно.
ОтветитьКак ни пытался понять, откуда всплыла ссылка, так и не получилось.
ОтветитьСамый эффект тут от этой ссылки. Потыкался в swf объекты, там нет намёка на эту ссылку.
Как считаете не закроют её?
Max, я сниффером её выловил. Думаю, не закроют.
ОтветитьЧто-то думается мне, это какая то разводка ядексовская, т.е. выделено небольшое колво поисковых запросов из базы, которые все время повторяются
Вот написал тестовый скриптик, для онлайн мониторинга и вылавливанию нужных запросов:
Ответитьhttp://pastebin.com/Bs948h67
Вот лог работы
http://pastebin.com/kGrHjipr
ага, не исключено.
Ответитьага, немного переписал скрипт:
http://pastebin.com/s34CErTk
Вод лог 35 запросов:
http://pastebin.com/TQeqTciT
Как видим уникальных ключей всего 10165
Ответитьнабросал скрипт, который, сохраняет полученые ключи не в памяти php, а в memcached для того что бы отсеять дубли:
Ответитьhttps://github.com/cocain/yandexonair/blob/master/yandexonair.php
скрипт может работать месяцами, но опять же, исходя из того, что из, почти 5к запросов, получено ~18000 ключей, смысл в этом теряется:
~~~~~~~~~~~~~~~~~~~~~~
[+] query: 4723
[+] Matches count: 4170
[~] Uniq: 18516
~~~~~~~~~~~~~~~~~~~~~~
я делал дескоптный вариант по аналогии, у меня в сутки не более 50к уникальных запросов, у меня два предположения:
1 яндекс видит что его парсят и ограничивает базу, вывод: использовать прокси и подставлять разные координаты
2 это имитация прямого эфира
если кто попробует с использованием проксей, опишитесь о результатах
Ответитьрасслабьтесь, похоже с июня лафу прикрыли
Ответитьв эфире постоянно повторяющиеся запросы давности в несколько месяцев..
Да – нас обманули – нет никакого прямого эфира – просто рандомно берутся кеи и выдаются за прямой эфир
Ответить