Я использую HTML::TreeBuilder->new_from_url($url)
, но сервер блокирует меня из-за несовместимой строки пользовательского агента. Как я могу изменить строку пользовательского агента с помощью HTML::TreeBuilder
, чтобы использовать new_from_url($url)
напрямую, без обходного пути получения веб-контента традиционным способом?
Невозможно установить это в new_from_url()
. Вам придется загрузить LWP::UserAgent
самостоятельно и установить строку пользовательского агента. Затем вы можете разобрать содержимое с помощью new_from_content()
.
Однако вот прямая ссылка на код new_from_url. Вы можете использовать это как основу своего собственного метода new()
, чтобы поток вашей программы читался так же.
Итак, что-то вроде:
sub HTML::TreeBuilder::my_new_from_url {
# copy and augment new_from_url
...
}
my $tree = HTML::TreeBuilder->my_new_from_url($url, { useragent => "foo" });
Теперь, несмотря на все эти правильные действия, вы можете сыграть злую шутку с LWP::UserAgent
, переопределив его частный _agent
метод, который хранит строку пользовательского агента по умолчанию. Но имейте в виду, что вы аннулировали гарантию, и все неисправные модули ложатся на вас.
#the original
sub _agent { "libwww-perl/$VERSION" }
Определите в своем коде:
use LWP::UserAgent ();
sub LWP::UserAgent::_agent { "Mozilla forever" }
Или, более хитро:
use LWP::UserAgent ();
my $tree = do {
local *LWP::UserAgent::_agent = sub { "Mozilla forever" };
HTML::TreeBuilder->new_from_url($url);
};
В зависимости от вашего фактического запроса, Mojolicious может предоставить вам необходимые возможности настройки и парсинга DOM. В его интерфейсе нет таких надоедливых стен, как в LWP.