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.
sprawdź czy adres, który podajesz do Get jest dobry poprawny
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;
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;
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.
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 :/
Zarejestruj się i dołącz do największej społeczności programistów w Polsce.
Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.