4

ユーザープロファイルからすべての質問と回答をダウンロードしようとしていますが、問題があります.この人の質問と回答: http://ask.fm/UnaRamekic (ランダムな選択) 、表示されているもののみを取得します。[さらに表示] をクリックした後に表示されるものは get 要求では取得されません。 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;
4

2 に答える 2

1

Indy や ICS だけでそれを行うことはできません。最初に表示されるのは、HTTP 要求をプルしたときにダウンロードされるものとまったく同じです。

ページの HTML ソースを見ると、[View More] ボタンに JavaScript イベント ハンドラが添付されていることがわかります。このイベント ハンドラは、AJAX リクエストをサーバーに送信し、そこからさらにデータを取得して、ページ。同じことをしたい場合、コードは少なくとも適切な AJAX パラメーターを取得するのに十分なものを解析し、他の HTTP 要求と同様に Indy または ICS コードからサーバーに要求を行い、そのデータを処理する必要があります。戻ってくる。

于 2012-08-31T22:56:13.500 に答える
1

警告:

このアプローチは不十分であり、非常に危険です。[もっと見る] ボタンと同様にフォーム データを投稿しますが、(すべてのページを受け取るために) while ループを使用します。これは、応答の正確な定数が見つかるまで繰り返されます (コードではLastPageResponse定数です)。ページはしばらく変更され、その定数は応答に含まれず、無限ループに陥ります。

関数では、GetAllQuestions次を指定できます。

  • AUser - URL のスラッシュの後のユーザー名
  • AFromDate - 結果を取得する開始日時です
  • AStartPage - 結果を取得する AFromDate 日時の開始ページです。

この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;
于 2012-08-31T23:00:39.490 に答える