Einzelnen Beitrag anzeigen

bennepalz

Registriert seit: 10. Jan 2005
3 Beiträge
 
#1

Anfangsposition setzen bei Http-Download

  Alt 6. Jan 2009, 09:11
Hallo zusammen,

ich möchte gerne die Bewertungen eines Albums von Amazon.de auslesen. Das funktioniert schon alles ohne Probleme.
Um das ganze zu beschleunigen, würde ich gerne erst ab einer bestimmten Position/in einem bestimmten Bereich (100000-150000) den Download durchführen, da ich ungefähr weiß,
wo die Information steht.

1. Möglichkeit: "InternetSetFilePointer" Die funktioniert leider bei mir nicht, und soll auch recht langsam sein
2. Möglichkeit: Den Bereich "Range" über den Header übertragen. Im Internet habe ich einige Beispiel darüber gefunden.
Leider funktioniert es nicht. Ich weiß nicht, ob es einfach an Amazon liegt oder an mir.
Andere Seiten (google) habe ich auch schon ohne Erfolg ausprobiert. Der "Range" Header wird immer ignoriert.
Die meisten Beispiele die ich fand, waren aber genauso programmiert.
Im Header wird auch keine HTTP_QUERY_CONTENT_LENGTH übertragen. Vielleicht funktioniert es deshalb nicht?

Im folgenden ist der Code, mit dem ich gescheitert bin. Vielen Dank schon mal.
Beste Grüße

Delphi-Quellcode:
var
  hOpen, hConnect, hResource: HINTERNET;

  //Hier der Link auf die Amazon Seite: "Guns n Roses - Chinese Democracy"
  Host:String='www.amazon.de';
  Resource:String='/s/ref=nb_ss_w?__mk_de_DE=%C5M%C5Z%D5%D1&url=search-alias%3Daps&field-keywords=chinese&x=0&y=0';


function DownloadAtPos(const AURL, AFileName: string; APos: Integer): Integer;
var
  FileStream: TFileStream;
  s: string;
  DataProceed: array[0..8191] of Byte;
  numread: DWORD;
begin
  hOpen := InternetOpen('WinInet sample', INTERNET_OPEN_TYPE_PRECONFIG, nil, nil, 0);
  hConnect := InternetConnect(hOpen, PChar(host), INTERNET_DEFAULT_HTTP_PORT, nil, nil, INTERNET_SERVICE_HTTP, 0, 0);
  hResource := HttpOpenRequest(hConnect, 'GET', PChar(resource), nil, nil, nil, 0, 0);

  s := Format('Range: bytes=%d-%d', [100000,150000]); //Setze den zu lesenden Bereich
  HttpAddRequestHeaders(hResource, PChar(s), Length(s), HTTP_ADDREQ_FLAG_ADD_IF_NEW); //schreibe Header

  HttpSendRequest(hResource, nil, 0, nil, 0);

  //Download der Datei
  FileStream := TFileStream.Create(AFileName, fmCreate);
  try
    FileStream.Size:=0;
    FileStream.Position := 0;
    repeat
      ZeroMemory(@DataProceed, SizeOf(DataProceed));
      InternetReadFile(hResource, @DataProceed, SizeOf(DataProceed), numread);
      if (numread <= 0) then Break;
      FileStream.Write(DataProceed, numread);
      Result := Result + Integer(numread);
    until (not FIsDownloading);
  finally

    FileStream.Free();
    InternetCloseHandle(hConnect);
    InternetCloseHandle(hOpen);
  end;
end;

function GetResourceSize(const AURL: string): Integer;
var
  s: string;
  buflen, tmp: DWORD;
begin
  hOpen := InternetOpen('WinInet resuming sample', INTERNET_OPEN_TYPE_PRECONFIG, nil, nil, 0);
  hConnect := InternetConnect(hOpen, PChar(host), INTERNET_DEFAULT_HTTP_PORT, nil, nil, INTERNET_SERVICE_HTTP, 0, 0);
  hResource := HttpOpenRequest(hConnect, 'HEAD', PChar(resource), nil, nil, nil, 0, 0);
  HttpSendRequest(hResource, nil, 0, nil, 0);

  buflen := SizeOf(Result);
  tmp := 0;
  Result := 0;
  HttpQueryInfo(hResource, HTTP_QUERY_CONTENT_LENGTH or HTTP_QUERY_FLAG_NUMBER, @Result, buflen, tmp);

  InternetCloseHandle(hConnect);
  InternetCloseHandle(hOpen);
end;
  Mit Zitat antworten Zitat