【问题标题】:Fetch text/event-stream web response using WWW::Mechanize or LWP::UserAgent使用 WWW::Mechanize 或 LWP::UserAgent 获取文本/事件流 Web 响应
【发布时间】:2016-06-10 19:23:04
【问题描述】:

我正在使用WWW::Mechanize 获取一个网页,该网页包含一个 Google 地图小部件,该小部件从文本/事件流类型的单个响应中接收常量数据。

这种响应就像来自服务器的永无止境的响应,不断返回更新的数据以使小部件工作。

我正在尝试找出如何从 Perl 中读取准确的响应。使用类似的东西:

my $mech = WWW::Mechanize->new;

# Do some normal GET and POST requests to authenticate and set cookies for the session

# Now try to get that text/event-stream response

$mech->get('https://some.domain.com/event_stream_page');

但这不起作用,因为响应永远不会结束。

如何在每次服务器更新流时发出请求并开始读取响应并使用该数据执行某些操作?

【问题讨论】:

  • 您的目标网站似乎是私有的。你能找到一个可以用来重现问题的公共网站,以便我们尝试吗?我同意您使用处理程序走在正确的道路上,但如果没有工作端点,我将无法调试。
  • @simbabque,这完全是个假域名。
  • @oldtechaa domain.com 不是假的,它确实存在。但是 OP 使用它(错误地)来掩盖他们的真实领域。人们通常会在他们的东西位于专用网络中时这样做,或者他们不想透露它,因为这是工作。这就是为什么我要求提供一个具有可公开访问的相同行为的示例。给出明显错误(不是假)的示例域的正确方法是 example.org

标签: perl www-mechanize lwp-useragent event-stream


【解决方案1】:

找到了一种方法来做到这一点。使用handler from LWPWWW::Mechanize 从中继承:

$mech->add_handler (
    'response_data',
    sub {
        my ($response, $ua, $h, $data) = @_;
        # Your chunk of response is now in $data, do what you need
        # If you plan on reading an infinite stream, it's a good idea to clean the response so it doesn't grow infinitely too!
        $response->content(undef);
        # Important to return a true value if you want to keep reading the response!
        return 1;
    },
);

【讨论】:

  • 一个完美的例子,说明为什么要发布自己的答案——这对我来说很有用!
  • @zdim 没错! :-)
猜你喜欢
  • 2013-04-08
  • 2012-06-10
  • 2012-06-10
  • 2021-12-01
  • 2023-03-04
  • 1970-01-01
  • 2011-09-24
  • 2011-06-02
  • 2023-03-12
相关资源
最近更新 更多