如何自己编写程序下载某一固定地址的网页

xiufengy 2006-07-25 06:18:09
procedure TForm1.Timer1Timer(Sender: TObject);
var
NMHTTP11: TNMHTTP;
pp:boolean;
begin
NMHTTP11 := TNMHTTP.Create(nil);
NMHTTP11.ReportLevel :=Status_Basic;
try
NMHTTP11.Get(edit1.text);
//application.ProcessMessages;
sss := Trim(NMHTTP11.Body);
StatusBar1.Panels.Items[6].Text:='数据...';
except
NMHTTP11.Close(0);
FreeAndNil(NMHTTP11);
StatusBar1.Panels.Items[6].Text:='无数据';
exit;
end;
NMHTTP11.Close(0);
FreeAndNil(NMHTTP11);
getstrr;//对下载下来的网页进行分析,只取其中某个固定位置的数据(比如只取网页中含有 ’汇买价‘这三个汉字后的5个数字即可,在这个网页中含’汇买价‘这三个汉字地方只有一处)
end;


现在的问题是timer控件的interval我设的是15000,这个时间太长,最好是1000以内就好。
其实就算是15000,程序运行的时候cpu的利用率都会增加50%多,如果1000的话几乎不能运行。
有没有办法每次下载只下载网页中和上次内容不一样的部分,这样也许会快很多。
除了这个思路,还有没有别的办法,(不要告诉我向网页的所有者要数据接口)(注1:这个网页的下载完全合法,不存在盗取别人数据的问题)(注2:程序只是我自己炒汇用,不是什么其他用途)(不用mt4,外汇分析软件的原因是我有汇价语音提示的需要)

还有是不是通过WebBrowser或其他方法下载会更快?
...全文
593 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
newyj 2006-07-30
  • 打赏
  • 举报
回复
procedure TForm1.Timer1Timer(Sender: TObject);
var
NMHTTP11: TNMHTTP;
pp:boolean;
begin
timer1.enable = false;
//do ....
timer1.enable = true;
剩下的就是多就取一次

end;
xiufengy 2006-07-28
  • 打赏
  • 举报
回复
谁能给点更多的提示
iasp 2006-07-28
  • 打赏
  • 举报
回复
上面的代码从网页中提取url
iasp 2006-07-28
  • 打赏
  • 举报
回复
function Ge_tLinks(Url: string): Tstrings;
var
HttpStr, str, Url1: string;
st1, end1, i, j, Ord1: integer;
begin
Result := TStringList.Create; //创建Tstringlist事例

Httpstr := UrlGetStr(url);


for i := length(url) downto 9 do
begin
if url[i] = '/' then
begin
Url1 := copy(url, 1, i);
break;
end;
if i = 9 then Url1 := url + '/'; //结束都没有找到"/"就加一个"/"
end;

i := 1;
while true do
begin

st1 := Q_PosText('<a', httpstr, i);
st1 := Q_PosText('href=', httpstr, st1);

if (st1 = 0) or (st1 < i) then break;

st1 := st1 + 5; //开始位置设置为 href= 之后的位置
i := st1;

while true do
begin
// if i >= length(Httpstr) then break;
Ord1 := Ord(Httpstr[i]);
case Ord1 of
34, 39: //如果连接前有" 或 ' 就
begin
if i = st1 then
begin
st1 := st1 + 1;
end
else begin
end1 := i;
break;
end;
end;
36..38, 40..59, 61, 63..95, 97..254: ;
else
begin
end1 := i;
break;
end
end;
i := i + 1;
end;


//连接内容
str := copy(httpstr, st1, end1 - st1);

if (length(str) > 8) and (Q_PosText('mailto:', str, 1) = 0) and (Q_PosText('javascript:', str, 1) = 0) then
begin
if pos('://', str) = 0 then //表示要加前面网址的
begin
if str[1] = '/' then
begin
str := copy(url1, 1, Q_PosText('/', url1, 9)) + copy(str, 2, 100);
if Result.IndexOf(str) = -1 then Result.Add(str);
end
else begin
str := Url1 + str;
if Result.IndexOf(str) = -1 then Result.Add(str);
end;
end
else begin //表示本身就加了 http://的
if Result.IndexOf(str) = -1 then Result.Add(str);
end;
end;


i := end1; //

end;





end;



{ 功能同上,不区分大小写。使用此函数时,要在Interface部分加入ToUpperChars常量数组 }

function Q_PosText(const FindString, SourceString: string; StartPos: Integer): Integer;
asm
PUSH ESI
PUSH EDI
PUSH EBX
TEST EAX,EAX
JE @@qt
TEST EDX,EDX
JE @@qt0
MOV ESI,EAX
MOV EDI,EDX
PUSH EDX
MOV EAX,[EAX-4]
MOV EDX,[EDX-4]
DEC EAX
SUB EDX,EAX
DEC ECX
PUSH EAX
SUB EDX,ECX
JNG @@qtx
ADD EDI,ECX
MOV ECX,EDX
MOV EDX,EAX
MOVZX EBX,BYTE PTR [ESI]
MOV AL,BYTE PTR [EBX+ToUpperChars]
@@lp1: MOVZX EBX,BYTE PTR [EDI]
CMP AL,BYTE PTR [EBX+ToUpperChars]
JE @@uu
@@fr: INC EDI
DEC ECX
JE @@qtx
MOVZX EBX,BYTE PTR [EDI]
CMP AL,BYTE PTR [EBX+ToUpperChars]
JE @@uu
INC EDI
DEC ECX
JE @@qtx
MOVZX EBX,BYTE PTR [EDI]
CMP AL,BYTE PTR [EBX+ToUpperChars]
JE @@uu
INC EDI
DEC ECX
JE @@qtx
MOVZX EBX,BYTE PTR [EDI]
CMP AL,BYTE PTR [EBX+ToUpperChars]
JE @@uu
INC EDI
DEC ECX
JNE @@lp1
@@qtx: ADD ESP,$08
@@qt0: XOR EAX,EAX
@@qt: POP EBX
POP EDI
POP ESI
RET
@@ms: MOVZX EBX,BYTE PTR [ESI]
MOV AL,BYTE PTR [EBX+ToUpperChars]
MOV EDX,[ESP]
JMP @@fr
@@uu: TEST EDX,EDX
JE @@fd
@@lp2: MOV BL,BYTE PTR [ESI+EDX]
MOV AH,BYTE PTR [EDI+EDX]
CMP BL,AH
JE @@eq
MOV AL,BYTE PTR [EBX+ToUpperChars]
MOVZX EBX,AH
CMP AL,BYTE PTR [EBX+ToUpperChars]
JNE @@ms
@@eq: DEC EDX
JNZ @@lp2
@@fd: LEA EAX,[EDI+1]
POP ECX
SUB EAX,[ESP]
POP ECX
POP EBX
POP EDI
POP ESI
end;

end.
iasp 2006-07-28
  • 打赏
  • 举报
回复
unit GetLinks;
{
-----------------------------------------------
本代码由啊D编写 QQ:9269563
http://www.d99net.com
-----------------------------------------------
}

interface

uses
Windows, Wininet, SysUtils, Classes;

const
INADDR_NONE = $FFFFFFFF;

ToUpperChars: array[0..255] of Char =
(#$00, #$01, #$02, #$03, #$04, #$05, #$06, #$07, #$08, #$09, #$0A, #$0B, #$0C, #$0D, #$0E, #$0F,
#$10, #$11, #$12, #$13, #$14, #$15, #$16, #$17, #$18, #$19, #$1A, #$1B, #$1C, #$1D, #$1E, #$1F,
#$20, #$21, #$22, #$23, #$24, #$25, #$26, #$27, #$28, #$29, #$2A, #$2B, #$2C, #$2D, #$2E, #$2F,
#$30, #$31, #$32, #$33, #$34, #$35, #$36, #$37, #$38, #$39, #$3A, #$3B, #$3C, #$3D, #$3E, #$3F,
#$40, #$41, #$42, #$43, #$44, #$45, #$46, #$47, #$48, #$49, #$4A, #$4B, #$4C, #$4D, #$4E, #$4F,
#$50, #$51, #$52, #$53, #$54, #$55, #$56, #$57, #$58, #$59, #$5A, #$5B, #$5C, #$5D, #$5E, #$5F,
#$60, #$41, #$42, #$43, #$44, #$45, #$46, #$47, #$48, #$49, #$4A, #$4B, #$4C, #$4D, #$4E, #$4F,
#$50, #$51, #$52, #$53, #$54, #$55, #$56, #$57, #$58, #$59, #$5A, #$7B, #$7C, #$7D, #$7E, #$7F,
#$80, #$81, #$82, #$81, #$84, #$85, #$86, #$87, #$88, #$89, #$8A, #$8B, #$8C, #$8D, #$8E, #$8F,
#$80, #$91, #$92, #$93, #$94, #$95, #$96, #$97, #$98, #$99, #$8A, #$9B, #$8C, #$8D, #$8E, #$8F,
#$A0, #$A1, #$A1, #$A3, #$A4, #$A5, #$A6, #$A7, #$A8, #$A9, #$AA, #$AB, #$AC, #$AD, #$AE, #$AF,
#$B0, #$B1, #$B2, #$B2, #$A5, #$B5, #$B6, #$B7, #$A8, #$B9, #$AA, #$BB, #$A3, #$BD, #$BD, #$AF,
#$C0, #$C1, #$C2, #$C3, #$C4, #$C5, #$C6, #$C7, #$C8, #$C9, #$CA, #$CB, #$CC, #$CD, #$CE, #$CF,
#$D0, #$D1, #$D2, #$D3, #$D4, #$D5, #$D6, #$D7, #$D8, #$D9, #$DA, #$DB, #$DC, #$DD, #$DE, #$DF,
#$C0, #$C1, #$C2, #$C3, #$C4, #$C5, #$C6, #$C7, #$C8, #$C9, #$CA, #$CB, #$CC, #$CD, #$CE, #$CF,
#$D0, #$D1, #$D2, #$D3, #$D4, #$D5, #$D6, #$D7, #$D8, #$D9, #$DA, #$DB, #$DC, #$DD, #$DE, #$DF);

function Q_PosText(const FindString, SourceString: string; StartPos: Integer): Integer;
function Q_PosStr(const FindString, SourceString: string; StartPos: Integer): Integer;
function Ge_tLinks(Url: string): Tstrings;
function UrlGetStr(const URL: string; ShowHeaders: boolean = false): string;

implementation


function UrlGetStr(const URL: string; ShowHeaders: boolean = false): string;
const
Agent = 'Internet Explorer 6.0';
var
hFile, HInet: HINTERNET;
Buffer: array[0..32767] of Char;
BufRead: Cardinal;
BufSize: Cardinal;
TempStream: TStringStream;
dwIndex: dword;
begin
HInet := InternetOpen(PChar(Agent), INTERNET_OPEN_TYPE_PRECONFIG, nil, nil, 0);
if Assigned(HInet) then
try
hFile := InternetOpenUrl(HInet, PChar(URL), nil, 0, 0, 0);

TempStream := TStringStream.Create('');

dwIndex := 0;
BufSize := SizeOf(Buffer);

HttpQueryInfo(hfile, HTTP_QUERY_RAW_HEADERS_CRLF, @Buffer, BufSize, dwIndex);

if ShowHeaders then TempStream.Write(Buffer, BufSize);

if Assigned(hFile) then
try
with TempStream do
try
while InternetReadFile(hFile, @Buffer, BufSize, BufRead) and (BufRead > 0) do
Write(Buffer, BufRead);
Result := DataString;
finally
Free;
end;
finally
InternetCloseHandle(hFile);
end;
finally
InternetCloseHandle(hinet);
end;
end;





function Q_PosStr(const FindString, SourceString: string; StartPos: Integer): Integer;
asm
PUSH ESI
PUSH EDI
PUSH EBX
PUSH EDX
TEST EAX,EAX
JE @@qt
TEST EDX,EDX
JE @@qt0
MOV ESI,EAX
MOV EDI,EDX
MOV EAX,[EAX-4]
MOV EDX,[EDX-4]
DEC EAX
SUB EDX,EAX
DEC ECX
SUB EDX,ECX
JNG @@qt0
XCHG EAX,EDX
ADD EDI,ECX
MOV ECX,EAX
JMP @@nx
@@fr: INC EDI
DEC ECX
JE @@qt0
@@nx: MOV EBX,EDX
MOV AL,BYTE PTR [ESI]
@@lp1: CMP AL,BYTE PTR [EDI]
JE @@uu
INC EDI
DEC ECX
JE @@qt0
CMP AL,BYTE PTR [EDI]
JE @@uu
INC EDI
DEC ECX
JE @@qt0
CMP AL,BYTE PTR [EDI]
JE @@uu
INC EDI
DEC ECX
JE @@qt0
CMP AL,BYTE PTR [EDI]
JE @@uu
INC EDI
DEC ECX
JNE @@lp1
@@qt0: XOR EAX,EAX
@@qt: POP ECX
POP EBX
POP EDI
POP ESI
RET
@@uu: TEST EDX,EDX
JE @@fd
@@lp2: MOV AL,BYTE PTR [ESI+EBX]
CMP AL,BYTE PTR [EDI+EBX]
JNE @@fr
DEC EBX
JE @@fd
MOV AL,BYTE PTR [ESI+EBX]
CMP AL,BYTE PTR [EDI+EBX]
JNE @@fr
DEC EBX
JE @@fd
MOV AL,BYTE PTR [ESI+EBX]
CMP AL,BYTE PTR [EDI+EBX]
JNE @@fr
DEC EBX
JE @@fd
MOV AL,BYTE PTR [ESI+EBX]
CMP AL,BYTE PTR [EDI+EBX]
JNE @@fr
DEC EBX
JNE @@lp2
@@fd: LEA EAX,[EDI+1]
SUB EAX,[ESP]
POP ECX
POP EBX
POP EDI
POP ESI
end;



//读取连接的函数

xiufengy 2006-07-28
  • 打赏
  • 举报
回复
您 给我了一个很好的思路,看看想想试试先,谢谢啊
iasp 2006-07-28
  • 打赏
  • 举报
回复
追求效率的话用sock直接写比较高
给段代码

procedure AfterConnect;//等拨号完成后,访问指定页面,借此将ip地址记录下来,这样我们就可以在其他地方知道拨号后新的ip地址了
var
hSocket: TSocket;
SAddr,sendtext:string;
Sendbuf:array[0..1024] of char;
HostEnt:PHostEnt;

begin
try
if not CheckVisit then
begin
LogMessage('----------'+GetIp+'----------');
IsConnected:=True;
exit;
end;

HostEnt:=gethostbyname(pchar(VisitHost));
if HostEnt<>nil then
begin
with HostEnt^ do
SAddr:=Format('%d.%d.%d.%d',[byte(h_addr^[0]),byte(h_addr^[1]),byte(h_addr^[2]),byte(h_addr^[3])]);
end;

InitSocket(hSocket,SAddr,80,10000);
sendtext:='POST '+VisitUrl+' HTTP/1.1'+#13#10
+'Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */*'+#13#10
+'Referer: '+#13#10
+'Accept-Language: zh-cn'+#13#10
+'Content-Type: application/x-www-form-urlencoded'+#13#10
+'Accept-Encoding: gzip, deflate'+#13#10
+'User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; .NET CLR 1.0.3705)'+#13#10
+'Host: '+VisitHost+#13#10
+'Content-Length: '+inttostr(length(VisitParam))+#13#10
+'Connection: Keep-Alive'+#13#10
+'Cache-Control: no-cache'+#13#10
+'Cookie: '+#13#10
+#13#10
+VisitParam+#13#10;
FillChar(sendbuf,sizeof(sendbuf),0);
StrLCopy(sendbuf,PChar(sendtext),length(sendtext));
Send(hSocket,sendbuf,length(sendtext),0);

UninitSocket(hSocket);

LogMessage('----------'+GetIp+'----------');
IsConnected:=True;
except
end;
end;
iasp 2006-07-28
  • 打赏
  • 举报
回复
网页是别人的?
cpu利用率越高越好啊...慢的是内存占用太多...你可以get的时候丢弃不需要的部分取需要的数据就可以了
dabaicai 2006-07-26
  • 打赏
  • 举报
回复
TNMHTTP没用过,不知道效率怎么样
就算用idhttp, 你每次get页面还是会慢的,而且用1000的话表示1秒,需要那么频繁吗? 那么短的时候也是没法取回页面的啊
还有CPU利用率瞬间增长很多也就是get页面的时候,应该很快就好了啊
xiufengy 2006-07-26
  • 打赏
  • 举报
回复
jiangsheng(蒋晟.Net[MVP]) 1URLDownloadToFile 这样只会更费资源
xiufengy 2006-07-26
  • 打赏
  • 举报
回复
谢谢小虫的意见,按第2条来改稍有改善,不过还是较多
xiufengy 2006-07-26
  • 打赏
  • 举报
回复
谁能给点更多的提示
蒋晟 2006-07-26
  • 打赏
  • 举报
回复
1URLDownloadToFile
2 没有办法每次下载只下载网页中和上次内容不一样的部分,HTTP协议里没这玩意
postren 2006-07-25
  • 打赏
  • 举报
回复
TNMHTTP没用过,TIdHttp用过 很好用

另外最好不用局部变量,否则每次都在局部变量的创建销毁中耗费资源
微信小程序系统教程[初级阶段],微信小程序0基础学起,讲解微信小程序开发的基础知识。 微信小程序系统教程共有“微信小程序系统教程[初级阶段]”、“微信小程序系统教程[中级阶段]——核心技术”、“微信小程序系统教程[阶段]客服消息+微信支付+九宝电商系统”。 “微信小程序系统教程[阶段]全套课程”包含: 1.微信小程序系统教程[阶段]_客服消息 2.微信小程序系统教程[阶段]_微信支付 3.微信小程序系统教程[阶段]_九宝电商系统 学习“微信小程序系统教程[阶段]”要求有微信小程序的基础。建议先学习“微信小程序系统教程[初级阶段]”、“微信小程序系统教程[中级阶段]”,后在报名“微信小程序系统教程[阶段]”。 阶段讲解的客服消息,是针对小程序的。后台程序用接近底层的技术,没有使用三方技术。这样降低同学们学习成本。 微信支付,这部分课程很有难度,要求同学们认真听讲,有不会的技术问题可以请教老师。购买课程后请联系老师,提供单号,给你源程序。 九宝电商系统是一套十分适和学习、项目的课程。既可以系统的学习微信小程序相关知识,还可以修改后上线。 “微信小程序系统教程[中级阶段]——核心技术”重点讲解微信小程序事件、组件、API 微信小程序系统教程[初级阶段],微信小程序0基础学起,讲解微信小程序开发的基础知识。 购买课程的同学,可赠送就九宝老师编写的《微信小程序开发宝典》。 购课请咨询qq2326321088

1,593

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 网络通信/分布式开发
社区管理员
  • 网络通信/分布式开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧