手头有一个项目需要抓取别人网页上的信息,而这个网页的信息变化非常频繁是每秒钟都有变化。现在用的idhttp控件进行下载,正常情况下2~10秒钟内可以下载到网页,但是如果是高峰期可能要达到10秒钟。这样就无法达到系统要求,各位大侠能否给些建议,有什么方法能够比较稳定的而且快速的下载?   谢谢了

解决方案 »

  1.   

    你的要采集的数据在网页上,人家又没有开放数据库给你,
    只能还是按你现在用idhttp控件进行采集了,
    你现在是因为下载时间间隔可能才长而要想办法你可以加多用一个timer,然后把它的时间间隔设置为你想要的合适的时间间隔
    事件定时从一个变量(假设为A吧)取得数据进行处理原来用idhttp取得数据部分,修改为线程,把采集到的东东放到上面的变量A里(注意线程安全)而生成线程进行采集采用类似下面的循环for i := 0 to 10 do
    begin
      生成2-10个线程...
      sleep(1000) 
    end;试试
      

  2.   

    To dragonki(dragonki) 
    现在的关键问题不是刷新的间隔,而是下载本事速度就比较慢,可能需要2秒钟才能下载完成。那么现在的要求就是必须在1秒钟完成下载,因此应该将其分段下载类似flashget这样的工具才能达到要求。
    谢谢你的支持
      

  3.   

    如果要下的网页大小比较固定,更新的数据位置也较固定,可以用TClientSocket指定开始和结束位置下载,然后分析更新了的内容;如果对方网页用XML来更新数据,你就直接下他的XML文件。都不行的话,帮不了你。楼上说开几百个线程下,但是如果网速慢的话,你下回来的数据还是N秒前的数据,意义不同了。
      

  4.   

    感谢楼上几位的关注,不知是否有idhttp优化的方法能让其更加稳定,或者说分段下载比较成熟的技术。
      

  5.   

    如果服务器是你能控制的,似乎不必要用下载页面的方法了。如果你不能管理这台WEB服务器,还有一种方法,就是你自己建一个服务器,从该WEB服务器获取数据,再分发给你的客户。如果获取的数据是延后几秒的你不能接受,也有办法解决,送钱给这台WEB服务器的管理者,让他们改造服务器并增加带宽。
      

  6.   

    TO:ahjoe(强哥)
      谢谢关注,服务器当然不能受我控制。多线程好像也不是最好的放案,因为多线程也不知道哪个线程是最新的。
      

  7.   

    只能从下载的方法方面进行改进了。不知道大家对idhttp控件的了解有多少,我在用的时候在同一时间有时候下载一个页面需要3秒,有时候只需要300毫秒。按道理应该在同一环境下下载速度应该在一个相对问题的范围内,不知这个控件是否有优化的设置方法或写发能够比较稳定。现在把代码贴出来给大家看,是否可以有优化的地方。谢谢各位!Function  Get_For_Host_ByIdHttp(IdHTTP1: TIdHTTP;aHost , aUrl, aReferer,aCookie,aProxyStr : string ; var  DataString : String) : Boolean ;
    begin
     try
      Result := True;
      DataString := '' ;  with IdHTTP1 do
      begin
         try
            ReadTimeout := 20000;
            Host := aHost;        if aReferer <> '' then
              Request.Referer := aReferer ;
            if aCookie<> '' then
            begin
               Request.CustomHeaders.Clear;
               Request.CustomHeaders.Add('Cookie: '+aCookie);
            end;        if  aProxyStr <> '' then
            begin
               ProxyParams.ProxyServer := Copy(aProxyStr,0,Pos(':',aProxyStr)-1);
               ProxyParams.ProxyPort   := StrToInt(Trim(Copy(aProxyStr,Pos(':',aProxyStr)+1,10)));
            end;
            Request.UserAgent := 'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0;.NET CLR 1.1.4322)' ;
            Request.Accept := 'image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/vnd.ms-powerpoint, application/vnd.ms-excel, application/msword, application/x-shockwave-flash, */*';        DataString :=  Get(aUrl) ;
            //DataString :='Head:[' + Response.RawHeaders.Text +  #13#10']' +DataString;
         except
           on E: Exception do
           begin
             Result := False;
             IdHTTP1.DisconnectSocket;
           end;
         end;
      end;
      finally
      end;
    end;