IXMLHTTPRequest获取网页源码的心得(修正)

在万一老师的博客看到一种利用IXMLHTTPRequest来获取网页源码的方法,但有2个问题没解决,自己研究了下改进了方法。

1.如果网页进行301转跳将无法获取源码

2.如果网站是gb2312编码将获取的是乱码

/////以下方法使用的是Delphi xe2编写

uses MsXML,activex;



function GETHTML (const URL : string):string; // XMLHTTP接口

Var

  XMLHTTP:IServerXMLHTTPRequest;

  HTML:TBytes;

begin

  try

    CoInitializeEx(nil,COINIT_MULTITHREADED);

    XMLHTTP:=CoServerXMLHTTP.Create; //使用CoServerXMLHTTP则能进行301转跳,CoXMLHTTP不能转跳

    XMLHTTP.open('GET',URL,False,EmptyParam,EmptyParam);

    XMLHTTP.send(EmptyParam);



    HTML:=XMLHTTP.responseBody;



    //判断网页是否携带utf-8,没携带进行转换

    if Pos('utf-8',StringOf(HTML)) > 0 then begin

      Result:=TEncoding.Default.GetEncoding(65001).GetString(HTML);//把UTF8转STRING

      Exit;

    end;

    Result:=TEncoding.Default.GetString(HTML);

  finally

    CoUnInitialize; // 释放内存

  end;

end;

 /////////////////////////////////////////////////////////////////////////////////////

 /////////////////////////////////////////////////////////////////////////////////////

 /////////////////////////////////////////////////////////////////////////////////////

在最近发现个有趣的现象,我查看了下StringOf函数,这个函数已经帮我们转换了编码。因此我们可以把代码修改如下:

function GETHTML (const URL:string;Model:Byte):string; // XMLHTTP接口

Var

  XMLHTTP:IServerXMLHTTPRequest;

  HTML:TBytes;

  HtmlStr:String;

begin

  try

    CoInitializeEx(nil,COINIT_MULTITHREADED);

    XMLHTTP:=CoServerXMLHTTP.Create; //使用CoServerXMLHTTP则能进行301转跳,CoXMLHTTP不能转跳

    XMLHTTP.setTimeouts(30000,30000,30000,45000);

    XMLHTTP.open('GET',URL,False,EmptyParam,EmptyParam);

    XMLHTTP.send(EmptyParam);

    HTML:=XMLHTTP.responseBody;

    HtmlStr:=XMLHTTP.responseText;



    Case Model of

      0:if Pos('utf-8',HtmlStr) > 0 then Result:=XMLHTTP.responseText else Result:=StringOf(HTML);

      1:Result:=StringOf(HTML);

      2:Result:=XMLHTTP.responseText;

    End;

  finally

    CoUnInitialize; // 释放内存

  end;

end;

  使用这个方法后是否存在什么BUG还在研究当中...

你可能感兴趣的:(XMLhttpREquest)