Delphi 如何从Google搜索结果中提取目标URL?

Delphi 如何从Google搜索结果中提取目标URL?,delphi,delphi-7,Delphi,Delphi 7,我试图从谷歌搜索结果中提取URL。我使用Indy IdHTTP从Google获取HTML结果,我使用。我怎样才能获得每个URL的真正链接目标,而不是通过Google的重定向器的链接目标 我试过了,但在这部分代码中出现了“操作数不适用”错误: function ToUTF8Encode(str: string): string; var b: Byte; begin for b in BytesOf(UTF8Encode(str)) do begin Result := Fo

我试图从谷歌搜索结果中提取URL。我使用Indy IdHTTP从Google获取HTML结果,我使用。我怎样才能获得每个URL的真正链接目标,而不是通过Google的重定向器的链接目标


我试过了,但在这部分代码中出现了“操作数不适用”错误:

function ToUTF8Encode(str: string): string;
var
  b: Byte;
begin
  for b in BytesOf(UTF8Encode(str)) do
  begin
    Result := Format('%s%s%.2x', [Result, '%', b]);
  end;
end;

我使用Delphi7和Indy 9.00.10。也许indy update会有所帮助?

如果我没弄错,您正在尝试使用该方法获取谷歌搜索结果。如果是这样的话,那么
您肯定应该关注一些Google搜索API实现,因为

  • 以这种方式获取结果是不可能的,因为您无法访问包含搜索结果的iframe中的文档,因此在这种情况下,您无法通过使用HTTP get获得任何搜索结果(或者至少我没有听说可以这样做的请求)
  • 这与谷歌的政策背道而驰,你应该使用合适的谷歌搜索API,例如,还有几种类型的谷歌搜索API可用于各种目的

  • 例如,您可以找到带有谷歌搜索API代码的Delphi包装器。我已经在Windows 7/64上用Delphi 2009对它进行了测试,它对我来说很好。

    在之前的文章中,我试图解释为什么你应该使用Google搜索API,在这篇文章中,我将尝试为你提供一个示例,希望它能在你的Delphi 7中工作

    您需要有(用于Delphi的JSON解析器),我已经使用过(最新一次)。那你需要印第;如果可能,最好升级到最新版本。我使用了Delphi2009附带的方法,但我认为该方法非常重要,因此在您的9.00.10版本中也必须能够正常工作

    现在,您需要一个列表框和表单上的一个按钮,下面的代码和一点运气(为了兼容性:)

    例如,您可以在前面提到的DxGoogleSearchApi.pas中看到URL请求构建,但最好是遵循。在DxGoogleSearchApi.pas中,您可以获得灵感,例如如何获取多个页面

    因此,将此作为灵感

    uses
      IdHTTP, IdURI, SuperObject;
    
    const
      GSA_Version = '1.0';
      GSA_BaseURL = 'http://ajax.googleapis.com/ajax/services/search/';
    
    procedure TForm1.GoogleSearch(const Text: string);
    var
      I: Integer;
      RequestURL: string;
      HTTPObject: TIdHTTP;
      HTTPStream: TMemoryStream;
      JSONResult: ISuperObject;
      JSONResponse: ISuperObject;
    begin
      RequestURL := TIdURI.URLEncode(GSA_BaseURL + 'web?v=' + GSA_Version + '&q=' + Text);
    
      HTTPObject := TIdHTTP.Create(nil);
      HTTPStream := TMemoryStream.Create;
    
      try
        HTTPObject.Get(RequestURL, HTTPStream);
        JSONResponse := TSuperObject.ParseStream(HTTPStream, True);
    
        if JSONResponse.I['responseStatus'] = 200 then
        begin
          ListBox1.Items.Add('Search time: ' + JSONResponse.S['responseData.cursor.searchResultTime']);
          ListBox1.Items.Add('Fetched count: ' + IntToStr(JSONResponse['responseData.results'].AsArray.Length));
          ListBox1.Items.Add('Total count: ' + JSONResponse.S['responseData.cursor.resultCount']);
          ListBox1.Items.Add('');
    
          for I := 0 to JSONResponse['responseData.results'].AsArray.Length - 1 do
          begin
            JSONResult := JSONResponse['responseData.results'].AsArray[I];
            ListBox1.Items.Add(JSONResult.S['unescapedUrl']);
          end;
        end;
    
      finally
        HTTPObject.Free;
        HTTPStream.Free;
      end;
    end;
    
    procedure TForm1.Button1Click(Sender: TObject);
    begin
      GoogleSearch('Delphi');
    end;
    

    回答我的问题,也许它可以帮助某人: 正在获取网页:

    memo1.Lines.Text := idhttp1.Get('http://ajax.googleapis.com/aja...tart=1&rsz=large&q=max');
    
    正在提取URL:

    function ExtractText(const Str, Delim1, Delim2: string; PosStart: integer; var PosEnd: integer): string;
    var
      pos1, pos2: integer;
    begin
      Result := '';
      pos1 := PosEx(Delim1, Str, PosStart);
      if pos1 > 0 then
      begin
        pos2 := PosEx(Delim2, Str, pos1 + Length(Delim1));
        if pos2 > 0 then
        begin
          PosEnd := pos2 + Length(Delim2);
          Result := Copy(Str, pos1 + Length(Delim1), pos2 - (pos1 + Length(Delim1)));
        end;
      end;
    end;
    
    在按钮1上,只需放置:

    procedure TForm1.Button1Click(Sender: TObject);
    var Pos: integer;
        sText: string;
    begin
      sText := ExtractText(Memo1.Lines.Text, '"url":"', '","visibleUrl"', 1, Pos);
      while sText <> '' do
      begin
        Memo2.Lines.Add(sText);
        sText := ExtractText(Memo1.Lines.Text, '"url":"', '","visibleUrl"', Pos, Pos);
      end;
    end;
    
    procedure TForm1.按钮1点击(发送方:TObject);
    var-Pos:整数;
    sText:字符串;
    开始
    sText:=ExtractText(Memo1.Lines.Text,“url”:“,”,“visibleUrl”,1,Pos);
    而sText“”可以
    开始
    备忘录2.行。添加(sText);
    sText:=ExtractText(Memo1.Lines.Text,“url”:“,”,“visibleUrl”,Pos,Pos);
    结束;
    结束;
    
    www.delphi.about.com有很好的字符串操作文档,Zarko Gajic在该网站上做得很好:)
    注意:如果google更改了它的源代码,这将是无用的。

    好的,告诉我们您尝试了什么以及这些尝试是如何失败的。google会进行严重的浏览器嗅探和点击计数,将您的homebrewn用户代理屏蔽为Opera可能会有所帮助。尝试过bu I get'Operator在这部分代码中没有适用的错误:函数ToUTF8Encode(str:string):字符串;变量b:字节;以字节数形式为b开始(UTF8Encode(str))do begin Result:=格式(“%s%s%.2x”,[Result,%”,b]);结束;我使用Delphi7和Indy 9.00.10。也许indy update会有所帮助?@Danijel,对不起,这是因为BytesOf中的b的
    语句还没有出现在Delphi 7中。作为修补程序,您可以尝试用更新帖子中的功能替换原来的
    ToUTF8Encode
    功能。希望这将是最后一件不相容的事情。无论如何,您仍然可以用一些编码URL地址的函数替换
    ToUTF8Encode
    函数。这是这个函数的唯一用途。感谢您的帮助,我尝试了这个功能,并使用了sh_web和其他类型作为搜索类型,我总是在模块中的地址xxxx中得到错误的访问冲突。谢谢你的帮助。我不想再打扰你了,看来我找不到那个代码了。但我会继续搜索。诉诸谷歌政策禁令对我来说似乎有问题,得到正式声明了吗?另外,
    iframe
    ?@过早优化,您是否尝试使用TIdHTTP.get获取谷歌搜索网页?也许你关于用户客户端的建议可能会奏效,但还是有些过分。看来我注定要失败了,现在我发现EidHttp错误Http 404找不到了,我的朋友会给我带来Delphi 2009,这似乎是我唯一的选择,甚至连Marco Cantu的webfind代码都不适合我[],它是为Delphi 7设计的,程序TFindWebThread.HtmlToList有问题;我就是想不出来:(@Danijel,HTTP 404表示您有一个错误的URL请求。很简单,只需将要传递给TIdHTTP.Get方法的URL地址粘贴到您的web浏览器中,您就会得到相同的错误。如果您有正确的URL,那么您将得到JSON结果,浏览器中会有一个纯文本对象表示法。@Danijel,尝试传递to例如,TIdHTTP.Get
    http://ajax.googleapis.com/ajax/services/search/web?v=1.0&q=Delphi
    您将得到正确的结果。我得到404,错误指针设置为JSONResponse:=TSuperObject.ParseStream(HTTPStream,True);我想这么做,但没有足够的代表权,现在我接受了你的回答,再次感谢:)