WebSearch.pas
上传用户:fh681027
上传日期:2022-07-23
资源大小:1959k
文件大小:4k
源码类别:

Delphi控件源码

开发平台:

Delphi

  1. unit WebSearch;
  2. interface
  3. uses
  4.   Windows, Messages, SysUtils, Classes, HTTPApp, HTTPProd, Db, DBClient, DBWeb,
  5.   IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient, IdHTTP;
  6. type
  7.   TWebModule1 = class(TWebModule)
  8.     DataSetTableProducer1: TDataSetTableProducer;
  9.     cds: TClientDataSet;
  10.     IdHTTP1: TIdHTTP;
  11.     procedure WebModule1WebActionItem1Action(Sender: TObject;
  12.       Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
  13.     procedure WebModule1WebActionItem2Action(Sender: TObject;
  14.       Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
  15.     procedure DataSetTableProducer1FormatCell(Sender: TObject; CellRow,
  16.       CellColumn: Integer; var BgColor: THTMLBgColor;
  17.       var Align: THTMLAlign; var VAlign: THTMLVAlign; var CustomAttrs,
  18.       CellData: String);
  19.   private
  20.     { Private declarations }
  21.   public
  22.     strRead: string;
  23.     procedure HtmlStringToCds;
  24.     procedure GrabHtml (strurl: string);
  25.   end;
  26. var
  27.   WebModule1: TWebModule1;
  28. implementation
  29. {$R *.DFM}
  30. const
  31.   strSearch = 'http://www.google.com/search?as_q=borland+delphi&num=100';
  32. procedure TWebModule1.GrabHtml (strurl: string);
  33. var
  34.   Http1: TIdHTTP;
  35. begin
  36.   Http1 := TIdHTTP.Create (nil);
  37.   try
  38.     strRead := Http1.Get (StrUrl);
  39.   finally
  40.     Http1.Free;
  41.   end;
  42. end;
  43. procedure TWebModule1.HtmlStringToCds;
  44. var
  45.   strAddr, strText: string;
  46.   nText: integer;
  47.   nBegin, nEnd: Integer;
  48. begin
  49.   strRead := LowerCase (strRead);
  50.   repeat
  51.     // find the initial part HTTP reference
  52.     nBegin := Pos ('href=http', strRead);
  53.     if nBegin <> 0 then
  54.     begin
  55.       // get the remaining part of the string, starting with 'http'
  56.       strRead := Copy (strRead, nBegin + 5, 1000000);
  57.       // find the end of the HTTP reference
  58.       nEnd := Pos ('>', strRead);
  59.       strAddr := Copy (strRead, 1, nEnd - 1);
  60.       // move on
  61.       strRead := Copy (strRead, nEnd + 1, 1000000);
  62.       // add the URL if 'google' is not in it
  63.       if Pos ('google', strAddr) = 0 then
  64.       begin
  65.         nText := Pos ('</a>', strRead);
  66.         strText := copy (strRead, 1, nText - 1);
  67.         // remove cached references and duplicates
  68.         if (Pos ('cached', strText) = 0) and not cds.Locate ('Address', strAddr, []) then
  69.           cds.InsertRecord ([0, strAddr, strText]);
  70.       end;
  71.     end;
  72.   until nBegin = 0;
  73. end;
  74. procedure TWebModule1.WebModule1WebActionItem1Action(Sender: TObject;
  75.   Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
  76. var
  77.   I: integer;
  78. begin
  79.   if not cds.Active then
  80.     cds.CreateDataSet
  81.   else
  82.     cds.EmptyDataSet;
  83.   for i := 0 to 5 do // how many pages?
  84.   begin
  85.     // get the data form the search site
  86.     GrabHtml (strSearch + '&start=' + IntToStr (i*100));
  87.     // scan it to fill the cds
  88.     HtmlStringToCds;
  89.   end;
  90.   cds.First;
  91.   // return producer content
  92.   Response.Content := DataSetTableProducer1.Content;
  93. end;
  94. procedure TWebModule1.WebModule1WebActionItem2Action(Sender: TObject;
  95.   Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
  96. begin
  97.   GrabHtml (strSearch);
  98.   Response.Content := strRead;
  99. end;
  100. function SplitLong(str: string): string;
  101. begin
  102.   // add spaces after / but not at the beginning, and after &
  103.   str := Copy (str, 1, 20) + StringReplace (
  104.       Copy (str, 21, 1000), '/', '/ ', [rfReplaceAll]);
  105.   Result := StringReplace (str, '&', '& ', [rfReplaceAll])
  106. end;
  107. procedure TWebModule1.DataSetTableProducer1FormatCell(Sender: TObject;
  108.   CellRow, CellColumn: Integer; var BgColor: THTMLBgColor;
  109.   var Align: THTMLAlign; var VAlign: THTMLVAlign; var CustomAttrs,
  110.   CellData: String);
  111. begin
  112.   if CellRow <> 0 then
  113.   case CellColumn of
  114.     0: CellData := IntToStr (CellRow);
  115.     1: CellData := '<a href="' +  CellData + '">' + SplitLong(CellData) + '</a>';
  116.     2: CellData := SplitLong (CellData);
  117.   end;
  118. end;
  119. end.