|
|
|
| Начнем с http://www.msn.com/
Допустим, я хочу найти сайт httpd.apache.org по запросу "Windows" (по секрету: он на четвертой странице).
Начинаем мы работать со странички http://search.msn.com/results.aspx?FORM=MSNH&q=Windows
Как я понимаю - нужно устранить лишнее... Или найти нужное. Так как лишнего больше - наверное, проще устанить его. | |
|
|
|
|
|
|
|
для: Shorr Kan
(06.09.2005 в 02:40)
| | Самый простой способ - это брать страницу и извлекать ссылки при помощи регулярных выражений
<?php
// Извлекаем содержимое файла
$filename = 'results.htm';
$content = file_get_contents($filename);
// Извлекаем дату
$pattern = '|<li class="first">([^<]+)</li>|i';
preg_match_all($pattern,$content,$out);
echo "<pre>";
print_r($out[1]);
echo "</pre>";
?>
|
В результате получается массив следующего вида
Array
(
[0] => windows.oreilly.com
[1] => downloads-zdnet.com.com/2001-20-0.html?legacy=cnet
[2] => msdn.microsoft.com/embedded
[3] => msdn.microsoft.com/windowsvista
[4] => www.apple.com/quicktime/download/preview
[5] => www.macromedia.com/go/getflashplayer
[6] => spambayes.sourceforge.net/windows.html
[7] => httpd.apache.org/docs/1.3/windows.html
[8] => www.simonton.com
[9] => developer.ebay.com/windows
)
|
Остаётся только пройтись по нему в цикле и проверить имеется ли на данной странице ссылка или нет. | |
|
|
|
|
|
|
|
для: cheops
(06.09.2005 в 15:00)
| | Восхитительно. Спасибо. Теперь яхо:
<?
$filename = 'http://search.yahoo.com/search?p=Windows&fr=FP-tab-web-t&toggle=1&cop=&ei=UTF-8';
$content = file_get_contents($filename);
$pattern = '|<em class=yschurl>([^<]+)</em>|i';
preg_match_all($pattern,$content,$out);
echo "<pre>";
print_r($out[1]);
echo "</pre>";?>
|
Так оно не работает. Вернее работает, но выдает
Array
(
[0] => www.winmag.com
[1] => www.annoyances.org
)
|
Скромно.
С гуглом вообще ужасно - 66.102.9.104/search?q=cache: - после кэша там вообще неизвестно что... | |
|
|
|
|
|
|
|
для: Shorr Kan
(06.09.2005 в 17:31)
| | Тут проблема в том, что между двумя якорями, к которым мы присоединяемся имеются другие тэги, поэтому использовать [^<]+ не получится. Нужно испльзовать .+ в "нежадном" режиме. Результат будет немного замусорен тегами, но от них можно легко избавиться при помощи str_replace()
<?php
// Извлекаем содержимое файла
$filename = 'search.html';
$content = file_get_contents($filename);
// Извлекаем ссылки
$pattern = '|<em class=yschurl>(.+)</em>|Ui';
preg_match_all($pattern,$content,$out);
echo "<pre>";
print_r($out[1]);
echo "</pre>";
?>
|
| |
|
|
|
|
|
|
|
для: cheops
(06.09.2005 в 18:12)
| | Отлично, получилось. А гугл? | |
|
|
|
|
|
|
|
для: Shorr Kan
(06.09.2005 в 18:23)
| | C Google можно расправиться следующим образом
<?php
// Извлекаем содержимое файла
$filename = 'search.html';
$content = file_get_contents($filename);
// Извлекаем ссылки
$pattern = '|<font color=#008000>([^\s]+)[\s]|i';
preg_match_all($pattern,$content,$out);
echo "<pre>";
print_r($out[1]);
echo "</pre>";
?>
|
| |
|
|
|
|
|
|
|
для: Shorr Kan
(06.09.2005 в 02:40)
| | Приведу похожую тему с обсуждением разбора страниц Yandex http://www.softtime.ru/forum/read.php?id_forum=6&id_theme=2731 | |
|
|
|
|
|
|
|
для: cheops
(06.09.2005 в 18:40)
| | Все сработало. И, в принципе, все понятно... Кроме регулярных выражений. Это когда-нибудь... Даже не знаю, как собраться для них... | |
|
|
|
|
|
|
|
для: Shorr Kan
(06.09.2005 в 19:05)
| | Хм... Возникла проблема. В гугле и мсн как перескочить на последующие странички - понятно. Но как в яхе? Там что-то невообразимо-динамическое....
И еще - получить только домен из выдачи - как быстрее - explode, substr или регулярными? И если регулярными, то как? parse_url тут не работает - видимо из-за отсутствия http. Можно бы его прибавить, но кто знает - может быть дважды прибавится?..
И еще раз "еще" - в мсн у меня получилось, а вот в гугле - как? Там есть
<font size=-1 color=>Results <b>1</b> - <b>10</b> of about <b>447,000,000</b>
|
Как из этого вытащить 447,000,000 ? Причем, допуская, что вместо
<font size=-1 color=>Results <b>1</b> - <b>10</b>
| может быть, скажем,
<font size=-1 color=>Results <b>1</b> - <b>4</b>
|
p.s. Назрел еще один вопрос - как на некоем количестве страниц (допустим, на первых пяти) найти сайт в выдаче ? Я что-то сделал, проверил на одном - верно. На другом - нет. | |
|
|
|
|
|
|
|
для: Shorr Kan
(07.09.2005 в 09:12)
| | Так, т.е. вытаскиваем теперь общее число результатов запроса? | |
|
|
|
|
|
|
|
для: cheops
(07.09.2005 в 20:44)
| | Примерно, да.
1. Если послать туда запрос site:domain.com - получим количество проиндексированных страничек. Вот это дело и нужно вытащить со всех трех поисковиков. Смахивает, что я всякими strpos, substr и так далее - мсн победил... но, во-первых, есть еще яхо и гугл, а во-вторых - регулярными побыстрее будет, как мне кажется.
2. Аналогично - если туда послать link:domain.com
3. Скажем, я дал в поисковик задачку - глубина=500 сайтов. Это значит - первые 50 страниц. Взяли все и среди них найти нашу страничку (aaa.com). Как? Это означает, что нужно отбросить все, после .com , .net , .org (ну и так далее) , плюс отбросить все http:// и www. (если они есть) ну и сравнивать всю выдачу с нашим aaa.com . Кажется, эту задачу я решить могу, но какой-то грузный способ у меня - сравнение при помощи
substr($result,0,strlen($mysite))==$mysite or substr($result,0,strlen("www.".$mysite))=="www.".$mysite
| .
Из-за такой махинации нередко что-то не срабатывает.
Вот... Думаю, что я всю задачу изложил. | |
|
|
|
|
|
|
|
для: Shorr Kan
(08.09.2005 в 04:00)
| | 1-2) Дайте плиз конкретный пример, чтобы можно было загрузить страницу.
3) А что в переменной $mysite? | |
|
|
|
|
|
|
|
для: cheops
(08.09.2005 в 12:53)
| | 1. Как я понял, только для yahoo , и только для link: нужно вводить адрес с http://www. ... во всех остальных случаях - только domain.com
Вот это - ссылающиеся на вас люди.
http://search.yahoo.com/search?p=link%3Ahttp%3A%2F%2Fwww.softtime.ru&fr=FP-tab-web-t&toggle=1&cop=&ei=UTF-8
Это - проиндексированные странички вашего сайта.
http://search.yahoo.com/search?ei=UTF-8&fr=sfp&p=site%3Asofttime.ru
2. А в $mysite - то, что вводится после link: или site: . В вышеприведенных примерах - $mysite=="http://www.softtime.ru"; и $mysite=="softtime.ru";
p.s. Вот, кстати, и еще одна проблема - с http://www. ... Когда надо - его нет, когда нет - его надо... | |
|
|
|
|
|
|
|
для: Shorr Kan
(09.09.2005 в 01:33)
| | Ммм? :) | |
|
|
|
|
|
|
|
для: Shorr Kan
(09.09.2005 в 01:33)
| | 1) Насколько я понял нужна вот эта цифра?
<?php
// Извлекаем содержимое файла
$filename = 'opr000JR.htm';
$content = file_get_contents($filename);
// Извлекаем ссылки
$pattern = '|about <strong>([\d,]+)<\/strong> for|i';
preg_match_all($pattern,$content,$out);
echo "<pre>";
print_r($out[1]);
echo "</pre>";
?>
|
А скрипт подходит для обоих случаев? | |
|
|
|
|
|
|
|
для: Shorr Kan
(09.09.2005 в 01:33)
| | 2) А может вы приведёте по второму пункту конкретную страницу и какую информацию нужно извлечь? | |
|
|
|
|
|
|
|
для: cheops
(10.09.2005 в 01:47)
| | Array
(
[0] => 927
)
Вот выдало по ссылке http://search.yahoo.com/search?p=link%3Ahttp%3A%2F%2Fwww.softtime.ru&fr=FP-tab-web-t&toggle=1&cop=&ei=UTF-8
Однако, если идти по ней самостоятельно - там видно 921... Почему такое несоответствие? Причем, скрипт-то отработал явно правильно.
Аналогично и по ссылке http://search.yahoo.com/search?ei=UTF-8&fr=sfp&p=site%3Asofttime.ru
Results 1 - 100 of about 1,730
А скрипт выдает
Array
(
[0] => 1,740
)
======================================
Как сделать то же самое, но на
http://www.google.ru/search?hl=ru&ie=windows-1251&q=site%3Asofttime.ru&btnG=%CF%EE%E8%F1%EA+%E2+Google&lr=
http://www.google.ru/search?hl=ru&inlang=ru&ie=windows-1251&q=link%3Ahttp%3A%2F%2Fsofttime.ru&lr=
http://search.msn.com/results.aspx?FORM=MSNH&srch_type=0&q=link%3Asofttime.ru
http://search.msn.com/results.aspx?q=site%3Asofttime.ru&FORM=QBRE
? Извините, что так много, но их три штуки... и по два запроса на каждом....
По второму пункту... | |
|
|
|
|
|
|
|
для: Shorr Kan
(10.09.2005 в 02:13)
| | По второму пункту, при помощи того, что вы написали в первом же ответе:
<?php
// Извлекаем содержимое файла
$filename = 'results.htm';
$content = file_get_contents($filename);
// Извлекаем дату
$pattern = '|<li class="first">([^<]+)</li>|i';
preg_match_all($pattern,$content,$out);
echo "<pre>";
print_r($out[1]);
echo "</pre>";
?>
|
Мы получаем массив. Вот в этом массиве найти конкретный сайт. Его позицию. | |
|
|
|
|
|
|
|
для: Shorr Kan
(10.09.2005 в 02:15)
| | Сам сайт задаётся с протоколом http:// или без? | |
|
|
|
|
|
|
|
для: Shorr Kan
(10.09.2005 в 02:13)
| | Хм... а у меня нормально всё выдаёт... Может в этот момент чего-нибудь на самом сайте менялось...
1) В Google UTF-8 испльзуется, чтобы с ним не возится придётся брать третий результат (ссылка у меня не сработала - разбирал вот эту http://www.google.ru/search?hl=ru&inlang=ru&q=link%3Ahttp%3A%2F%2Fwww.softtime.ru&btnG=%D0%9F%D0%BE%D0%B8%D1%81%D0%BA&lr=)
<?php
// Извлекаем содержимое файла
$filename = 'opr000JR.htm';
$content = file_get_contents($filename);
// Извлекаем ссылки
$pattern = '|<b>([\d ]+)</b>|i';
preg_match_all($pattern,$content,$out);
echo $out[1][2];
?>
|
2) Для MSN можно вырезать цифру следующим образом
<?php
// Извлекаем содержимое файла
$filename = 'opr000JR.htm';
$content = file_get_contents($filename);
// Извлекаем ссылки
$pattern = '|of ([\d,]+) results|i';
preg_match_all($pattern,$content,$out);
echo "<pre>";
print_r($out[1]);
echo "</pre>";
?>
|
| |
|
|
|
|
|
|
|
для: cheops
(10.09.2005 в 13:04)
| | Похоже, немалая проблема с прописью протокола. Где-то надо задавать с ним, а где-то - без него. И рег. выражение выдает ошибку, если не угадать, как надо задавать в каждом конкретном случае... Как этого избежать? И скорее - как разобраться-то - с http:// или без него нужно?
Могу я вам выслать файл с кодом? А то там у меня путаница начинается. | |
|
|
|
|
|
|
|
для: Shorr Kan
(10.09.2005 в 21:48)
| | Давайте вообще новую тему заведём, а то эта слишком длинная и в ней продолжим обсуждение того, что осталось сделать. | |
|
|
|