|
#1
|
|||
|
|||
Парсер на Синапсе
Учусь делать парсер на примере сайта http://brain.kiev.ua.
Есть код товара, есть форма поиска. Вводишь в неё код, осуществляешь переход и выгружаешь исходник в мемо. Проанализировал снифером: http://piccy.info/view3/5383603/7e8c...1bbf21fb30c70/ Откуда брать значения order.x и order.y я не понимаю... они генерируются каждый раз случайным образом, а в исходном коде стартовой страницы их нет... вот такие пироги ( указываю случайные числа - не помагает Код:
stream.WriteString('swords='+edt1.Text+'+&order.x=11&order.y=14'); |
#2
|
|||
|
|||
Подскажите хоть в каком направлении искать ( где-то же оно должно быть
|
#3
|
|||
|
|||
Цитата:
Значит они явно не случайные. Вообще, я чего-то не вижу где они д.б. Ну и тяжко разбираться, украинским не сильно владею... |
#4
|
|||
|
|||
Цитата:
Тут даже дело вот в чем: если сравнить два исходных кода стартовой страницы в разное время (после обновления) – соответствие 100% то есть ни одного символа так и не изменилось, но значения order.x и order.y ведь где-то берутся… сайт не очень замысловатый, не думаю, что там имеются какие-то дополнительные методы защиты… Вот мой код, может кто-то там увидит ошибку: Код:
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient, IdHTTP, IdIOHandler, IdIOHandlerSocket, IdSSLOpenSSL, httpsend, ssl_openssl, OleCtrls, SHDocVw, synacode, synautil, Gauges, ExtCtrls, ComCtrls, Grids; type TForm1 = class(TForm) btn1: TButton; mmo3: TMemo; edt1: TEdit; mmo5: TMemo; lbl1: TLabel; 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; link1, result, NewURL: string; n: integer; Res: boolean; begin httpsend:=THTTPSend.Create; httpsend.AddPortNumberToHost:= False; httpsend.HTTPMethod('get', 'http://brain.kiev.ua'); Application.ProcessMessages; mmo3.Lines.LoadFromStream(httpsend.Document); Application.ProcessMessages; stream := TStringStream.Create(''); stream.WriteString('swords='+edt1.Text+'+&order.x=11&order.y=14'); Application.ProcessMessages; httpsend.Clear; httpsend.MimeType := 'application/x-www-form-urlencoded'; httpsend.Document.LoadFromStream(stream); Res := httpsend.HTTPMethod('post', 'http://brain.kiev.ua/index.php?30&backPID=45'); Application.ProcessMessages; result:=IntToStr(httpsend.ResultCode); if result = '302' then begin lbl1.Caption:='Получилось'; Application.ProcessMessages; end; if result <> '302' then begin lbl1.Caption:='Не получилось'; Application.ProcessMessages; // mmo5.Clear; Application.ProcessMessages; end; if Res then case httpsend.ResultCode of 301, 302, 307: begin n := FoundLocationStrNum(httpsend.Headers); if (n >= 0) and (n <= httpsend.Headers.count) then begin NewURL := StringReplace(httpsend.Headers.Strings[n], 'Location: ', '', []); Application.ProcessMessages; httpsend.Clear; httpsend.HTTPMethod('GET', NewURL); Application.ProcessMessages; mmo5.Lines.Text := GetHTTPStr(httpsend); Application.ProcessMessages; end; end; end; end; end. |