Как извлечь целевой URL из результатов поиска Google? - PullRequest
5 голосов
/ 11 октября 2011

Я пытаюсь извлечь URL из результатов поиска Google.Я использую Indy IdHTTP для получения HTML-результатов от Google и использую код Achmad Z для получения ссылок на страницу со страницы .Как я могу получить реальную цель ссылки для каждого 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;

Я использую Delphi 7 с Indy 9.00.10.Может, обновление indy поможет?

Ответы [ 3 ]

5 голосов
/ 12 октября 2011

Если я правильно понял, вы пытаетесь получить результаты поиска Google, используя метод TIdHTTP.Get.Если это так, то
вам определенно следует сосредоточиться на какой-то реализации Google Search API, потому что

  1. невозможно получить результаты таким образом, потому что у вас нет доступа к документу внутри iframe вчто результаты поиска, так что вы не получите никаких результатов поиска с использованием HTTP GET в этом случае (или, по крайней мере, я не слышал о запросе, который может сделать это)
  2. это против политики Google иВместо этого вы должны использовать надлежащий API поиска Google, например, Google SOAP Search API, также доступны несколько типов API поиска Google для различных целей

Вы можете найти, например, here обертка Delphi с кодом demo для Google Search API.Я протестировал его с Delphi 2009 на Windows 7/64, и он отлично работает для меня.

4 голосов
/ 13 октября 2011

В предыдущем посте я попытался объяснить, почему вы должны использовать Google Search API, в этом посте я постараюсь предоставить вам пример с надеждой, что он будет работать в вашем Delphi 7.

Вам нужно иметь SuperObject (парсер JSON для Delphi), я использовал this version (самое последнее на данный момент).Тогда вам нужна Инди;Лучше всего будет обновить его до последней версии, если это возможно.Я использовал тот, который поставляется с Delphi 2009, но я думаю, что метод TIdHTTP.Get настолько важен, что он должен нормально работать и в вашей версии 9.00.10.

Теперь вам нужносписок и кнопка в вашей форме, следующий фрагмент кода и немного удачи (для совместимости:)

Построение URL-запроса, которое вы можете увидеть, например, в DxGoogleSearchApi.pas, упомянутом ранее, но лучшеэто следовать Google Web Search API reference.В 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;
1 голос
/ 18 октября 2011

Ответьте на мой вопрос, может быть, кому-то это может помочь: Извлечение веб-страницы:

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;

А на Button1 просто поставьте:

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;

www.delphi.about.com имеет хорошую документацию по манипуляции со строками, Zarko Gajic отлично работает на этом сайте :) ПРИМЕЧАНИЕ: если Google изменит свой источник, это будет бесполезно.

...