在我的应用程序中,我使用LWP定期获取网页。无论如何检查连续两次提取网页是否在某些方面发生了变化(除了明确地进行比较)吗?是否有可以提取的较低协议层生成的任何签名(比如CRC),并与旧签名进行比较以查看可能的更改?如何检测更改后的网页?
3
A
回答
4
有两种可能的方法。一种是使用页面的摘要,例如
use strict;
use warnings;
use Digest::MD5 'md5_hex';
use LWP::UserAgent;
# fetch the page, etc.
my $digest = md5_hex $response->decoded_content;
if ($digest ne $saved_digest) {
# the page has changed.
}
另一种选择是使用HTTP ETag的,如果服务器提供一个用于请求的资源。您可以简单地存储它,然后设置您的请求标题以在后续请求中包含If-None-Match
字段。如果服务器ETag保持不变,您将获得304 Not Modified
状态和空的响应主体。否则,你会得到新的页面。 (和新的ETag。)请参阅RFC2616中的Entity Tags。
当然,服务器可能在说谎,并发送即使内容已经改变了相同的ETag。除非你看,否则无法知道。
3
您应该使用If-Modified-Since
request header,注意RFC中的陷阱。您发送该请求的头部。如果服务器支持它并认为内容较新,则会将其发送给您。如果它认为你有最新版本,它将返回一个没有消息正文的304
。
然而,由于其他答案已经指出,服务器不必告诉你真相,所以你有时会卡住下载内容和检查自己。许多动态的东西总是会声称拥有新的内容,因为许多开发人员从未想过在他们的Web应用程序中支持基本的HTTP事情。
对于LWP位,您可以创建一个额外的头一个请求:
use HTTP::Request;
use LWP::UserAgent;
my $ua = LWP::UserAgent->new;
my $request = HTTP::Request->new(GET => $url);
$r->header('If-Modified-Since' => $time);
$ua->request($request);
对于所有的请求,你可以设置一个请求处理程序:
$ua->add_handler(
request_send => sub {
my($request, $ua, $h) = @_;
# ... look up time from local store
$r->header('If-Modified-Since' => $time);
}
);
然而,LWP可以做这个最适合你用mirror
如果你要保存的文件:
$ua->mirror($url, $filename)
相关问题
- 1. 检测网页内容中的更改
- 2. 检测到更改的网页Api
- 3. 如何更改网址并检测后退按钮
- 4. 检测网页何时更新
- 5. 如何检测更改IDbSet
- 6. 如何检测tika的farsi网页?
- 7. 检测ASP.NET网站中的更改
- 8. 检测jQuery Mobile上的更改页面
- 9. Angular2更改检测“检查后表达式已更改”
- 10. 如何检测DOMAttrModified的类更改
- 11. 如何检测IE上的类更改
- 12. 如何检测Bootstrap Multiselect中的更改
- 13. 如何检测wp_editor中的更改?
- 14. 如何检测Amazon S3中的更改?
- 15. VHDL - 如何检测std_logic_vector上的更改?
- 16. 如何检测NSUserDefault中的更改?
- 17. 如何检测UIPickerView上的更改?
- 18. 如何检测WCF模型的更改?
- 19. 刷新后保留网页的更改
- 20. 网页更新检测算法
- 21. 使用python检测网页更新
- 22. 如何检测Control.PreferredSize何时更改?
- 23. 如何检测服务何时更改?
- 24. 如何检测输入何时更改?
- 25. Javascript。如何检测window.document何时更改?
- 26. 如何检测网页拦截器,然后采取行动?
- 27. PHP HTTP_REFERRER - 如何检测最后一页?
- 28. 如何在几分钟后更改网站页面的内容?
- 29. 检测访问的网页
- 30. 检测类似的网页
参见[HEAD](http://www.w3.org/Protocols/rfc261 6/rfc2616-sec9.html#sec9.4)请求。您可以查看最近修改的内容,内容长度等。 – Rob 2012-04-18 00:18:18
您是否需要针对特定网站的通用解决方案或解决方案。我在问,因为最好的解决方案(CPU和网络使用效率更高)可能取决于服务器的功能。 – dolmen 2012-04-18 13:25:24