1.URLを与えてFname(localfile)に保存し、
UrlDownloadToFile(nil, PChar(URL),PChar(Fname), 0, nil);
2.St(StringList)に読み込んで、pos関数で文字列'aaaaa'を含む行(m)を求めて、
St.LoadFromFile(Fname);
for i:=0 to ST.Count-1 do begin
j:=pos('aaaaa',St[i]);
if j>0 then begin m:=i;break;end;
end;
3.得ようとする文字列(Pstr)切り出して、Gt(StringList)に入れる。
k:=pos('</b>',St[m]);
Pstr:=midstr(St[m],k-6,6);
Gt.Add(Pstr);
上記1〜3を実行すると、若干の時間を要します。
どうすれば改善されますか?
>上記1〜3を実行すると、若干の時間を要します。
>どうすれば改善されますか?
若干の時間の時間とはどれほどの時間を指していますか?
このプログラムでは1つの文字列しか切り取っていないようですが
それならばほとんど時間が掛かっていない筈です
(HTML 自体大きなテキストファイルではありませんし)
たとえば <img タグの src= に設定されているファイル名を全て取得する
とかの場合にはより時間が掛かるでしょうが・・・
一番時間が掛かるのは
1.URLを与えてFname(localfile)に保存し、
UrlDownloadToFile(nil, PChar(URL),PChar(Fname), 0, nil);
だと思いますが。
ダウンロードデータ(つまりHTMLファイル)
を、一度、ファイルに書き出すから時間がかかるのではないでしょうか。
…回線速度によるような気もしますが…
WinInetを使って、
ダウンロードしてメモリ上で文字列を取得するには
http://delfusa.main.jp/delfusafloor/opensource/delfusalibrary/20070828160200/WinInetUnit/WinInetUnit.pas.txt
このページの一番下を参考にしてください。
また、Indyを使う場合は下記方法で出来たと思います。
//Indyを使う方法
//IndyのVersionは9.0.14
procedure TForm1.Button4Click(Sender: TObject);
var
SaveFileName, SaveURL: String;
fs: TFileStream;
begin
SaveURL := Edit1.Text;
SaveFileName := StringReplace(SaveURL, 'http://',
ExtractFilePath(Application.ExeName), [rfIgnorecase]);
SaveFileName := StringReplace(SaveFileName, '/', '\', [rfReplaceAll]);
ForceDirectories( ExtractFileDir( SaveFileName ));
ForceDirectories( ExtractFileDir( SaveFileName ));
fs := TFileStream.Create(SaveFileName, fmCreate); try
IdHTTP1.Get(SaveURL, fs);
finally fs.Free; end;
//別の取得方法として
//IdHTTP1.Get(SaveURL)とすると
//指定URLの内容が文字列で取得できる
end;
過去ログでもFusaさんの
「WinInetを使ったHTTPでのファイルダウンロードについて」を見つけました↓
https://www.petitmonte.com/bbs/answers?question_id=2268
消化不良ですが、これを使えば改善できそうです。
KHE00221さん、Fusaさん、的確な御指摘と御教示をありがとうございました。
ツイート | ![]() |