Delphi 如何从Google搜索结果中提取目标URL?
我试图从谷歌搜索结果中提取URL。我使用Indy IdHTTP从Google获取HTML结果,我使用。我怎样才能获得每个URL的真正链接目标,而不是通过Google的重定向器的链接目标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
我试过了,但在这部分代码中出现了“操作数不适用”错误:
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实现,因为
例如,您可以找到带有谷歌搜索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.Gethttp://ajax.googleapis.com/ajax/services/search/web?v=1.0&q=Delphi
您将得到正确的结果。我得到404,错误指针设置为JSONResponse:=TSuperObject.ParseStream(HTTPStream,True);我想这么做,但没有足够的代表权,现在我接受了你的回答,再次感谢:)