Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Выборочный редирект  (Прочитано 16341 раз)
0 Пользователей и 1 Гость смотрят эту тему.
perl6
Помогающий

ru
Offline Offline

« : 31-05-2017 21:09 » 

Доброго времени суток. Уже несколько дней бьюсь над такой вот проблемой. А именно, как разрешить выборочный редирект.
Т.е., парсинг сайта временами заканчивается редиректом на левые страницы, мне ясное дело незачем туда ходить, но, вот нужный редирект делать приходится.
Пока, как довольно геморрное и громоздкое решение делаю общий запрет на редирект через $ua->max_redirect(0);
и вручную обрабатываю редирект через регулярку, если в урле редиректа есть нужные мне данные, то перехожу. Но, проблема в том, что редиектов много, один может породить другой. Нет ли возможности средствами LWP, например, объявить в начале для каких запросов я разрешаю редирект (что то типа $ua->redirect_ok(перечислить разрешенные), а остальные редиректы бы отбрасывались.
Записан
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #1 : 31-05-2017 22:22 » 

А что дока говорит?
http://search.cpan.org/~oalders/libwww-perl-6.26/lib/LWP/UserAgent.pm#HANDLERS
« Последнее редактирование: 31-05-2017 22:24 от RXL » Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Sla
Команда клуба

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #2 : 31-05-2017 23:00 » 

А что такое выборочный редирект я так и не понял?

Ведь в ответе есть куда редиректить?
Поэтому и нужно самому разбираться куда тебя посылают


Не знаю как в перле
но  в php curl
CURLOPT_FOLLOWLOCATION
CURLOPT_MAXREDIRS

Но я думаю, что вас это не интересует
А интересует именно ответ сервера

Ну так сервер может ответить различными редиректами - смотрите ответы редиректов (301, 302, 307 ) как часто используемые

Поэтому
0 exec
1 анализ кода ответа
2 анализ адреса редиректа (а здесь уже можно поступать как угодно)
3. Подсчет количества редиректов и такое бывает ведь не зря CURLOPT_MAXREDIRS
4 goto 0






Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #3 : 01-06-2017 07:29 » 

В перле так же можно использовать curl. В перл вообще богатый инструментарий.

С LWP есть обработчики, включая response_redirect. Возможность решать самому, чего еще нужно...
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
perl6
Помогающий

ru
Offline Offline

« Ответ #4 : 01-06-2017 18:49 » 

Вчера тоже этот раздел смотрел, только с англ. беда. Непонятно многое.
Записан
perl6
Помогающий

ru
Offline Offline

« Ответ #5 : 01-06-2017 18:50 » 

А что такое выборочный редирект я так и не понял?
Это когда мы выбираем сами, по каким редиректам ходить (парсим header location). Как я это реализовал в программе, через костыль. В общей части кода запретил редиректы (чтобы по всем подряд не переходить), а в нужных местах в ручную обрабатываю его. Но, это костыль, хочется гибкого решения средствами lwp
« Последнее редактирование: 01-06-2017 18:53 от perl6 » Записан
perl6
Помогающий

ru
Offline Offline

« Ответ #6 : 01-06-2017 18:52 » 

В перле так же можно использовать curl. В перл вообще богатый инструментарий.

С LWP есть обработчики, включая response_redirect. Возможность решать самому, чего еще нужно...

curl нам не нужен, а вот гибкий обработчик, а что это вообще за вариант? Что-то не найду примера с использованием.
Записан
Sla
Команда клуба

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #7 : 01-06-2017 20:01 » 

Не знает система, что редиректить, а что нет.
почему вы считаете, что єто костыль?
Мало того, я 100% уверен, что внутренняя реализация отслеживания редиректов так и построена.

Я реально не знаю, что такое LWP
Причем здесь нужен или не нужен curl, который был приведен как пример.
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
perl6
Помогающий

ru
Offline Offline

« Ответ #8 : 01-06-2017 22:36 » 

Цитата: Sla
Не знает система, что редиректить, а что нет.
Вот я о том и речь веду. Неплохо было бы разрешить редиректы только для определенных запросов, а для остальных, по умолчанию, запретить.
Цитата: Sla
почему вы считаете, что єто костыль?.
Смотрите сами. Вот я в начале программы, так сказать, глобально отключаю редиректы совсем. Незачем мне ходить по ним всегда. Но, в процессе парсинга, для определенных запросов, допустим, $req1, $req5, $req7 редиректы нужны. Приходится в ручную городить обработку, вот было бы здорово, заранее, определить, для каких запросов и/или доменов разрешить редиректы.
Цитата: Sla
Мало того, я 100% уверен, что внутренняя реализация отслеживания редиректов так и построена.
Пока только нарыл то, что можно определить макс. количество редиректов или их вообще запретить.

Цитата: Sla
Я реально не знаю, что такое LWP
Это перловый www броузер, позволяет ходить по сайтам, делать запросы, поддерживает куки. Короче, библиотека для работы с www (ине только) сетью.
Цитата: Sla
Причем здесь нужен или не нужен curl, который был приведен как пример.
Да, я понял, спасибо за пример. Для его использования в перле его надо скомпилировать сначала, а хочется обойтись средствами перла.
Записан
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #9 : 01-06-2017 22:37 » 

Вчера тоже этот раздел смотрел, только с англ. беда. Непонятно многое.

Да, беда. Не может человек, не читающий документацию, писать программы.

Код: (Perl)
#!/usr/bin/perl

use 5.010;
use strict;
use warnings;

use LWP::UserAgent;

my $ua = LWP::UserAgent->new;

$ua->add_handler(response_header => sub {
    my ($response, $ua) = @_;

    say 'Received redirect to location: ', $response->header('location');
    $response->code(400);
    return;
}, m_code => [301, 302]);

$ua->add_handler(response_done => sub {
    my ($response, $ua) = @_;

    say 'Response done: ', $response->code;
    return;
});

$ua->add_handler(response_redirect => sub {
    my ($response, $ua) = @_;

    return unless $response->is_redirect;
    say 'Performs redirection to ', $response->header('location');
    return;
});

say "==== request with redirect ====";
$ua->get('http://yandex.ru/');

say "==== request without redirect ====";
$ua->get('https://yandex.ru/');

Дальше сам.
Читай еще: http://search.cpan.org/~ether/HTTP-Message-6.11/lib/HTTP/Config.pm#Matching
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #10 : 01-06-2017 22:39 » 

Я реально не знаю, что такое LWP

LWP — libwww-perl
Библиотека libwww очень старая — 1992-й год. Сделано под первые браузеры. Позже растиражирована под различные нужны, включая реализацию для перл.
« Последнее редактирование: 02-06-2017 07:45 от RXL » Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Sla
Команда клуба

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #11 : 02-06-2017 08:51 » 

Я реально не знаю, что такое LWP

LWP — libwww-perl
Библиотека libwww очень старая — 1992-й год. Сделано под первые браузеры. Позже растиражирована под различные нужны, включая реализацию для перл.
Улыбаюсь
Я писал, что не знаю - не пользовался, не видел. А прочитать заголовок доки - это я умею Улыбаюсь
Но я также понимаю принципы, как это работает, или представляю как это должно работать, потмоу и привел пример, из тог что знаю.
Никто не застваляет компилировать curl.
Принцип один
Открыть порт, сделать запрос
Разобрать ответ
Все!!!
А дальше.. назови хоть груздем, лишь бы грибом был
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
perl6
Помогающий

ru
Offline Offline

« Ответ #12 : 02-06-2017 14:30 » 

Цитата: RXL
Да, беда. Не может человек, не читающий документацию, писать программы.
Да, а что делать. Никто не переводит документацию нормально. Никому не надо. А в школе нас тех. англ. не учили. Спасибо за пример, поковыряю вечерком.
« Последнее редактирование: 02-06-2017 14:37 от perl6 » Записан
perl6
Помогающий

ru
Offline Offline

« Ответ #13 : 02-06-2017 14:32 » 

Цитата: RXL
LWP — libwww-perl
Библиотека libwww очень старая — 1992-й год. Сделано под первые браузеры. Позже растиражирована под различные нужны, включая реализацию для перл.
Да я бы не сказал, что прям настолько устарела, последнее обновление датировано 3 апрелем 2017 года. Некоторые библиотеки уже года 3 не обновляются. Кстати, какой модуль вы бы посоветовали, актуальный на сегодня?
« Последнее редактирование: 02-06-2017 14:37 от perl6 » Записан
perl6
Помогающий

ru
Offline Offline

« Ответ #14 : 02-06-2017 17:09 » 

Вроде более менее логика понятна.
P.S. Интересует, как регуляркой задать определенные соотв. в "location" урле. Можно, конечно по доменам разрешить, но способ корявый, ибо домены все собирать не айс. А вот регуляркой задать соответствие не получается почему-то.
Я про m_path_match, ищущей в ссылке, с которой редиректит, а не в ссылке, куда редиректит.
Иными словами, ссылка site1.ru, которая отправляет редиректом на site2.ru, вот мне в site2.ru и надо искать соотв. Если site2 содержит опр. слова, то переходить.
Может m_response_attr__$key поможет. Непонятно, что это за поле такое m_response_attr__
« Последнее редактирование: 02-06-2017 17:57 от perl6 » Записан
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #15 : 02-06-2017 22:05 » 

Да, а что делать. Никто не переводит документацию нормально. Никому не надо. А в школе нас тех. англ. не учили. Спасибо за пример, поковыряю вечерком.

Отговорки. Я немецкий учил. Правда, нихрена не помню. В общем, если что-то нужно, научиться можно без школ и университетов.

Т.к. ты пишешь синхронный код, порекомендую curl. Он также может делать параллельные запросы: даешь ему N заданий и встаешь в ожидание первого завершенного. Но это не параллельный процесс, его нельзя с активными запросами надолго лишать управления. Но можно и по одному запросу гонять.
С другой стороны, если ты привык к LWP, то зачем менять. Только если не подходит как инструмент.

Насчет логики: response_redirect используется не при редиректах, а для имитации редиректа.

Цитата
ссылка site1.ru, которая отправляет редиректом на site2.ru, вот мне в site2.ru и надо искать соотв. Если site2 содержит опр. слова, то переходить.

Это расходится с изначальным описанием. Определись с логикой.
« Последнее редактирование: 02-06-2017 22:17 от RXL » Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
perl6
Помогающий

ru
Offline Offline

« Ответ #16 : 03-06-2017 21:54 » new

Цитата
Т.к. ты пишешь синхронный код, порекомендую curl. Он также может делать параллельные запросы: даешь ему N заданий и встаешь в ожидание первого завершенного. Но это не параллельный процесс, его нельзя с активными запросами надолго лишать управления. Но можно и по одному запросу гонять.
С другой стороны, если ты привык к LWP, то зачем менять. Только если не подходит как инструмент.
Вот, я тоже подумал. Курл для этого слишком громоздкий, LWP прекрасно справляется.
Цитата
Это расходится с изначальным описанием. Определись с логикой.
Я просто не умею выражать свои мысли, это да. Изначально неправильно истолковал.
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines