我正在使用我在这里找到的代码来获取www.imdb.com上的电影标题并且它工作正常,但由于imdb有某种地理定位,我需要想一想如何用“接受”来强制英语结果语言:en“标题,但我不确定我是否可以使用此代码。有可能吗?
uses
WinInet,
StrUtils,
SysUtils;
function GetHTMLTitle(const Url:string):string;
const
BuffSize = 64*1024;
TitleTagBegin='<title>';
TitleTagEnd ='</title>';
var
hInter : HINTERNET;
UrlHandle: HINTERNET;
BytesRead: Cardinal;
Buffer : Pointer;
i,f : Integer;
begin
Result:='';
hInter := InternetOpen('', INTERNET_OPEN_TYPE_PRECONFIG, nil, nil, 0);
if Assigned(hInter) then
begin
GetMem(Buffer,BuffSize);
try
UrlHandle := InternetOpenUrl(hInter, PChar(Url), nil, 0, INTERNET_FLAG_RELOAD,0);
try
if Assigned(UrlHandle) then
begin
InternetReadFile(UrlHandle, Buffer, BuffSize, BytesRead);
if BytesRead>0 then
begin
SetString(Result, PAnsiChar(Buffer), BytesRead);
i:=Pos(TitleTagBegin,Result);
if i>0 then
begin
f:=PosEx(TitleTagEnd,Result,i+Length(TitleTagBegin));
Result:=Copy(Result,i+Length(TitleTagBegin),f-i-Length(TitleTagBegin));
end;
end;
end;
finally
InternetCloseHandle(UrlHandle);
end;
finally
FreeMem(Buffer);
end;
InternetCloseHandle(hInter);
end
end;
procedure TForm1.Button1Click(Sender: TObject);
var
Title : string;
begin
Title := GetHTMLTitle('http://www.imdb.com/title/tt1490017/');
Label1.Caption := Copy(Title, 1, LastDelimiter(')', Title));
end;
答案 0 :(得分:1)
InternetOpenUrl()
的第3个参数允许您指定自定义标题,例如:
UrlHandle := InternetOpenUrl(hInter, PChar(Url), 'Accept-Language: en', -1, INTERNET_FLAG_RELOAD,0);
顺便说一句,无法保证InternetReadFile()
会将所有内容都返回到单个缓冲区中。您应该在循环中调用它,将每个缓冲区附加到本地缓存,直到您缓存了所需的所有内容,然后根据需要处理缓存。
更新:IMDB确实使用IP地理位置,因此显然它不像以前那样使用Accept-Language
。您必须根据以下内容调整HTTP请求:
Why am I seeing titles in a different language than before?
我们最近修改了网站上标题的显示方式。默认情况下,用户将看到在其所在国家/地区使用的语言中列出的标题(即,美国用户将看到用于北美版本的标题下列出的电影,而从法国浏览该网站的用户将看到出现的标题关于法国发行的那些电影等) 如果您在IMDb.com上注册并且您希望在默认情况下看到原始标题或任何其他语言/国家/地区的标题,则可以相应地设置您的用户首选项。
要执行此操作,请单击“您的帐户”链接(位于IMDb.com每个页面的右上角),然后单击“网站首选项”选项,或直接转到{{3} },然后从“标题显示国家/地区”和“标题显示语言”下拉菜单中选择所需的选项。点击“确定”保存您的选择。
如需更多帮助/信息,请参阅我们的网站首选项帮助页面。
另请注意,如果您通过以下网址访问该网站,无论您的登录状态或网站偏好如何,您都会看到原始标题下列出的电影: