|
#1
|
|||
|
|||
Простой парсинг
Здравствуйте, хочу научиться для себя парсить сайты с помощью Synapse. В качестве примера взял сайт pikabu. Снифером внимательно отследил данные, отправил их методом POST, залогинелся, но вот как уже под своим логином перейти на другую страницу этого ресурса и выгрузить html код страницы?
Попробовал реализовать следующим образом: Код:
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, httpsend, ssl_openssl, StdCtrls; type TForm1 = class(TForm) btn1: TButton; mmo1: TMemo; edt1: TEdit; procedure btn1Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} function FoundLocationStrNum(Headers: TStringlist): integer; var FoundStrPos, i: integer; begin Result := -1; for i := 0 to Headers.Count do begin FoundStrPos := Pos('Location: ', Headers.Strings[i]); if FoundStrPos > 0 then begin Result := i; exit; end; end; end; function GetHTTPStr(http: THTTPSend): string; var BodyStream: TStringStream; BodyS: TStringList; begin try BodyS := TStringList.Create; BodyStream := TStringStream.Create(result); begin BodyS.LoadFromStream(http.Document); result := BodyS.Text; end; finally BodyStream.Free; BodyS.Free; end; http.Document.Seek(0, soFromBeginning); end; procedure TForm1.btn1Click(Sender: TObject); var httpsend: THTTPSend; stream: TStringStream; n: integer; NewURL, result: string; Res: boolean; begin httpsend:= THTTPSend.Create; stream := TStringStream.Create(''); stream.WriteString('mode=login&username=***&password=***&remember=1'); Application.ProcessMessages; httpsend.MimeType := 'application/x-www-form-urlencoded'; httpsend.Document.LoadFromStream(stream); Res := httpsend.HTTPMethod('post', 'http://pikabu.ru/ajax/ajax_login.php'); Application.ProcessMessages; case httpsend.ResultCode of 301, 302, 307: begin n := FoundLocationStrNum(httpsend.Headers); if (n >= 0) and (n <= httpsend.Headers.count) then begin httpsend.Clear; httpsend.HTTPMethod('GET', edt1.Text); Application.ProcessMessages; mmo1.Lines.Text := GetHTTPStr(httpsend); Application.ProcessMessages; end; end; end; httpsend.HTTPMethod('GET', edt1.Text); Application.ProcessMessages; mmo1.Text:=Utf8ToAnsi(GetHTTPStr(httpsend)); end; end. Цитата:
|
#2
|
||||
|
||||
Цитата:
Т.е. смотри свойство THTTPSend.Cookies |
#3
|
|||
|
|||
Цитата:
Сделал как было предложено, в итоге и в методе POST и в методе GET используются одни и те же куки Код:
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, httpsend, ssl_openssl, StdCtrls; type TForm1 = class(TForm) btn1: TButton; mmo1: TMemo; edt1: TEdit; procedure btn1Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} function FoundLocationStrNum(Headers: TStringlist): integer; var FoundStrPos, i: integer; begin Result := -1; for i := 0 to Headers.Count do begin FoundStrPos := Pos('Location: ', Headers.Strings[i]); if FoundStrPos > 0 then begin Result := i; exit; end; end; end; function GetHTTPStr(http: THTTPSend): string; var BodyStream: TStringStream; BodyS: TStringList; begin try BodyS := TStringList.Create; BodyStream := TStringStream.Create(result); begin BodyS.LoadFromStream(http.Document); result := BodyS.Text; end; finally BodyStream.Free; BodyS.Free; end; http.Document.Seek(0, soFromBeginning); end; procedure TForm1.btn1Click(Sender: TObject); var httpsend: THTTPSend; stream: TStringStream; str: TstringList; n: integer; NewURL, result: string; Res: boolean; begin str:=TstringList.Create; httpsend:= THTTPSend.Create; stream := TStringStream.Create(''); stream.WriteString('mode=login&username=***&password=***&remember=1'); Application.ProcessMessages; httpsend.MimeType := 'application/x-www-form-urlencoded'; httpsend.Document.LoadFromStream(stream); Res := httpsend.HTTPMethod('post', 'http://pikabu.ru/ajax/ajax_login.php'); str.Text:=httpsend.Cookies.Text; httpsend.Clear; httpsend.Cookies.Text:=str.Text; httpsend.HTTPMethod('GET', edt1.Text); Application.ProcessMessages; mmo1.Text:=Utf8ToAnsi(GetHTTPStr(httpsend)); end; end. Цитата:
В чем может быть проблема? Может из-за того, что я Гет в начале перед логином не делаю? Это вообще критично? |
#4
|
||||
|
||||
Цитата:
Пишу программы за еду. __________________ |
#5
|
|||
|
|||
Все сделал, но все равно грузит какой-то странный исходный код страницы… креплю к посту исходник, посмотрите пожалуйста
|
#6
|
||||
|
||||
Цитата:
|
#7
|
|||
|
|||
Цитата:
|
#8
|
||||
|
||||
часто бывает, что после отправки Post, в ответе идет редирект, который и возвращает нужную страницу.
Пишу программы за еду. __________________ |
#9
|
||||
|
||||
Цитата:
Вот так у меня через Mozilla Firefox: А вот так через Internet Explorer: |
#10
|
|||
|
|||
IdHTTP тоже с JavaScript не дружит?
Меня сейчас озадачило два момента… Первый: Код:
//===POST 2=== httpsend:=THTTPSend.Create; httpsend.MimeType:='application/x-www-form-urlencoded'; httpsend.UserAgent:=('Opera/9.80 (Windows NT 6.1; U; ru) Presto/2.10.229 Version/11.61'); stream := TStringStream.Create(''); stream.WriteString('i=1770882&type=+'); httpsend.Document.LoadFromStream(stream); httpsend.Cookies.Text:=str.Text; httpsend.HTTPMethod('post','http://pikabu.ru/ajax/dig.php' ); httpsend.Free; Даже когда передаешь ASCII-код символа + как #043 его всеравно нет. Второй: Неясность с куками. Я использую для кук следующий код Код:
str.Text:=httpsend.Cookies.Text; и перед каждым запросом вставляю строку Код:
httpsend.Cookies.Text:=str.Text; А два разных POST при этом имеет два разных кука... что-то работает не так как должно |
#11
|
||||
|
||||
Цитата:
Код:
stream.WriteString('i=1770882&type=a%2Bb'); // Получим два параметра: "i=1770882" и "type=a+b" Цитата:
Цитата:
Код:
httpsend.Cookies.Text := 'primer=55'; |
#12
|
|||
|
|||
Код:
httpsend.Cookies.Text := 'primer=55'; Делаю вот так Код:
httpsend:=THTTPSend.Create; httpsend.HTTPMethod('get','http://pikabu.ru' ); str.Text:=httpsend.Cookies.Text; ShowMessage(httpsend.Cookies.Text); |
#13
|
||||
|
||||
Цитата:
UPD. На работе у меня интернет через прокси, поэтому этот пример я проверить не имел возможности. Дома проверил - как я и ожидал - сервер по этому запросу никаких кук не присылает, так что вполне закономерно, что ShowMessage выводит пустоту. Последний раз редактировалось poli-smen, 13.12.2013 в 01:13. |