Delphi XE下获取网页源码记录

存放个自己写的获取网页源码,掌握了:

1.利用CreateOLEObject方式获取源码

2.自动判断网页格式编码

需要使用到的单元:Winapi.ActiveX,System.Win.ComObj,System.WideStrUtils

需要创建结构体:TResultWebHtml (用于存放返回的源码和Cookies)

Uses Winapi.ActiveX,System.Win.ComObj,System.WideStrUtils;

type
  TResultWebHtml = record
    Html : String;
    Cookie : String;
  end;

function GetWebHtml(Url,Method,Code,ReferText,ReferCookies:String;Overtime:Integer;Referer,Accept,Language,Charset,Agent,ContentType:String;Redirect,Encoding,XRequestedWith:BooLean):TResultWebHtml;stdcall;//访问网页
Var
  I:Integer;
  XMLHTTP:Olevariant;
  ResultWebHtml:TResultWebHtml;
  POvertime:Integer;
  PUrl,PMethod,PCode,PReferText,PReferCookies:String;
  PReferer,PAccept,PLanguage,PCharset,PAgent,PContentType:String;
  PHtml: RawByteString;
  Temp,PGetCookies:String;
  TempList:TStringList;
  HTML:TBytes;
Begin
  try
    CoInitialize(nil); //添加 CoInitialize 支持多线程调用
    XMLHTTP:= CreateOLEObject(‘WinHttp.WinHttpRequest.5.1‘);
    Try //避免超时报错、防止出错等
      //初始化默认值
      if Url = ‘‘ then Exit else PUrl:=Url; //网址初始化
      if Method = ‘‘ then PMethod:= ‘get‘ else PMethod:= LowerCase(Method); //初始化访问方式
      if Code <> ‘‘ then PCode:= LowerCase(Code);      //初始化网站编码,为空自动选择
      if ReferText <> ‘‘ then PReferText:=ReferText;//设置提交信息,用于Post操作
      if ReferCookies <> ‘‘ then PReferCookies:=ReferCookies;//设置网站Cookies
      if Overtime = 0 then POvertime:=15000 Else POvertime:=Overtime * 1000; //设置超时时间
      if Referer = ‘‘ then PReferer:= PUrl else PReferer:= Referer; //设置来路,如果为空则设置为访问网站地址
      if Accept = ‘‘ then PAccept:=‘text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8‘ else PAccept:=Accept;
      if Language = ‘‘ then PLanguage:=‘zh-CN,zh;q=0.8,en-US;q=0.6,en;q=0.4‘ else PLanguage:=Language;
      if Charset = ‘‘ then PCharset:=‘GBK,utf-8;q=0.7,*;q=0.3‘ else PCharset:=Charset;
      if Agent = ‘‘ then PAgent:=‘Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/38.0.2107.3 Safari/537.36‘ else PAgent:=Agent;
      if ContentType = ‘‘ then PContentType:=‘application/x-www-form-urlencoded‘ else PContentType:=ContentType;

      XMLHTTP.open(PMethod, PUrl, False);
      //设置头信息
      XMLHTTP.setRequestHeader(‘Referer‘, PReferer);  // 仅服务器可知 来路
      XMLHTTP.setRequestHeader(‘Accept‘, PAccept);
      XMLHTTP.setRequestHeader(‘Accept-Language‘, PLanguage);
      //XMLHTTP.setRequestHeader(‘Accept-Charset‘, PCharset);
      XMLHTTP.setRequestHeader(‘User-Agent‘, PAgent);
      XMLHTTP.setRequestHeader(‘Content-Type‘, PContentType);
      XMLHTTP.setRequestHeader(‘Connection‘, ‘keep-alive‘);
      if PReferCookies <> ‘‘ then XMLHTTP.setRequestHeader(‘Cookie‘, PReferCookies);
      if Encoding then XMLHTTP.setRequestHeader(‘Accept-Encoding‘, ‘gzip‘); //设置压缩 ‘gzip‘
      if Redirect then XMLHTTP.Option(6) :=True else XMLHTTP.Option(6) :=False;//设置是否支持转跳
      if XRequestedWith then XMLHTTP.setRequestHeader(‘X-Requested-With‘, ‘XMLHttpRequest‘);

      XMLHTTP.setTimeouts(POvertime, POvertime, POvertime, POvertime);
      XMLHTTP.send(PReferText);

      HTML:=XMLHTTP.responseBody;
      if PCode = ‘‘ then begin //开启自动选择
        //自动判断网页格式后
        SetString(PHtml, PAnsiChar(Pointer(WideString(XMLHTTP.ResponseBody))), SysStringByteLen(PWideChar(WideString(XMLHTTP.ResponseBody))));
        if IsUTF8String(PHtml) then Temp := TEncoding.Default.GetEncoding(65001).GetString(HTML) else Temp :=TEncoding.Default.GetString(HTML);
      end else begin
        if PCode = ‘utf-8‘ then Temp := TEncoding.Default.GetEncoding(65001).GetString(HTML) else Temp :=TEncoding.Default.GetString(HTML);
      end;

      ResultWebHtml.Html:=Temp;

      //获取返回COOKIES
      Temp:=XMLHTTP.GetallResponseHeaders;
      TempList:=TStringList.Create;
      TempList.Text :=Temp;
      for I := 0 to TempList.Count -1 do begin
        if Pos(‘Set-Cookie:‘,TempList[I]) <> 0 then begin
          Temp:=Copy(TempList[I],12,Length(TempList[I]));
          Temp:=Copy(Temp,1,Pos(‘;‘,Temp));
          if Temp <> ‘‘ then PGetCookies:=PGetCookies+Temp;
        end;
      end;
      TempList.Free;
      ResultWebHtml.Cookie :=PGetCookies;
      Result:=ResultWebHtml;
    except
    End;
  finally
    XMLHTTP := Unassigned;
    CoUnInitialize;
  end;
End;

procedure TForm1.Button1Click(Sender: TObject);
begin
  Memo1.Text:=GetWebHtml(‘http://www.cnblogs.com/sishen‘,‘Get‘,‘‘,‘‘,‘‘,30,‘‘,‘‘,‘‘,‘‘,‘‘,‘‘,True,False,False).Html;
end;
时间: 2024-12-21 04:59:18

Delphi XE下获取网页源码记录的相关文章

delphi webbrowser 获取网页源码

转自 http://hi.baidu.com/delphidiary 转自 http://blog.sina.com.cn/s/blog_725fb194010150jh.html //前面要加几个pas单元uses Registry,ShellApi, WinInet,ShlObj,ComObj;//========================================删COOKIES========================== procedure DelRegCache;

IXMLHTTPRequest获取网页源码的心得

在万一老师的博客看到一种利用IXMLHTTPRequest来获取网页源码的方法,但有2个问题没解决,自己研究了下改进了方法. 1.如果网页进行301转跳将无法获取源码 2.如果网站是gb2312编码将获取的是乱码 /////以下方法使用的是Delphi xe2编写 uses MsXML,activex; function GETHTML (const URL : string):string; // XMLHTTP接口Var XMLHTTP:IServerXMLHTTPRequest; HTML

vc++获取网页源码

使用IWinHttpRequest获取网页源码 首先要创建基于对话框的mfc应用程序, 2.import+接口方式 首先导入winhttp.dll,使用IWinHttpRequest接口 #import "C:\\Windows\\System32\\winhttp.dll" void CHttpTestDlg::OnBnClickedButton1() { ::CoInitialize(NULL); // 初始化com组件 IWinHttpRequest *pHttpReq = NU

POST教程笔记 - WinHttp获取网页源码

①.WinINet与WinHttp的异同点,为什么使用WinHttp讲解? 详情见:<WinINet与WinHttp总结>文档,已经打包给大家了. ②.WinHttp接口调用方式:微软官方地址:http://msdn.microsoft.com/en-us/ ... 84263(v=vs.85).aspxWinHttp微软提供了两种调用方式:C++调用API的版本.COM组件的版本.这里面使用的是 C++ Interface 接口的组件的方式来给大家讲解. ③.WinHttp常用命令讲解:详情

Python爬虫学习之获取网页源码

偶然的机会,在知乎上看到一个有关爬虫的话题<利用爬虫技术能做到哪些很酷很有趣很有用的事情?>,因为强烈的好奇心和觉得会写爬虫是一件高大上的事情,所以就对爬虫产生了兴趣. 关于网络爬虫的定义就不多说了,不知道的请自行点击查看 =>百度百科 网络爬虫,维基百科 网络爬虫 有很多编程语言都可以编写网络爬虫,只不过各有各的优缺点,这里我选择用Python语言编写爬虫,因为Python是一门非常适合用来编写爬虫的语言,用它实现爬虫的代码量相对其他语言要少很多,并且python语言对网络编程这类模块

C++ 获取网页源码码的操作

#include <stdio.h>#include <windows.h>#include <wininet.h>#pragma comment(lib,"Wininet.lib")#include <vector>using namespace std;int _tmain(int argc, _TCHAR* argv[]){ vector<TCHAR> v; TCHAR szUrl[] = _T("http:/

asp.net C# 获取网页源码的几种方式

1 方法 System.Net.WebClient aWebClient = new System.Net.WebClient(); aWebClient.Encoding = System.Text.Encoding.Default; Byte[] pageData = aWebClient.DownloadData(url); string nhtml = Encoding.GetEncoding("utf-8").GetString(pageData); 2方法 System.N

按键精灵 vbs 获取网页源码 xp系统被拒绝

如下面的代码所示,获取新浪博客某个指定网页的源码 verurl = "http://blog.sina.com.cn/s/blog_9ea1db7b0101o7ch.html?" & now() Set Http = CreateObject("Microsoft.XMLHTTP") Http.open "get", verurl, False Http.send Delay 50 vbody = Http.responsebody Tr

iOS项目开发实战——使用同步请求获取网页源码

网络请求一般分为同步请求和异步请求,同步请求假设訪问时间过长,会造成界面卡死状态,用户体验不是非常好.可是请求速度较快的话,也能够考虑使用同步訪问.如今先来学习同步訪问. (1)在viewDidLoad()方法中实现例如以下代码: override func viewDidLoad() { super.viewDidLoad() var data = NSURLConnection.sendSynchronousRequest(NSURLRequest(URL: NSURL(string: "h