С помощью чего можно получить список страниц в яндексе

1 23
fima32
На сайте с 12.01.2006
Offline
132
#21

Все понял, это я туплю, не понял сразу что Вы исходник обновили

Спасибо, а то я запарился уже такой скрипт искать и ручками проверять каждый урл

Ilya_1982
На сайте с 03.11.2006
Offline
101
#22

уже не раз замечаю, что Яндекс отдает через браузер одно количество страниц, а когда парсишь с помощью PHP (даже если ставить паузы в несколько секунд между запросами), то отдает меньшее количество страниц, причем бывает даже так, что вместо 25 страниц может отдавать по 5-6 страниц.

Никто не знает как с этим бороться?

P.S.: В заголовке отправки ставлю, что это Explorer или Opera, а также число q для запроса каждый раз генерю датчиком случайных чисел.

upyrj
На сайте с 17.09.2005
Offline
140
#23
Ilya_1982:
число q для запроса каждый раз генерю датчиком случайных чисел

А это зачем? Не проще ли переходить по ссылке «Следующая»?

Денис Иванов Важно: обменом валют я не занимаюсь.
Петр Елагин
На сайте с 21.03.2007
Offline
197
#24
Ilya_1982:
уже не раз замечаю, что Яндекс отдает через браузер одно количество страниц, а когда парсишь с помощью PHP (даже если ставить паузы в несколько секунд между запросами), то отдает меньшее количество страниц, причем бывает даже так, что вместо 25 страниц может отдавать по 5-6 страниц.

Никто не знает как с этим бороться?

P.S.: В заголовке отправки ставлю, что это Explorer или Opera, а также число q для запроса каждый раз генерю датчиком случайных чисел.

а нельзя формировать масив запросов и через курл их брать все разом ?

Ilya_1982
На сайте с 03.11.2006
Offline
101
#25
upyrj:
А это зачем? Не проще ли переходить по ссылке «Следующая»?

проще было создать запрос, чем парсить Следующая. За идею спасибо, попробую ☝

AlienZzzz:
а нельзя формировать масив запросов и через курл их брать все разом ?

спасибо, тоже попробую. ☝

Только вопрос остается открытым: описанная проблема -- это защита Яндекса от парсинга?

upyrj
На сайте с 17.09.2005
Offline
140
#26

При каждом новом параметре q он снова генерит вам выдачу. Если вы его берете «от балды», то ничто не мешает вам его вообще не включать в запрос.

То есть так раньше было... сейчас посмотрел повнимательнее:

параметры q вообще пропали из листалки!

Имейте в виду, что есть (1) склейка по сниппетам «на лету» (проявляется в том, что число результатов выдачи уменьшается при ее листании) и (2) ваш браузер и ваш сервер могут попадать на разные фронт-сервера.

Ilya_1982
На сайте с 03.11.2006
Offline
101
#27
upyrj:
При каждом новом параметре q он снова генерит вам выдачу. Если вы его берете «от балды», то ничто не мешает вам его вообще не включать в запрос.

То есть так раньше было... сейчас посмотрел повнимательнее:
параметры q вообще пропали из листалки!

Имейте в виду, что есть (1) склейка по сниппетам «на лету» (проявляется в том, что число результатов выдачи уменьшается при ее листании) и (2) ваш браузер и ваш сервер могут попадать на разные фронт-сервера.

отдаю следующий запрос на яндекс:

$page = "http://www.yandex.ru/yandsearch?&p=".$i."&text=link%3D%22www.cgstudio.ru%2A%22";

$url = "yandex.ru";

$fp = fsockopen($url, "80", $errno, $errstr, 30);

$out = "GET ".$page." HTTP/1.0\r\n";

$out .= "Host: ".$url."\r\n";

$out .= "User-Agent: Opera/7.23 (Windows NT 5.0; U)\r\n";

$out .= "Connection: Close\r\n\r\n";

fputs($fp, $out);

while (!feof($fp))

{

$content_tmp = fgets($fp, 128);

$content .= $content_tmp;

}

fclose($fp);

так вот я получаю от Яндекса следующий ответ:

HTTP/1.1 302 Found

Date: Fri, 03 Aug 2007 10:32:13 GMT

Server: Apache/1.3.29 (Unix) mod_perl/1.29 mod_deflate/1.0.21 rus/PL30.19

Location: http://www.yandex.ru/yandsearch?&p=0&text=link%3D%22www.cgstudio.ru%2A%22

Connection: close

Content-Type: text/html; charset=iso-8859-1

<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">

<HTML><HEAD>

<TITLE>302 Found</TITLE>

</HEAD><BODY>

<H1>Found</H1>

The document has moved <A HREF="http://www.yandex.ru/yandsearch?&amp;p=0&amp;text=link%3D%22www.cgstudio.ru%2A%22">here</A>.<P>

</BODY></HTML>

Кто знает как решить проблему?

upyrj
На сайте с 17.09.2005
Offline
140
#28

Проконсультируйтесь со спецом. IMHO, должно помочь следующее:

Ilya_1982:
$url = "yandex.ru";
$fp = fsockopen($url, "80", $errno, $errstr, 30);
$out .= "Host: ".$url."\r\n";

www. в $url допишите.

Ilya_1982:
$page = "http://www.yandex.ru/yandsearch?&p=".$i."&text=link%3D%22www.cgstudio.ru%2A%22";
$out = "GET ".$page." HTTP/1.0\r\n";

И $page должно быть "/yandsearch?&p=".$i."&text=link%3D%22www.cgstudio.ru%2A%22";

Ilya_1982
На сайте с 03.11.2006
Offline
101
#29
upyrj:
Проконсультируйтесь со спецом. IMHO, должно помочь следующее:


www. в $url допишите.


И $page должно быть "/yandsearch?&p=".$i."&text=link%3D%22www.cgstudio.ru%2A%22";

Помогло вместо всей этой штуки с заголовками просто забирать страницу с помощью функции file_get_contents ().

fima32
На сайте с 12.01.2006
Offline
132
#30
Stalker-g2:
собственно говоря такой скрипт на перле, размещённый в папке c:\crawler откроет файлик sitemap.txt, который содержит на каждой строке по ссылке и разобьёт его на 2 файла sitemap.ind.txt и sitemap.noind.txt - проиндексированные и непроиндексированные странички.
use strict;

use LWP::Simple;

open SITEMAP, "<c:\\Crawler\\sitemap.txt";

my @url_list;
my $url;

while(<SITEMAP>) {
chomp;

$_ =~ /href=\"(.*)\"/;
$url = $1;

# %2F = /
# %3F = ?
# %3D = =
# %26 = &

$url =~ s/\/$//;

while($url =~ s/http:\/\///) {};
while($url =~ s/\//\%2F/) {};
while($url =~ s/\?/\%3F/) {};
while($url =~ s/=/\%3D/) {};
while($url =~ s/\&/\%26/) {};
while($url =~ s/ //) {};

push @url_list, $url;
}

while($url = pop @url_list) {
my $link = "http://www.yandex.ru/yandsearch?rpt=rad&text=url%3D%22$url%22";
my $content = get $link;

if($content =~ /Сохраненная копия/) {
while($url =~ s/\%2F/\//) {};
while($url =~ s/\%3F/\?/) {};
while($url =~ s/\%3D/\=/) {};
while($url =~ s/\%26/\&/) {};

open SITEMAPIND, ">>c:\\Crawler\\sitemap.ind.txt";
print SITEMAPIND "http://$url\n";
close SITEMAPIND;
print "\nIND: $url\n";
}
else {
while($url =~ s/\%2F/\//) {};
while($url =~ s/\%3F/\?/) {};
while($url =~ s/\%3D/\=/) {};
while($url =~ s/\%26/\&/) {};

open SITEMAPNOIND, ">>c:\\Crawler\\sitemap.noind.txt";
print SITEMAPNOIND "http://$url\n";
close SITEMAPNOIND;

print "\nNOIND: $url\n";
}
sleep 1;
}

Я Ваш скриптик чуток доделал, чтобы он проверял страницы формата:

www.site.ru/page1/ и www.site.ru/page1.html

use strict;

use LWP::Simple;

open SITEMAPIND, ">sitemap.noind.txt";
close SITEMAPIND;
open SITEMAPNOIND, ">sitemap.noind.txt";
close SITEMAPNOIND;
open MYLOG, ">log.txt";
close MYLOG;

open SITEMAP, "<sitemap.txt";

my @url_list;
my $url;

while(<SITEMAP>) {
chomp;

#$_ =~ /href=\"(.*)\"/;
$url = $_;

# %2F = /
# %3F = ?
# %3D = =
# %26 = &

while($url =~ s/http:\/\///) {};
while($url =~ s/\//\%2F/) {};
while($url =~ s/\?/\%3F/) {};
while($url =~ s/=/\%3D/) {};
while($url =~ s/\&/\%26/) {};
while($url =~ s/ //) {};

push @url_list, $url;
}

while($url = pop @url_list) {
my $link;
my $url_slash;
my $url_slash_no_www;

my $url_no_www = $url;
$url_no_www =~ s/www\.//;

if($url =~ /\%2F$/) {
$url =~ /(.*)\%2F$/;
$url_slash = $1;
$url_slash_no_www = $url_slash;
$url_slash_no_www =~ s/www\.//;
# $link = "http://www.yandex.ru/yandsearch?rpt=rad&text=url%3D%22$url%22+%7C+url%3D%22$url_slash%22+%7C+url%3D%22$url_no_www%22+%7C+url%3D%22$url_slash_no_www%22";
$link = "http://www.yandex.ru/yandsearch?rpt=rad&text=url%3D%22$url_slash%22+%7C+url%3D%22$url_slash_no_www%22";
}
else {
$link = "http://www.yandex.ru/yandsearch?rpt=rad&text=url%3D%22$url%22+%7C+url%3D%22$url_no_www%22";

}

open MYLOG, ">>log.txt";
print MYLOG "$link\n";
close MYLOG;

my $content = get $link;

if($content =~ /&#209;&#238;&#245;&#240;&#224;&#237;&#229;&#237;&#237;&#224;&#255; &#234;&#238;&#239;&#232;&#255;/) {
while($url =~ s/\%2F/\//) {};
while($url =~ s/\%3F/\?/) {};
while($url =~ s/\%3D/\=/) {};
while($url =~ s/\%26/\&/) {};

open SITEMAPIND, ">>sitemap.ind.txt";
print SITEMAPIND "http://$url\n";
close SITEMAPIND;
print "\nIND: $url\n";
}
else {
while($url =~ s/\%2F/\//) {};
while($url =~ s/\%3F/\?/) {};
while($url =~ s/\%3D/\=/) {};
while($url =~ s/\%26/\&/) {};

open SITEMAPNOIND, ">>sitemap.noind.txt";
print SITEMAPNOIND "http://$url\n";
close SITEMAPNOIND;

print "\nNOIND: $url\n";
}
sleep 1;
}
1 23

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий