idHTTP1.Get - PROBLEM

0

Witam.
Jak w temacie mam maly problem z pobieraniem zrodla strony przez idHTTP1.Get w Delphi 7 Enterprise;/
Chodzi mi o to zeby program wysylal tekst do wyszukiwarki google i pobral zrodlo z wynikami wyszukiwania.
Owszem program dziala ale tylko do momentu podania pierwszego zapytania. Jezeli chce wyslac zapytania do google w petli wyskakuje blad ze nie odnaleziono strony;/
Pozdrawiam.

0

sprawdź czy adres, który podajesz do Get jest dobry poprawny

0

Pokaż kod, może ktoś coś doradzi, ja się niepewnie czuję w Indy, dlatego bardziej polecał bym Tobie
Synapse. Tam raz w OnCreate utworzony obiekt THttpSend i zwolniony w OnDestroy - mozna zrobić:

  SynHttp.HTTPMethod('GET', Url);

I zwróconą stronę będziesz miał we własności typu TMemoryStream o nazwie Document. Jeżeli przy
pobieraniu danych lub ich wysyłaniu metodą POST, serwer zwróci kod 301 lub 302 to trzeba sobie z
nagłowków pobrać adres do przekierowania i oczywście przejśc pod niego. A poniżej mały przykład z
wysyłania wprawdzie danych po pobraniu, który już tutaj podawałem. I moduł httpsend daj do uses.
Kod loguje się do strony internetowej pewnego szczecińskiego klubu. To powinieneś zrozumieć ideę.

const
  Base_Url = 'http://www.heyaclub.pl/';
  Opera_UserAgent = 'Opera/9.80 (Windows NT 5.1; U; pl) Presto/2.6.30 Version/10.60';

function HeyaPostToMemoryStream(const URL : string;
  HeyaUserName, HeyaPassword : string; const MemoryStream : TMemoryStream) : boolean;
const
  Location_Prefix = 'Location:' + #32;
var
  SynHttp : THttpSend;
  I, Position : integer;
  OldCookie, UrlData, Str, DirectLink : string;
begin
  OldCookie := '';
  SynHttp := THttpSend.Create;
  try
    SynHttp.KeepAlive := True;
    SynHttp.Protocol := '1.1';
    SynHttp.UserAgent := Opera_UserAgent;
    SynHttp.HTTPMethod('GET', Base_Url);
    OldCookie := SynHttp.Cookies.Text;
    SynHttp.Clear;
    SynHttp.Cookies.Text := OldCookie;
    SynHttp.MimeType := ToPost_MimeType;
    URLData := 'login=' + HeyaUserName + '&pass=' + HeyaPassword + '&action=zaloguj';
    SynHttp.Document.Write(Pointer(URLData)^, Length(URLData));
    Result := SynHttp.HTTPMethod('POST', Url);
    case SynHttp.ResultCode of
      301, 302 :
        begin
          for I := 0 to SynHttp.Headers.Count - 1 do
          begin
            Str := SynHttp.Headers[I];
            Position := Pos(Location_Prefix, Str);
            if Position > 0 then
            begin
              DirectLink := Copy(Str, Position + Length(Location_Prefix), MaxInt);
              Break;
            end;
          end;
          HeyaPostToMemoryStream(DirectLink, HeyaUserName, HeyaPassword, MemoryStream);
        end;
    else
      MemoryStream.Clear;
      SynHttp.Document.SaveToStream(MemoryStream);
      MemoryStream.Position := 0;
    end;
  finally
    SynHttp.Free;
  end;
end;
0

w kompenencie memo1 znajduje sie kilka lini wpisow ktore chce przeslac do google
pierwszy wpis ok przy drugim juz jest blad
oto fragment kodu:
begin
//sprawdzmy czy aby na pewno zbior zostal wczytany
if memo1.Text = '' then
memo2.Lines.Add('Aby rozpoczac analize musisz wczytac zbior!')
else
begin
memo2.lines.Add('Lacze z hostem...');
ilosc_lin := memo1.Lines.Capacity;
for i := 1 to ilosc_lin do
begin
idHTTP1.Host := 'www.google.pl';
memo3.Text := idHTTP1.Get('www.google.pl/search?q='+memo1.Lines.Strings[i-1]);
memo3.Lines.SaveToFile(intToStr(i));
end;
end;
end;

0

Nie wiem co ma być konkretnie w Memo, ale ja bym zrobił - tak jak się to na ogół prawidłowo robi.
Czyli pętla od zera )a nie od 1) aż do Memo1.Lines.Count - 1 (a nie jakiegoś tam Capacity), zaś w
pętli później ...Memo1.Lines[I] (a nie Memo1.Lines.Strings[I - 1]). Poza tym polecam to, co już w
pierwszym swoim postcie, w tym wątku, napisałem: zamiast Indy - skorzystaj z lepszego Synapse.

0

Ja rozwiązałem problem poprzez uzyskanie z ekstrakcji z URL nazwy hosta, później adresu IP poprzez DNS (Tepsy). Wpisałem go do idHTTP1.Host ustawiłem idHTTP1.Port na 80 i działa z każdym adresem w Internecie.

To z mojego programu do obsługi elektronicznego systemu rozdzielania uprawnień dekoderom Cyfry+. Oczywiście poniżej jest fragment z pionu aktualizacji oprogramowania.

W formie dla komponentu IdDNSResolver1 zaznacz:
Host=194.204.159.1 //DNS Tepsy
QueryRecords=[qtA]

Spróbuj zatem w taki sposób.

//-----------------------------------------------------------------------------
//dodaj w razie potrzeby brakujące biblioteki
uses  IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient, IdHTTP,  IdStack, idexception, ShellApi, IdUDPBase, IdUDPClient, IdDNSResolver;


//GLOBAL
var ReadyToUpdate:Boolean;


//LOCAL
Var dlfile:Tfilestream;
      myURL:String;

(...)
// dalej
      myURL:='http://download.thinkbroadband.com/20MB.zip';
//    myURL:='http://mirror.internode.on.net/pub/test/10meg.test';

      idHttp1.Host:=GetIPDns(ExtractHostname(myURL));
      idHttp1.Port:=80;

      dlfile:=tfilestream.create('Plik_z_netu.bin',fmcreate);
      Label1.caption='Trwa pobieranie pliku aktualizacji programu';
        try
           idhttp1.Get(myURL,dlfile);
        except
          on E: EIdSocketError do
             begin
              ShowMessage('Błąd w ściąganiu plikiu '+myURL) ;
              dlfile.free;
              ReadyToUpdate:=False;
              exit;
             end;
        end;
       dlfile.free;
       ReadyToUpdate:=True;
       Label1.Caption:='Pobieranie plików aktualizacji zakończone';
    end;
(...)

//-----------------------------------------------------------------------------
function TFormUpdate.ExtractHostname(url:string):string;
var
  Host: String;
begin
  Host := Copy(Copy(URL,Pos('://',URL) + 3,Length(URL)),1,Pos('/',Copy(URL,Pos('://',URL) + 3,Length(URL))) - 1);
//  ShowMessage(Host);
  result:=Host;
end;
//-----------------------------------------------------------------------------
function TFormUpdate.GetIPDNS(url:string):string;
var
  iPos: Integer;
  sValue: String;
begin
  with IdDNSResolver1 do
   begin
     IdDNSResolver1.Resolve(url);
     for iPos:=0 to QueryResult.Count-1 do
      begin
         with IdDNSResolver1.QueryResult do
            begin
             if (Items[iPos] is TARecord) then sValue := TARecord(Items[iPos]).IPAddress;
             break;
            end;
      end;
   end;
   Result:=sValue;
end;
//-----------------------------------------------------------------------------

Trochę własnej reklamy
[CIACH!]
Dziękujemy za reklamę, ale to nie miejsce na nią. 4P to nie system reklamowy ani pozycjonerski :/

1 użytkowników online, w tym zalogowanych: 0, gości: 1