【问题标题】:Tweak Performance of a Web Page Watcher调整网页观察器的性能
【发布时间】:2016-01-20 17:01:24
【问题描述】:

我正在编写一个基本脚本来查看网页并在发生变化时与之交互。

我正在用 Perl 编写,使用 curl 获取页面并使用 grep 来观察它的变化。

我使用的watch结构如下

my $string = '';
do {
  $string = curl -s --cookie cookie.txt "http://url.com/resource" | grep "thing_that_has_appeared"
  } until ( $string ne '' );

然后将其传递到用于提取信息的字符串中。

当使用 curl 下载为文件时,页面本身为 16KB。

在运行此程序时,我发现在网络带宽和处理器使用方面都有很大的负载。

重点是尽可能密切地观察页面,即在秒或秒的几分之一范围内,因此可以接受一些合理的负载。我只是想知道我是否可能做错了,是否有更有效的方式来查看页面?

服务器没有发出Last-Modified 标头。

一旦我确认页面没有改变,有什么方法可以指示 curl(或中断它)停止下载页面?

我认为我主要需要在这里洞察力。我的太有限了。

编辑:作为对评论的回应,我已经包含了循环和指定的时间跨度。

【问题讨论】:

  • curl 命令只获取网页一次。如果您看到显着负载,那么您必须将此命令包装在一个未显示的循环中。请显示您的其余代码。您希望得到什么样的响应时间?您可以检查更改,例如,每天一次吗?最好的方法是检查 HTTP 标头。您确定更改不会反映在标题中吗?
  • "在我确认页面没有改变后,有什么方法可以指示 curl(或中断它?)停止下载页面?"如果没有像 Last-Modified 这样的标题,除非您下载整个内容,否则您无法确认该页面是否相同。 (如果只有最后一个字节发生了变化呢?)
  • 什么是"thing_that_has_appeared"?听起来您真的在等待特定的内容,而不是简单的更改
  • @ThisSuitIsBlackNot 好吧,知道了页面结构,以及我想观察哪一部分的变化,并假设它不是最​​后一个字节,我想我要问的是是否有办法忽略之后我正在观看的部分......
  • @Borodin 没错。该页面是一个列表。我正在做:如果列表为空,则什么也不做,一旦列表中出现某些内容,则执行操作。 grep 是我在列表中等待的,这是特定的,至少在 html 标记中。

标签: perl http curl grep


【解决方案1】:

ThisSuitIsBlackNot 的回答有帮助:

使用 LWP::UserAgent,您可以指定在每下载 N 个字节后调用的回调。如果您找到了您要查找的内容,您可以在中途取消请求。

他还引用了 metacpan 上与 libwww-perl 库的 Web 用户代理相关的 this 页面。

感谢您的意见。 如果提问的方式不恰当,再次抱歉。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-01-06
    • 1970-01-01
    • 2016-11-28
    • 1970-01-01
    • 1970-01-01
    • 2013-02-26
    • 2010-12-01
    • 1970-01-01
    相关资源
    最近更新 更多