http://bill.finance.sina.com.cn/bill/detail_js.php?stock_code=sh600690
이 url을 주소창에 넣고 치면 detail_js.php파일의 다운로드창이 뜹니다.
이 url을 urldownloadtofile함수에 넣어 detail_js.php을 다운로드할수는 있는데
stock_code가 수만개이고 홈피가 5~10초간격으로 갱신되므로 파일을 다운로드하고 다시 읽어서 분석할 여유가 없습니다.
post에 이 url을 쓰니까 다운로드창은 뜨지 않는데 돌아오는 스트링스트림이 비여있고
get에 쓰면 tntmemo에 이상한 문자렬이 뜹니다.
첨부파일의 그림은 다운로드한 파일의 내용과 메모리스트림에 읽어 save한 내용의 대비입니다.
그림상단은 ultraedit의 헥스에디터로 본것입니다.
시간이 촉박한 과제인데 무슨 방법이 없을가요?
고수님들 가르침을 기다립니다.
<!--CodeS-->
var
Form1: TForm1;
idhttp : TIdHTTP;
implementation
uses IdHTTP, IdMultipartFormData;
{$R *.dfm}
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
idhttp.Free;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
if Win32Platform = VER_PLATFORM_WIN32_NT then
Font.Name := 'MS Shell Dlg 2'
else
Font.Name := 'MS Shell Dlg';
idhttp := TIdHTTP.Create(nil);
end;
procedure TForm1.btn1Click(Sender: TObject);
var
postdata: TIdMultiPartFormDataStream;
recstream: TStringStream;
url : string;
begin
postdata := TIdMultiPartFormDataStream.Create;
postdata.AddFormField('stock_code', 'sh600690');
postdata.Position :=0;
idhttp.Request.ContentType := postdata.RequestContentType;
recstream := TStringStream.Create('');
url := 'http://bill.finance.sina.com.cn/bill/detail_js.php';
try
idhttp.Post(url, postdata, recstream);
finally
mmo1.Lines.Add(recstream.DataString);
ShowMessage('Post End');
end;
recstream.Free;
postdata.Free;
end;
procedure TForm1.btn2Click(Sender: TObject);
var
recstream: TStringStream;
url : string;
begin
recstream := TStringStream.Create('');
url := 'http://bill.finance.sina.com.cn/bill/detail_js.php?stock_code=sh600690';
try
//mmo1.Lines.Add(idhttp.Get(url));
idhttp.Get(url, recstream);
finally
mmo1.Lines.Add(recstream.DataString);
ShowMessage('Get End');
end;
recstream.Free;
end;
<!--CodeE-->
TNTmemo의 글자가 깨진것은 서버에서 HTML을 압축해서 돌려주기 때문이였습니다. 인디 10의 zlibcompress던지 그걸로 돌아오는 스트링스트림을 복호화하면 되더군요. 이번에 HTML에 대해 또 한수 배웠습니다.