利用Http状态码检查网页内容是否更新

  在做网页抓取爬虫类的工具时,经常要对页面进行监控和解析,其中监控就是检查页面内容是否发生了更新。判断网页是否发生变化最直接的方法是设置页面的某一处为监控区域,每次都抓取该部分区域的内容,然后与本地保存的或最近一次抓取内容比较,如果有差异就表明网页发生了变化,才可以进行解析。这种方法比较稳妥,几乎可达到万无一失的效果。但是,这种方式在每次扫描时都要下载页面内容,并且要去截取监控区域的内容,最后还要进行字符串比较,整个过程比较耗时。其实在众多网页中,有一部分网站的网页内容是静态页面,如图片,html,js等,这些静态页面往往可能是服务器早已准备好的,用户访问时仅仅是下载而已。那么针对这种静态页面,就可以仅仅通过状态码来判断,内容是否发生了变化。

  这个状态码就是304(Not Modified),对于这个代码的解释是"如果客户端发送了一个带条件的 GET 请求且该请求已被允许,而文档的内容(自上次访问以来或者根据请求的条件)并没有改变,则服务器应当返回这个状态码"。很明显通过这个解释,我们就明白了其实现的机理。我们要做的事情,仅仅是在发送请求时将上次访问的时间添加到header中,然后根据服务器返回的状态码进行判断。通常,在网页发生变化时,服务器会返回状态码200,而未发生变化则返回304。

 dotnet在网络传输这块已经提供了完善的API,接下来请看具体的实现方式。在这个例子中,通过访问国家统计局的banner页面(http://www.stats.gov.cn/top.html)来演示,分别检查3天前和3个月前该页面是否发生了变化。

ExpandedBlockStart.gif
         static   void  Main( string [] args)
        {
            
string  url  =   " http://www.stats.gov.cn/top.html " ;

            
//  检查3天前网页是否发生了变化
            DateTime modifiedSince  =  DateTime.Now.AddDays( - 3 );
            
//  输出false
            Console.WriteLine(PageHasChanged(url, modifiedSince));

            
//  检查3个月前是否发生了变化
            modifiedSince  =  DateTime.Now.AddMonths( - 3 );
            
//  输出true
            Console.WriteLine(PageHasChanged(url, modifiedSince));
        }

        
private   static   bool  PageHasChanged( string  url, DateTime modifiedSince)
        {
            
bool  changed  =   false ;

            
//  设置请求信息
            HttpWebRequest request  =  WebRequest.Create(url)  as  HttpWebRequest;
            
//  最关键的一项设置 将请求的IfModifiedSince设置为指定的时间
            request.IfModifiedSince  =  modifiedSince;

            HttpWebResponse response 
=   null ;
            
try
            {
                response 
=  request.GetResponse()  as  HttpWebResponse;

                
//  根据返回的状态码判断内容是否发生了变化 
                
//  200表示页面发生了变化
                 if  (response.StatusCode  ==  HttpStatusCode.OK)
                {
                    changed 
=   true ;
                }
                
else   if  (response.StatusCode  ==  HttpStatusCode.NotModified)
                {
                    changed 
=   false ;
                }

                response.Close();
            }
            
catch  (WebException ex)
            {
                
//  对于没有发生变化的页面 通常会通过抛出异常的方式提示页面未发生变化
                 if  ((ex.Response  as  HttpWebResponse).StatusCode  ==  HttpStatusCode.NotModified)
                {
                    changed 
=   false ;
                }
                
else
                {
                    
throw  ex;
                }
            }

            
return  changed;
        }

  需要注意的是,在网页内容没有发生变化时,会抛出异常,状态码只能在异常信息中获取。另外在返回200状态码时,有时候并不表示页面发生了变化,因为有些服务器不识别请求中的lastModifiedSince内容。经过实际项目的实践,发现大部分的静态页面内容,都能够通过该方法判断。

  如有更好的方法,特别是判断动态页面是否更新的方法,欢迎交流。

 

 

 

转载于:https://www.cnblogs.com/shenba/archive/2009/12/20/1628173.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
东南亚位于我国倡导推进的“一带一路”海陆交汇地带,作为当今全球发展最为迅速的地区之一,近年来区域内生产总值实现了显著且稳定的增长。根据东盟主要经济体公布的最新数据,印度尼西亚2023年国内生产总值(GDP)增长5.05%;越南2023年经济增长5.05%;马来西亚2023年经济增速为3.7%;泰国2023年经济增长1.9%;新加坡2023年经济增长1.1%;柬埔寨2023年经济增速预计为5.6%。 东盟国家在“一带一路”沿线国家中的总体GDP经济规模、贸易总额与国外直接投资均为最大,因此有着举足轻重的地位和作用。当前,东盟与中国已互相成为双方最大的交易伙伴。中国-东盟贸易总额已从2013年的443亿元增长至 2023年合计超逾6.4万亿元,占中国外贸总值的15.4%。在过去20余年中,东盟国家不断在全球多变的格局里面临挑战并寻求机遇。2023东盟国家主要经济体受到国内消费、国外投资、货币政策、旅游业复苏、和大宗商品出口价企稳等方面的提振,经济显现出稳步增长态势和强韧性的潜能。 本调研报告旨在深度挖掘东南亚市场的增长潜力与发展机会,分析东南亚市场竞争态势、销售模式、客户偏好、整体市场营商环境,为国内企业出海开展业务提供客观参考意见。 本文核心内容: 市场空间:全球行业市场空间、东南亚市场发展空间。 竞争态势:全球份额,东南亚市场企业份额。 销售模式:东南亚市场销售模式、本地代理商 客户情况:东南亚本地客户及偏好分析 营商环境:东南亚营商环境分析 本文纳入的企业包括国外及印尼本土企业,以及相关上下游企业等,部分名单 QYResearch是全球知名的大型咨询公司,行业涵盖各高科技行业产业链细分市场,横跨如半导体产业链(半导体设备及零部件、半导体材料、集成电路、制造、封测、分立器件、传感器、光电器件)、光伏产业链(设备、硅料/硅片、电池片、组件、辅料支架、逆变器、电站终端)、新能源汽车产业链(动力电池及材料、电驱电控、汽车半导体/电子、整车、充电桩)、通信产业链(通信系统设备、终端设备、电子元器件、射频前端、光模块、4G/5G/6G、宽带、IoT、数字经济、AI)、先进材料产业链(金属材料、高分子材料、陶瓷材料、纳米材料等)、机械制造产业链(数控机床、工程机械、电气机械、3C自动化、工业机器人、激光、工控、无人机)、食品药品、医疗器械、农业等。邮箱:market@qyresearch.com

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值