mkth
Гость
|
|
« : 18-02-2010 17:38 » |
|
При парсинге имеем код примерно такого содержания var fr=''; document.write("iframe='http://somesite.php' id='gfdtrtrtre'></iframe>"); var fr=''; document.write("<iframe src='' id='gfdtrtrtre'></iframe>"); setTimeout("document.getElementById('iframe').src='http://goodsite.ru/php?sid=64564563&sesslid=Gtr216846hgf11'", 30000);
Каким образом можно извлечь урл вида src=' http://goodsite.ru/php?sid=64564563&sesslid=Gtr216846hgf11, вывести его на печать... Очень прошу помочь... Может не обязательно использовать регексп, а обойтись HTML Parser... Таким образом осуществляю запрос #!/usr/bin/perl
use LWP::UserAgent;
my $ua = LWP::UserAgent->new; $ua->agent('Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322)'); $ua->default_header('Referer' => "http://mysite.ru"); $ua->default_header('Accept' => "text/html"); $ua->default_header('Accept-Charset' => "windows-1251,utf-8");
my $response = $ua->get('http://site.com');
if ($response->is_success) { print $response->decoded_content; } else { die $response->status_line; }
Ответ как-то нужно закинуть в буфер и дальше с ним уже разбираться... Заранее большое спасибо за помощь!
|
|
|
Записан
|
|
|
|
RXL
Технический
Администратор
Offline
Пол:
|
|
« Ответ #1 : 18-02-2010 17:59 » |
|
Например: $response->decoded_content =~ m%document\.getElementById\('iframe'\)\.src\s*=\s*'\s*(.*?)\s*'%s; print "$1\n";
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
mkth
Гость
|
|
« Ответ #2 : 18-02-2010 18:47 » |
|
Например: $response->decoded_content =~ m%document\.getElementById\('iframe'\)\.src\s*=\s*'\s*(.*?)\s*'%s; print "$1\n";
Спасибо, че то выдает ошибку
|
|
|
Записан
|
|
|
|
mkth
Гость
|
|
« Ответ #3 : 18-02-2010 18:47 » |
|
Use of uninitialized value $1 in concatenation (.) or string at C:\script.pl line 17.
|
|
|
Записан
|
|
|
|
mkth
Гость
|
|
« Ответ #4 : 18-02-2010 19:15 » |
|
Убрал use warnings, но все равно че то ничего не пашет
|
|
|
Записан
|
|
|
|
mkth
Гость
|
|
« Ответ #5 : 18-02-2010 20:45 » |
|
#!/usr/bin/perl
use LWP::UserAgent;
my $ua = LWP::UserAgent->new; $ua->agent('Opera/9.02 (Windows NT 5.1; U; ru)'); $ua->default_header('Referer' => "http//mysite.ru"); $ua->default_header('Accept' => "text/html"); $ua->default_header('Accept-Charset' => "windows-1251");
my $response = $ua->get('http//site.ru');
if ($response->is_success) { $response->decoded_content =~ m%document\.getElementById\('iframe'\)\.src\s*=\s*'\s*(.*?)\s*'%s; print "$1\n"; }
Исправил, но не выводит ничего все равно, почему то
|
|
|
Записан
|
|
|
|
McZim
|
|
« Ответ #6 : 18-02-2010 21:00 » |
|
mkth, а ты уверен что site.ru тебе вернет строку которую ты пытаешься распарсить? #!/usr/bin/perl
use strict; use warnings; use LWP::UserAgent;
my $ua = LWP::UserAgent->new;
my $req = HTTP::Request->new(GET => 'http://site.com'); $req->header('Accept' => 'text/html');
my $response = $ua->request($req);
if ($response->is_success) { print $response->decoded_content; }
|
|
|
Записан
|
The CBO without stats is like a morning without coffee. (c) T.Kyte.
|
|
|
RXL
Технический
Администратор
Offline
Пол:
|
|
« Ответ #7 : 18-02-2010 21:06 » |
|
mkth, у тебя ведь вопрос про регулярное выражение? Так скорми ему текст из первого поста и будет ясно, работает оно или нет.
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
mkth
Гость
|
|
« Ответ #8 : 18-02-2010 21:12 » |
|
mkth, у тебя ведь вопрос про регулярное выражение? Так скорми ему текст из первого поста и будет ясно, работает оно или нет.
Да, про регулярное выражение... Но у меня данные берутся в результате запроса, а не из файла
|
|
|
Записан
|
|
|
|
RXL
Технический
Администратор
Offline
Пол:
|
|
« Ответ #9 : 18-02-2010 21:21 » |
|
mkth, открою секрет: данные не изменяются от помещения их в файл. Не думаю, что это сложно сделать. perl myapp.pl >result.txt В отладочных целях надо делать более удобные способы доставить тестовые данные, чем запуск всего приложения. Например, поместить фрагмент файла в строку. Вопрос: какова твоя профессия? Перл давно используешь?
|
|
« Последнее редактирование: 18-02-2010 21:29 от RXL »
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
mkth
Гость
|
|
« Ответ #10 : 18-02-2010 21:30 » |
|
Спасибо, сейчас попробую. Моя профессия - ремонт и наладка электрического и электромеханического оборудования... А Perl использую около 2-3 месяцев, ну то есть, знания мои в нем - на уровне детского садика... Вот так...
|
|
« Последнее редактирование: 18-02-2010 21:32 от mkth »
|
Записан
|
|
|
|
RXL
Технический
Администратор
Offline
Пол:
|
|
« Ответ #11 : 18-02-2010 21:46 » |
|
Теперь понятно, откуда неспособность сделать простейшие вещи в области программирования. Постараюсь не наезжать Добавлено через 3 минуты и 49 секунд: my $test_string = <<<EOF; var fr=''; document.write("iframe='http://somesite.php' id='gfdtrtrtre'></iframe>"); var fr=''; document.write("<iframe src='' id='gfdtrtrtre'></iframe>"); setTimeout("document.getElementById('iframe').src='http://goodsite.ru/php?sid=64564563&sesslid=Gtr216846hgf11'", 30000); EOF
if ($test_string =~ m%document\.getElementById\('iframe'\)\.src\s*=\s*'\s*(.*?)\s*'%s) { print "Строка найдена: $1\n"; } else { print "Строка не найдена.\n"; }
|
|
« Последнее редактирование: 18-02-2010 21:50 от RXL »
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
mkth
Гость
|
|
« Ответ #12 : 18-02-2010 22:06 » |
|
Спасибо, но простейшие запросы я все-таки составлять умею...
|
|
|
Записан
|
|
|
|
mkth
Гость
|
|
« Ответ #13 : 18-02-2010 22:11 » |
|
Исправил немного, а то в консоли вместо русских символов отображались какие то кракозябры my $test_string = <<<EOF; var fr=''; document.write("iframe='http://somesite.php' id='gfdtrtrtre'></iframe>"); var fr=''; document.write("<iframe src='' id='gfdtrtrtre'></iframe>"); setTimeout("document.getElementById('iframe').src='http://goodsite.ru/php?sid=64564563&sesslid=Gtr216846hgf11'", 30000); EOF
if ($test_string =~ m%document\.getElementById\('iframe'\)\.src\s*=\s*'\s*(.*?)\s*'%s) { print "Ok: $1\n"; } else { print "No.\n"; }
В результате выдало No...
|
|
|
Записан
|
|
|
|
RXL
Технический
Администратор
Offline
Пол:
|
|
« Ответ #14 : 19-02-2010 06:05 » |
|
Опечатался. Рабочий вариант: #!/usr/bin/perl -W
my $test_string = <<"EOF"; var fr=''; document.write("iframe='http://somesite.php' id='gfdtrtrtre'></iframe>"); var fr=''; document.write("<iframe src='' id='gfdtrtrtre'></iframe>"); setTimeout("document.getElementById('iframe').src='http://goodsite.ru/php?sid=64564563&sesslid=Gtr216846hgf11'", 30000); EOF
if ($test_string =~ m%document\.getElementById\('iframe'\)\.src\s*=\s*'\s*(.*?)\s*'%s) { print "Ok: $1\n"; } else { print "No.\n"; }
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
mkth
Гость
|
|
« Ответ #15 : 19-02-2010 12:04 » |
|
Спасибо большое!!! Но стоило измениться фрейму и опять не работает... Прошу помочь, как быть в этом случае??? Заранее извиняюсь за свою назойливость и тупость... #!/usr/bin/perl -W
my $test_string = <<"EOF"; var frm=''; document.write("<if"+frm+"rame sr"+"c='http://www.parsing.com' id='frm71RGnQaGuw' style='dis"+"play:none;'></ifra"+frm+"me>"); var frmtm=''; document.write("<if"+frmtm+"rame sr"+"c='' id='frml' style='display:none;'></ifra"+frml+"me>"); setTimeout("document.getElementById('frml').src='http://goodsite.ru/js.php?id=5435333&at=424&rnd=4f5dsf5fss5f45sfa65af56'", 30000); EOF
if ($test_string =~ m%document\.getElementById\('iframe'\)\.src\s*=\s*'\s*(.*?)\s*'%s) { print "Ok: $1\n"; } else { print "No.\n"; }
|
|
|
Записан
|
|
|
|
RXL
Технический
Администратор
Offline
Пол:
|
|
« Ответ #16 : 19-02-2010 13:21 » |
|
mkth, волшебного выражения на все варианты не напишешь - смотри, что постоянно, что переменно, что существенно и требует описания константами, а что можно описать метасимволами. Например, имя фрейма можно заменить: 'frml' -> '[^'*]' А еще, там могут применяться как одиночные, так и двойные кавычки. Могут возникать пробелы, может меняться регистр символов.
|
|
« Последнее редактирование: 19-02-2010 13:25 от RXL »
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
mkth
Гость
|
|
« Ответ #17 : 19-02-2010 17:53 » |
|
mkth, волшебного выражения на все варианты не напишешь - смотри, что постоянно, что переменно, что существенно и требует описания константами, а что можно описать метасимволами. Например, имя фрейма можно заменить: 'frml' -> '[^'*]' А еще, там могут применяться как одиночные, так и двойные кавычки. Могут возникать пробелы, может меняться регистр символов.
Спасибо, попробую...
|
|
|
Записан
|
|
|
|
mkth
Гость
|
|
« Ответ #18 : 19-02-2010 18:48 » |
|
mkth, а ты уверен что site.ru тебе вернет строку которую ты пытаешься распарсить? #!/usr/bin/perl
use strict; use warnings; use LWP::UserAgent;
my $ua = LWP::UserAgent->new;
my $req = HTTP::Request->new(GET => 'http://site.com'); $req->header('Accept' => 'text/html');
my $response = $ua->request($req);
if ($response->is_success) { print $response->decoded_content; }
Конечно вернет, там меняется только всякая фигня вроде идентификатора сессии...
|
|
|
Записан
|
|
|
|
mkth
Гость
|
|
« Ответ #19 : 19-02-2010 19:09 » |
|
Вроде с регекспом разобрался... Если я правильно понял, if ($response->decoded_content =~ m%document\.getElementById\('iframe'\)\.src\s*=\s*'\s*(.*?)\s*'%s) { print "Ok: $1\n";
эта часть кода декодирует ответ сервера, создает условие совпадения строки в ответе с шаблоном, при совпадении выводит на печать Ok и ответ, хранящейся в переменной $1... А каким образом перейти по ссылке, хранящейся в переменной $1, с теми же параметрами, что были в первом запросе? По идее, я планирую в цикле менять юзер агента, к примеру после 3 циклов брать нового из файла, причем в многопоточном режиме...
|
|
« Последнее редактирование: 19-02-2010 19:16 от mkth »
|
Записан
|
|
|
|
mkth
Гость
|
|
« Ответ #20 : 19-02-2010 22:26 » |
|
Все, разобрался уже сам... Теперь мучаюсь с циклом и тредами....
|
|
|
Записан
|
|
|
|
mkth
Гость
|
|
« Ответ #21 : 19-02-2010 22:44 » |
|
#!/usr/bin/perl
use LWP::UserAgent; use warnings;
my $ua = LWP::UserAgent->new;
$ua->agent('Opera/9.02 (Windows NT 5.1; U; ru)'); $ua->default_header('VIA' =>"myvalue"); # менять в цикле (совпадают) $ua->default_header('Referer' => "http://somesite.ru"); $ua->default_header('Accept' => "text/html"); $ua->default_header('Accept-Charset' => "windows-1251");
my $response = $ua->get('http://goodsite.ru/');
if ($response->decoded_content =~ m%document\.getElementById\('framename'\)\.src\s*=\s*'\s*(.*?)\s*'%s)
{ sleep (30); $ua = LWP::UserAgent->new;
$ua->agent('Opera/9.02 (Windows NT 5.1; U; ru)'); $ua->default_header('VIA' =>"myvalue"); # менять в цикле (совпадают) $ua->default_header('Referer' => "http://somesite.ru/"); $ua->default_header('Accept' => "text/html"); $ua->default_header('Accept-Charset' => "windows-1251");
my $response = $ua->get($1); } else { print "No.\n"; }
Как в цикле менять 'VIA', если сложить значения в столбиках в текстовом файле... К примеру, после прохода двух циклов, 'VIA' меняется на следующее... Для первого и второго запроса соответственно, чтобы не было подозрения эти знач. должны быть одинаковые ( на всякий случай программа засыпает на 30с. после первого запроса)... Каким образом организовать все в многопоточном режиме ( именно с тредами, а не форками), парс сотен страниц в один поток - чушь... Очень прошу помочь, больше не буду надоедать со своими глупостями, обещаю...
|
|
« Последнее редактирование: 19-02-2010 23:49 от mkth »
|
Записан
|
|
|
|
RXL
Технический
Администратор
Offline
Пол:
|
|
« Ответ #22 : 20-02-2010 10:12 » |
|
1. Не думаю, что $response->decoded_content что-то декодирует - думаю, что уже декодировано и оно только дает сохраненное значение. 2. $1 - не ссылка, а полноценное значение, копия.
Как в цикле менять 'VIA', если сложить значения в столбиках в текстовом файле... К примеру, после прохода двух циклов, 'VIA' меняется на следующее... Для первого и второго запроса соответственно, чтобы не было подозрения эти знач. должны быть одинаковые ( на всякий случай программа засыпает на 30с. после первого запроса)... Каким образом организовать все в многопоточном режиме ( именно с тредами, а не форками), парс сотен страниц в один поток - чушь... Очень прошу помочь, больше не буду надоедать со своими глупостями, обещаю... Ты знаешь, что несет VIA? Какой смысл его менять, если посылаешь запросы с одного IP? В таком контексте оно вообще не имеет смысла... Совет: сделай все в один поток и пока не добьешься полноценной работы за потоки не берись. Иначе совсем запутаешься. Есть очень хорошая книга по Perl: Perl Programming. ISBN 0-596-00027-8. Так же есть переводное издание: Программирование на Perl. ISBN 5-93286-020-0. ISBN привел для третьего издания. На английском есть и 4-е.
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
mkth
Гость
|
|
« Ответ #23 : 20-02-2010 13:59 » |
|
А это парсинг сайта в локальной сети нашего провайдера, не знаю почему, но при смене заголовка 'VIA' сайт не банит... Где то у меня был пример, где в цикле как раз менялся заголовок, да видимо я его затер ...
|
|
|
Записан
|
|
|
|
RXL
Технический
Администратор
Offline
Пол:
|
|
« Ответ #24 : 20-02-2010 14:47 » |
|
mkth, напиши еще раз - это простая задача - много проще, чем разбор страницы.
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
mkth
Гость
|
|
« Ответ #25 : 20-02-2010 15:08 » |
|
Да мне помогали, для меня трудность представляет то, что второй раз нужно отправлять запрос в цикле с тем же параметром VIA, что и в первый раз....
|
|
|
Записан
|
|
|
|
RXL
Технический
Администратор
Offline
Пол:
|
|
« Ответ #26 : 20-02-2010 15:22 » |
|
Подставляй в цикле другое значение.
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
mkth
Гость
|
|
« Ответ #27 : 20-02-2010 18:20 » |
|
#!/usr/bin/perl -w
use strict;
use LWP::UserAgent;
open (FILE , '<file.txt'); my @f = <FILE>; chomp @f;
my $ua = LWP::UserAgent->new;
$ua->agent('Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1) ; .NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729)');
$i = 1; while ($i>3) { $а[$i] = $ua->default_header('VIA' =>"@f"); ++$i; }
$ua->default_header('Referer' => "http://site.ru/"); $ua->default_header('Accept' => "text/html"); $ua->default_header('Accept-Charset' => "windows-1251");
my $response = $ua->get('http://goodsite.ru/');
if ($response->decoded_content =~ m%document\.getElementById\('some'\)\.src\s*=\s*'\s*(.*?)\s*'%s)
{ sleep (30); $ua = LWP::UserAgent->new;
$ua->agent('Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1) ; .NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729)'); $ua->default_header('VIA' =>"@f"); $ua->default_header('Referer' => "http://site.ru/"); $ua->default_header('Accept' => "text/html"); $ua->default_header('Accept-Charset' => "windows-1251");
my $response = $ua->get($1); } else { print "No.\n"; }
Вот, весь день бился, понимаю, что у меня вместо мозгов кал, но все равно, очень прошу, поправьте мой код... Пытался открыть файл с ip, засунуть их в массив и в цикле подставлять, но ниче не работает
|
|
« Последнее редактирование: 20-02-2010 18:27 от mkth »
|
Записан
|
|
|
|
RXL
Технический
Администратор
Offline
Пол:
|
|
« Ответ #28 : 21-02-2010 08:50 » |
|
mkth, не надо так самокритично подходить - у тебя просто нет базовых знаний. Потому и пишешь полный бред - тут даже править нечего. Совет: сперва представь, как бы ты это делал руками, потом опиши процесс на бумаге по пунктам, не пропуская ни какой мелочи (само ничего не делается), после проверь логику работы вручную, по написанному, а только потом пиши код. Бред: 1. $ua->agent('Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1) ; .NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729)');
2. $i = 1; while ($i>3) { $а[$i] = $ua->default_header('VIA' =>"@f"); ++$i; }
В дополнение: нет объявления переменных этого блока. 3. { sleep (30); $ua = LWP::UserAgent->new;
$ua->agent('Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1) ; .NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729)'); $ua->default_header('VIA' =>"@f"); $ua->default_header('Referer' => "http://site.ru/"); $ua->default_header('Accept' => "text/html"); $ua->default_header('Accept-Charset' => "windows-1251");
my $response = $ua->get($1); }
У тебя уже есть объект LWP::UserAgent - зачем создавать его заново? С $ua->agent и VIA тот же бред. Почитай rfc2616 о работе протокола HTTP 1.1.
|
|
« Последнее редактирование: 21-02-2010 13:10 от RXL »
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
mkth
Гость
|
|
« Ответ #29 : 21-02-2010 12:55 » |
|
Вся беда в том, что у меня интернет 1 марта отключат. Вот я и хотел со скриптом повозиться эти выходные, потом с утра работа, вечером в интститут, времени не будет....
|
|
|
Записан
|
|
|
|
|