如何自动用ie自动下载网页的文件?
网址:http://www.downbank.cn/soft/5/53/2008/2008122013676.htm实现自动下载这个文件?有一个"立即下载"的按钮,点它之后,会弹出一个网页,让你选择服务器,就选最后一个"普通下载(厦门网通)",然后就开始弹出ie下载窗口,模拟点下"保存",然后再模拟点下"保存".再然后,会弹出一个文件已存在是否覆盖,再模拟点下"是",就行了这些如何能自动实现?

解决方案 »

  1.   

    用嗅探软件,比如ETHREAL之类的,找出下载地址,然后直接用UrlDownloadToFiles下载文件
      

  2.   

    不好处理,有个很棘手的问题,网页是会变动的,如果直接用点击坐标方式,效果不行,但用BHO又过于复杂
      

  3.   

    http://www.downbank.cn/soft/softdown.asp?softid=13676
    就是这个网址,不变动的.只要控制点击"普通下载(厦门网通)",用ie默认下载就行 

    哪位高手帮帮忙?
      

  4.   

    http://www.downbank.cn/soft/softdown.asp?softid=13676 
    就是这个网址,不变动的.只要控制点击"普通下载(厦门网通)",用ie默认下载就行 
    ? 
    我再打一狠折,如果觉得用ie默认下载麻烦的话,用api或d自带的控件实现也行
      

  5.   

    没有必要那么麻烦,DELPHI直接具有下载功能,没必要去控制系统自带的下载对话框。但如果你要实现,无论哪种方式都可以实现,有空给你写个代码!代码在10行左右。
      

  6.   

    原来你是说点击,点击的话没有800分是不做的。因为发消息点击(不是鼠标移过去点击)网页是很有难度的。特别是网页在iframe中就更困难了。而iframe中还嵌有iframe的话就超级困难了。我以前曾经努力研究过,费了好大功夫才搞定,已经可以实现窗口被档住或者隐藏了仍然可以发送点击消息。你也别费心思了,你很难求到向网页发单击消息的代码的。除非是鼠标按坐票移过去点击,但程序必须是当前窗口。而且效率也低。建议你简单的用webbrowser1.Navigate();方法直接转到“普通下载(厦门网通)”里面。你在提问时说了那么多,还以为你是要控制系统自带的下载文件对话框。原来你的重点是向网页中发点击消息。
      

  7.   

    特别是网页在iframe中就更困难了。而iframe中还嵌有iframe的话就超级困难了。
    我提供的固定网址有你说的哪些超级困难吗?
      

  8.   

    有个思路,昨天晚上想的
    用SHELLEXECUTE打开IE,然后用模拟点击的方式点那个连接按钮,那个连接的位置看能不能用SPY++弄到
      

  9.   

    mwy654321 说的也不错,确实不容易实现。但是排除其他复杂因素的话,
    获取到要点击的button的话,用webbrowser也是能够实现的期待高手来
    解答了。。
      

  10.   


    固定网址直接打开“普通下载(厦门网通)”页面就调出对话框了,1行代码就可以了。如果是固定网址,那么你的问题重点就是操控下载对话框。这样的话100分真不少。就是用SendMessage操控按扭即可。如果你要求必须用鼠标点击,那么用mouse_event函数点击坐标,也就是18楼所说的代码,这样的话200分可以给你写代码。如果你要求程序窗口被其它软件挡住了仍然可以发送点击消息。800分是最少的了,都是用人民币求的。你所说的“你不点击“普通下载(厦门网通)”它,怎么出现下载文件对话框?”。当然可以实现。直接转向网址就可以了,根本不需要点击。也就是上面所说的三种情况的第一种。你在贴子提问时说了那么多关于操控系统下载对话框的要求,但对“下载对话框”的打开方式没有说必须要求点击实现。请表明你的重点?
    1.重点是向网页发点击消息。2.重点控制下载对话框。
      

  11.   

    你问题描述的不太清楚,我没看太明白
    1,你给出的url是固定的吗?包括下载地址,如果是的话就简单了,如果不是的话,还需要判断页面中的各个url是否是文件下载地址。
    2,必须要用ie弹出的下载窗口吗?如果是的话发送消息也可以解决的。还有就是你说的“我是多次下载,即,每隔10分下载一次覆盖前面,不想打开ie界面,这个版主真好!”这个不想打开ie界面是什么意思?我觉得你这个问题不难解决,就是下载文件嘛,但是,你的需求我有点搞不明白。
      

  12.   


    好的,我详细说一下
    我给出固定的网址:http://www.downbank.cn/soft/softdown.asp?softid=13676 ,这个只是下载页面,进入这个下载页面后,你要手动点一下“普通下载(厦门网通)”这个,才能下载,默认是ie下载,当然你电脑中,如果安装有下载工具如迅雷的话,也会自动跳出来.用什么下载都可以,我需要在后台静默下载,这需要用到一些控件或api之类的完成.但我不想把用ie打开哪个下载页面,然后这个页面一直在前台,哪样的话,我电脑什么也不能做了,就看它下载了!!所以这个代码是在不打开ie即不打开下载页面的情况下,完成多次下载的,因为第一次下载了,第二次下载要覆盖前面的文件,要没有提示的情况下覆盖不打开ie完成下载能实现吧,因为,我已给出网址了
    对,是下载文件,但下载的方法不同.我需要后台下载.其实,也就是想学学如何操作ie内的元素.
      

  13.   

    在不用ie打开下载页面的情况下:用d自带的TWebBrowser控件,打开指定网页,然后,找到网页中“普通下载(厦门网通)”这个,给它发消息?请问这样可行吗?
      

  14.   

    好吧,不打开ie的话,是没办法加载bho的,所以用bho的方法是行不通的,这样的话对于控制ie内的元素就成了一个问题。我的理解是,你是想控制页面元素吧?那可以通过加载mshtml来实现。这样的话,你可以做一个程序,使用Twebbrowser类来实现。通过webbrowser打开下载页面,然后载入获得IHTMLdocument2类型接口,这样就可以控制页面元素了。如果这个点击下载的过程必须实现,就是想要模拟点击的话,需要先获得这个页面元素(也就是这个链接,接口类型为IHTMLelement)然后调用 IHTMLelement的click方法就可以实现模拟点击了。点击之后会弹出默认浏览器来处理这个url,我们需要截获这个事件,并通过我们自己的程序下载他,这样就不必去模拟点击下载对话框了。下载的过程就更简单了,可以通过api,也可以通过indy组件。这样的话只需在程序里面放置一个timer控件定时浏览指定页面就可以了。程序的话,可以将其最小化或者干脆隐藏掉,这样就不会影响你正常工作了。
      

  15.   

    不好意思,忙了点事,不过想到了更简单的办法,我们都在绕弯子这个东西用indy+timer就可以解决。
    var
      id: TIdHTTP;
      fs: TFileStream;
    begin
      id := TIdHTTP.Create(self);
      fs := TFileStream.Create('c:\1.rar', fmCreate);
      id.Request.Referer := 'http://www.downbank.cn/soft/softdown.asp?softid=13676'; //注意这里,这个链接,也就是来源页。
      id.HandleRedirects:=True;
      id.Get('http://www.downbank.cn/soft/download.asp?softid=13676&downid=16&id=21396', fs); // 下载文件url。
      fs.Free;
      id.Free;
    end;
      

  16.   

    上面的是最简单的解决办法。
    如果非要满足模拟点击之类的,那用如下代码,但是我觉得没有太大意义,有一点小错误。unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls, OleCtrls, SHDocVw, MSHTML, IdHTTP, StrUtils;type
      TForm1 = class(TForm)
        WebBrowser1: TWebBrowser;
        Button1: TButton;
        WebBrowser2: TWebBrowser;
        procedure Button1Click(Sender: TObject);
        procedure WebBrowser1DocumentComplete(Sender: TObject;
          const pDisp: IDispatch; var URL: OleVariant);
        procedure WebBrowser1NewWindow2(Sender: TObject; var ppDisp: IDispatch;
          var Cancel: WordBool);
        procedure WebBrowser2DownloadBegin(Sender: TObject);
      private
        { Private declarations }
        procedure StartDownLoad;
     //   procedure WBBeforeNavigate2(Sender: TObject;
    //  const pDisp: IDispatch; var URL, Flags, TargetFrameName, PostData,
    //  Headers: OleVariant; var Cancel: WordBool);
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementation{$R *.dfm}procedure TForm1.Button1Click(Sender: TObject);
    begin
      webbrowser1.Navigate('http://www.downbank.cn/soft/softdown.asp?softid=13676');
    end;procedure TForm1.StartDownLoad;
    var
      doc: IHTMLDocument2;
      Hrefs: IHTMLElementCollection;
      Element: IHTMLElement;
      i: Integer;
    begin
      doc := webbrowser1.document as IHTMLdocument2;
      Hrefs := doc.all.tags('A') as IHTMLElementCollection;
      for i := 0 to Hrefs.length - 1 do
      begin
        Element := hrefs.item(i, 2) as IHTMLElement;
        if Trim(Element.innerText) = '普通下载(厦门网通)' then
        begin
          Element.click;
        end;
      end;
    end;procedure TForm1.WebBrowser1DocumentComplete(Sender: TObject;
      const pDisp: IDispatch; var URL: OleVariant);
    begin
      if WebBrowser1.LocationURL = URL then
      begin
        StartDownLoad;
      end;
    end;procedure TForm1.WebBrowser1NewWindow2(Sender: TObject;
      var ppDisp: IDispatch; var Cancel: WordBool);
    begin
      ppDisp := WebBrowser2.DefaultDispatch;
    end;procedure TForm1.WebBrowser2DownloadBegin(Sender: TObject);
    var
      id: TIdHTTP;
      fs: TFileStream;
    begin
      if WebBrowser2.LocationURL = 'about:blank' then
        Exit;
      if AnsiRightStr(WebBrowser2.LocationURL, 3) = 'rar' then
      begin
        id := TIdHTTP.Create(self);
        fs := TFileStream.Create('c:\1.rar', fmCreate);
        id.Request.Referer := (WebBrowser2.document as IHTMLdocument2).referrer;
        id.Get(WebBrowser2.LocationURL, fs);
        fs.Free;
        id.Free;
         WebBrowser2.Navigate('about:blank');
      end;
    end;end.
      

  17.   

    他在39楼的代码就是我所说的三种中的第一种,最最简单。
    他在40楼的代码虽然针对你这个问题没有什么意义(因为你是固定的,以结果角度考虑),但很值得学习,因为可以扩展为动态的。只不过换网址就不行了。因为有些网页中嵌入在iframe中的。需要对网页进行遍历。但楼主说过是固定网址,所以他的代码完全合要求,可以结贴了。呵呵。
      

  18.   

    我把楼主提供的那个软件给下载了,发现那个软件功能比较简单,就是把网页以图片的形式截取保存嘛!用DELPHI完全是一个过程就可以实现!
      

  19.   


    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls, OleCtrls, SHDocVw, MSHTML, IdHTTP, StrUtils;type
      TForm1 = class(TForm)
        WebBrowser1: TWebBrowser;
        Button1: TButton;
        procedure Button1Click(Sender: TObject);
        procedure WebBrowser1DocumentComplete(Sender: TObject;
          const pDisp: IDispatch; var URL: OleVariant);
      private
        { Private declarations }
        procedure StartDownLoad;
     //   procedure WBBeforeNavigate2(Sender: TObject;
    //  const pDisp: IDispatch; var URL, Flags, TargetFrameName, PostData,
    //  Headers: OleVariant; var Cancel: WordBool);
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementation{$R *.dfm}procedure TForm1.Button1Click(Sender: TObject);
    begin
      webbrowser1.Navigate('http://www.downbank.cn/soft/softdown.asp?softid=13676');
    end;procedure TForm1.StartDownLoad;
    var
      doc: IHTMLDocument2;
      Hrefs: IHTMLElementCollection;
      Element: IHTMLElement;
      i: Integer;
      id: TIdHTTP;
      fs: TFileStream;
    begin
      doc := webbrowser1.document as IHTMLdocument2;
      Hrefs := doc.all.tags('A') as IHTMLElementCollection;
      for i := 0 to Hrefs.length - 1 do
      begin
        Element := hrefs.item(i, 2) as IHTMLElement;
        if Trim(Element.innerText) = '普通下载(厦门网通)' then
        begin
          id := TIdHTTP.Create(self);
          fs := TFileStream.Create('c:\1.rar', fmCreate);
          id.Request.Referer := 'http://www.downbank.cn/soft/softdown.asp?softid=13676';
          id.HandleRedirects := True;
          id.Get(Element.tostring, fs);
          fs.Free;
          id.Free;
          showmessage('下载完成');
          exit;
        end;  end;
    end;procedure TForm1.WebBrowser1DocumentComplete(Sender: TObject;
      const pDisp: IDispatch; var URL: OleVariant);
    begin
      if WebBrowser1.LocationURL = URL then
      begin
        StartDownLoad;
      end;
    end;
    end.