我正在尝试从用户个人资料中下载所有问题和答案,但是有一个问题,如果用户有大量问题我必须点击“显示更多”来扩展该列表。如果我尝试下载例如这些人的问题和答案:http://ask.fm/UnaRamekic(随机选择),我将只获得那些显示的,我点击显示更多后显示的那些不会被获取请求检索。我怎么能得到所有ICS或Indy组件的问题。感谢。
我的代码:
procedure TForm1.sButton1Click(Sender: TObject);
begin
With HttpCli1 do begin
URL := sedit1.Text;
RequestVer := '1.1';
RcvdStream := TMemoryStream.Create;
try
Get;
except
ShowMessage('There has been an error , check your internet connection !');
RcvdStream.Free;
Exit;
end;
RcvdStream.Seek(0,0);
Memo1.Lines.LoadFromStream(RcvdStream);
RcvdStream.Free;
end;
end;
答案 0 :(得分:1)
单独使用Indy或ICS,你无法做到这一点。您最初看到的内容就是在您提取HTTP请求时正在下载的内容。
如果您查看页面的HTML源代码,您会看到“查看更多”按钮附加了一个JavaScript事件处理程序,它向服务器发出AJAX请求,从中提取更多数据,并应用它到页面。如果你想做同样的事情,你的代码需要解析出至少足以获得正确的AJAX参数,然后从你的Indy或ICS代码向服务器发出请求,就像任何其他HTTP请求一样,并处理数据回来了。
答案 1 :(得分:1)
警告:强> 的
这种做法很蹩脚,非常危险。它类似于Show more按钮发布表单数据,但它使用while循环(接收所有页面),重复直到找到响应中的确切常量(在代码中它是LastPageResponse
常量),所以当页面的响应内容将被更改一段时间并且常量不会出现在响应中时,您将发现自己处于无限循环中。
在GetAllQuestions
功能中,您可以指定:
GetAllQuestions
函数返回基本用户的页面,然后换行符分隔从基页到您指定的时间和页面的所有页面范围内的内容。忘记注意,您需要以与基页不同的方式解析其他内容,因为它不是HTML内容。
uses
IdHTTP;
implementation
function GetAllQuestions(const AUser: string; AFromDate: TDateTime;
AStartPage: Integer = 1): string;
var
Response: string;
LastPage: Integer;
TimeString: string;
HTTPClient: TIdHTTP;
Parameters: TStrings;
const
LineBreaks = sLineBreak + sLineBreak;
LastPageResponse = '$("#more-container").hide();';
begin
Result := '';
HTTPClient := TIdHTTP.Create(nil);
try
Result := HTTPClient.Get('http://ask.fm/' + AUser) + LineBreaks;
Parameters := TStringList.Create;
try
LastPage := AStartPage;
TimeString := FormatDateTime('ddd mmm dd hh:nn:ss UTC yyyy', AFromDate);
Parameters.Add('time=' + TimeString);
Parameters.Add('page=' + IntToStr(LastPage));
while LastPage <> -1 do
begin
Parameters[1] := 'page=' + IntToStr(LastPage);
Response := HTTPClient.Post('http://ask.fm/' + AUser + '/more',
Parameters);
if Copy(Response, Length(Response) - Length(LastPageResponse) + 1,
MaxInt) = LastPageResponse
then
LastPage := -1
else
LastPage := LastPage + 1;
Result := Result + Response + LineBreaks;
end;
finally
Parameters.Free;
end;
finally
HTTPClient.Free;
end;
end;
用法:
procedure TForm1.Button1Click(Sender: TObject);
begin
try
Memo1.Text := GetAllQuestions('TLama', Now);
except
on E: Exception do
ShowMessage(E.Message);
end;
end;