Парсим прямой эфир Яндекса

прямой эфир Yandex

Написал 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('&quot;', '"', $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

14.08.2012
Метки:

Комментарии:

  1. Пакуй файлы в zip. Или вообще выкладывай где-то на гитхабе. Rar это не круто, для таких маленьких файлов =\

    Ответить
  2. mr.The, я вообще не вижу/не знаю разницы между rar и zip)

    Ответить
  3. Разница, например, в том, что зип есть в винде по умолчанию, а рар надо, по идее, покупать, хотя хз, кто это делает, он на каждом углу валяется «вылеченный» :)

    Ответить
  4. DimaX, я думал винрар у всех есть)

    Ответить
  5. Да практически у всех, наверное, я тоже в рар все пакую по привычке.

    З.Ы. Поставил бы плагин subscribe to comments, чтобы на мыло приходили уведомления о новых комментах там.

    Ответить
  6. Спасибо за скрипт, расскажи как много напарсил им ключевиков, дублей реально слишком много :)

    Ответить
  7. noq3d, как выше писал, 1кк спарсил, больше не запускал пока.

    Ответить
  8. Скрипт хороший. При нулевой задержке парсит очень быстро. Мне казалось прямой эфир отдайт 20 слов в секунду. Но тут сбор идёт намного быстрее. Но хотелось бы иметь поле куда можно прокси поместить, а то приходится часто перезапускать.

    Ответить
  9. По крону запустить не получится, так как там ещё кнопку старт надо нажать. Или нужно в скрипт добавить принудительный перезапуск без изменения параметров каждый 5 минут к примеру.

    Ответить
  10. Я поторопился с выводами. Когда стал проверять результаты, выяснилось, что если ставить нулевую задержку, то скрипт много раз дёргает одни и те же данные видимо. В общем порядка 200 дублей одного ключа в файле. После удаления повторов в kwk – из 200 мегового файла получается 600 килобайт. Я с 3-х гигов в UTF-8, получил после удаления дублей до чистки 163 тыс ключей всего. Вот пример 200 мегового файла: http://rghost.ru/private/40853101/b2444587cae33c811e9ad39f3bd9297c

    Ответить
  11. Сергей, у меня при нулевой задержке получается 80-90% дублей.

    Ответить
  12. Бирхак (автор), бля, пиздато ты спалил урл этот, у тебя там какие координаты стоят по умолчанию? Я тут устроил парсинг с 10 серверов last20.xml который, на капчу уже потратил бабла) но код гавно) надо написать здесь чтобы чекал на кол-во дублей, если скажем 200 дублей – увеличивать задержку, если 10 – уменьшать, курл походу вообще не нужен. Там еще один параметр есть – nc, не знаешь что он определяет?

    Ответить
  13. Спасибо автору!!) прям то что искал.

    я не критикую, но

    курл соединение лучше не закрывать каждый раз.
    дописал, и чуток сократил, покоментил.

    http://files.mail.ru/QAXQMN

    разрешаю автору по желанию удалить мой пост))

    Ответить
  14. ИЗЗВИНЯЮСЬ , не та ссылка
    http://files.mail.ru/JC7VRH

    Ответить
  15. Станислав, я на днях переписал скрипт, скоро обновлю и здесь.

    Ответить
  16. сделал чтоб повторения в файл не записывались.

    правда, учтите что пока все страницы не скачает – в файл писать не станет, а будет складывать все себе в оперативку.

    если вы поставите 100 000 тыс. (100 миллионов) у вас примерно 4 гига оперативки забъеться)) и все слетит.. и в файлик ни одна запись не попадет

    http://vasia.p.ht/parseryandex.zip

    Ответить
  17. можете пожалуйста рассказать, как вы нашли эту ссылку?

    http://livequeries-front.corba.yandex.net/queries/?ll1=41.17915089295261,20.867207593750013&ll2=55.63987388074816,47.278340406250024&limit=1000

    на какой странице можно ее найти? я бы хотел разобраться что за параметры в ней. по тому что кажеться, перестало выдавать эта ссылка новые запросы, а выдает только старые.

    Ответить
  18. я разобрался. береться с от сюда.
    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тыс+ за каждое скачивание.

    Ответить
  19. эти запросы даже умудряються продавать))) хах) и даже… покупать.
    http://forum.searchengines.ru/archive/index.php/t-744967.html

    оно ж все в открытом доступе есть!

    Ответить
  20. Станислав, я тоже добавил проверку на уникальность, но у меня сразу пишет. Надеюсь на выходных обновлю и здесь скрипт. А вообще можно вот у меня на гитхабе посмотреть https://github.com/beerhack/ParserYandexOnline

    Ответить
  21. Только у меня одни дубли выдает ? 50000 спарсил и все, одни повторы.

    Ответить
  22. Евгений, я выше и писал, что дублей будет процентов 80. Попробуй задержку больше поставить.

    Ответить
  23. Задержки ? Неделя прошла. У мня все пишется в базу и идет подсчет. Я вижу что уже все, 50000 ключей и больше уникальных не добавляет ( одни повторы

    Ответить
  24. Скажите пожалуйста в какой кодировке скрипт txt файл пишет? Мне нужно в win-1251 как это сделать?

    Ответить
  25. serg, UTF-8. Если нужна другая — открой файл, допустим в Notepad++, и преобразуй в нужную тебе кодировку.

    Ответить
  26. А можно сделать что бы скрипт изначально писал файл resultp.txt в кодировке 1251?

    Ответить
  27. Сайт на Joomla 1/5 файл resultp.txt на сайте Joomla 1/5 открывается в кракозябрах, хотя сайт в UTF-8

    Ответить
  28. Разобрался оказывается сервер сам кодировку менял, прописал нужную директиву все ок. Еще вопрос можно ли так сделать, что бы данные прописывались в файл resultp.txt каждый раз новые, удаляя предыдущие?

    Ответить
  29. serg, не вижу необходимости.

    Ответить
  30. А Яндекс не ЗАБАНИТ?

    Ответить
  31. AzZ, пока что не банит.

    Ответить
  32. Подскажите, какие надо координаты сделать чтобы собирать запросы только с России. Заранее спасибо!

    Ответить
  33. Василий, где-то вот такие ll1=46.04435783386966,30.557149000000035&ll2=80.06850482006591,136.37746150000007

    Ответить
  34. при первом запуске
    количество записей 10
    задержка 0
    проверка на уникальность да
    было сохранено 30000 ключей

    далее пробовал менать параметры
    количество записей 10-100
    задержка 0-60

    во всех случаях в конце процесса было 0 новых записей записано в файл

    вопрос
    есть зависимость количества сбора ключей, задержки на парсинг новых ключей?

    предположение..
    данные парсятся из базы яндеха где они отсортированы по времени и
    и к показу по запросу выданы самые «старые» с ограничением .. ну скажем первые 100000 записей, по прошествии времени (узнать бы какого) яндех пишет первые 100000 в архив, удаляет их из текущей таблицы и тогда их место занимают новые записи..

    Ответить
  35. Алекс, поэкспериментируй – напиши результат, думаю, всем будет интересно.

    Ответить
  36. Как ни пытался понять, откуда всплыла ссылка, так и не получилось.
    Самый эффект тут от этой ссылки. Потыкался в swf объекты, там нет намёка на эту ссылку.
    Как считаете не закроют её?

    Ответить
  37. Max, я сниффером её выловил. Думаю, не закроют.

    Ответить
  38. Что-то думается мне, это какая то разводка ядексовская, т.е. выделено небольшое колво поисковых запросов из базы, которые все время повторяются

    Вот написал тестовый скриптик, для онлайн мониторинга и вылавливанию нужных запросов:
    http://pastebin.com/Bs948h67
    Вот лог работы
    http://pastebin.com/kGrHjipr

    Ответить
  39. ага, не исключено.

    Ответить
  40. ага, немного переписал скрипт:
    http://pastebin.com/s34CErTk
    Вод лог 35 запросов:
    http://pastebin.com/TQeqTciT

    Как видим уникальных ключей всего 10165

    Ответить
  41. набросал скрипт, который, сохраняет полученые ключи не в памяти php, а в memcached для того что бы отсеять дубли:
    https://github.com/cocain/yandexonair/blob/master/yandexonair.php
    скрипт может работать месяцами, но опять же, исходя из того, что из, почти 5к запросов, получено ~18000 ключей, смысл в этом теряется:
    ~~~~~~~~~~~~~~~~~~~~~~
    [+] query: 4723
    [+] Matches count: 4170
    [~] Uniq: 18516
    ~~~~~~~~~~~~~~~~~~~~~~

    Ответить
  42. я делал дескоптный вариант по аналогии, у меня в сутки не более 50к уникальных запросов, у меня два предположения:
    1 яндекс видит что его парсят и ограничивает базу, вывод: использовать прокси и подставлять разные координаты
    2 это имитация прямого эфира

    если кто попробует с использованием проксей, опишитесь о результатах

    Ответить
  43. расслабьтесь, похоже с июня лафу прикрыли
    в эфире постоянно повторяющиеся запросы давности в несколько месяцев..

    Ответить
  44. Да – нас обманули – нет никакого прямого эфира – просто рандомно берутся кеи и выдаются за прямой эфир

    Ответить