| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 5390 人关注过本帖, 1 人收藏
标题:VFP编程技巧擂台赛[三]
只看楼主 加入收藏
月沐庭轩
Rank: 9Rank: 9Rank: 9
来 自:京城
等 级:贵宾
威 望:17
帖 子:393
专家分:1106
注 册:2011-7-24
收藏
得分:0 
仿照版主的表格,再次将代码修改,现在出来的效果跟版主的一模一样了。运行时间:第一次:1236毫秒,有缓存后,17毫秒,看来读写表文件要比读写低级文件要快得多。
程序代码:
*!*    程序分为一个主程序模块,三个次程序模块
*!*    主程序模块*****************************************************
starttime=SECONDS()*1000
CREATE CURSOR tqhdm (层次 N(1),代码 c(12),分类 c(3),名称 c(40),网址 c(150))
cc=2
websites="http://www.stats./tjbz/cxfldm/2011/41/4101.html"
daima=SUBSTR(websites,RAT("/",websites)+1,4)
INSERT INTO tqhdm VALUE(cc,daima,"4101","郑州市",websites)
xiazai(websites)
endtime=SECONDS()*1000
TIMES=endtime-starttime
MESSAGEBOX("你所花费的时间为"+ALLTRIM(STR(TIMES,20))+"毫秒",64,"测试")
SELECT tqhdm
BROWSE
*!*    主程序模块结束**************************************************
*!*    下载HTML代码程序块*********************************************
FUNCTION xiazai(website)
LOCAL website,tempstr,daima, mingcheng
test=CREATEOBJECT("MICROSOFT.XMLHTTP")
test.OPEN([GET], website,.F.)
test.SEND
tempstr=test.responsetext
*****市辖区代码,按照版主要求可以没有的,我这里加得很勉强。
shiqu=STREXTRACT(tempstr,[countytr'><td>])
IF NOT EMPTY(shiqu)
    daima=STREXTRACT(shiqu,"","<")
    shiqu=STREXTRACT(shiqu,"<td>")
    mingcheng=STREXTRACT(shiqu,"","<")
    INSERT INTO tqhdm VALUE(3,daima,"",mingcheng,"")
ENDIF
*****************市辖区代码结束***********
tempstr=STREXTRACT(tempstr,[href='])
IF EMPTY(tempstr)
    func2(test.responsetext)
ELSE
    func1(tempstr,website)
ENDIF
ENDFUNC
*!*    下载HTML代码程序块结束**************************************
*!*    分析有链接的网页代码程序块即1、县区市2、街道办事处和乡镇*******************************
FUNCTION func1(tempstr,website)
LOCAL  tempstr,website,websites,daima, mingcheng
cc=cc+1
DO WHILE .T.
    websites=STREXTRACT(tempstr,"","'>")
    websites=LEFT(website,RATC('/',website))+websites
    tempstr=STREXTRACT(tempstr,"'>")
    daima=STREXTRACT(tempstr,"","<")
    tempstr=STREXTRACT(tempstr,"'>")
    mingcheng=STREXTRACT(tempstr,"","<")
    tempstr=STREXTRACT(tempstr,[href='])
    INSERT INTO tqhdm VALUE(cc,daima,"",mingcheng,websites)
    IF EMPTY(tempstr)
        EXIT
    ENDIF
ENDDO
SELECT 网址 FROM tqhdm WHERE 层次=cc INTO CURSOR tmp
SCAN for NOT EMPTY(网址)
        xiazai(网址)
ENDSCAN
ENDFUNC
*!*    分析有链接的网页代码程序块结束*******************************
*!*    分析无链接的网页代码程序块即居委会和村*******************************
FUNCTION func2(tempstr)
LOCAL tempstr,daima, mingcheng,daima4,cc5
cc5=cc+1
DO WHILE .T.
    tempstr=STREXTRACT(tempstr,[villagetr'><td>])
    IF EMPTY(tempstr)
        EXIT
    ENDIF
    daima=STREXTRACT(tempstr,"","<")
    tempstr=STREXTRACT(tempstr,"<td>")
    daima4=STREXTRACT(tempstr,"","<")
    tempstr=STREXTRACT(tempstr,"<td>")
    mingcheng=STREXTRACT(tempstr,"","<")
    INSERT INTO tqhdm VALUE(cc5,daima,daima4,mingcheng,"")
ENDDO
ENDFUNC
*!*    分析无链接的网页代码程序块结束*******************************


[ 本帖最后由 月沐庭轩 于 2012-10-28 16:06 编辑 ]

坚持学习vfp,QQ:306805680
2012-10-28 10:43
hgfeng1984
Rank: 7Rank: 7Rank: 7
等 级:黑侠
威 望:5
帖 子:139
专家分:513
注 册:2006-3-26
收藏
得分:5 
结贴散分~~我运行了,14毫秒.

递归什么的最羡慕了.

[ 本帖最后由 hgfeng1984 于 2012-10-28 11:25 编辑 ]
2012-10-28 11:24
sdta
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:江苏省连云港市
等 级:版主
威 望:335
帖 子:9841
专家分:27213
注 册:2012-2-5
收藏
得分:0 
回复 21楼 月沐庭轩
怎么才216条记录

坚守VFP最后的阵地
2012-10-28 21:58
月沐庭轩
Rank: 9Rank: 9Rank: 9
来 自:京城
等 级:贵宾
威 望:17
帖 子:393
专家分:1106
注 册:2011-7-24
收藏
得分:0 
哈哈哈,那代码错误运行了,版主的代码非常严谨,向版主学习,又修改了一下,现在代码如下:
程序代码:
starttime=SECONDS()*1000
CREATE CURSOR tqhdm (层次 N(1),代码 c(12),分类 c(3),名称 c(40),网址 c(150))
test=CREATEOBJECT("MICROSOFT.XMLHTTP")
cc=2
websites="http://www.stats./tjbz/cxfldm/2011/41/4101.html"
daima=SUBSTR(websites,RAT("/",websites)+1,4)
INSERT INTO tqhdm VALUE(cc,daima,"4101","郑州市",websites)
FOR i=1 TO 3
SELECT 网址 FROM tqhdm WHERE 层次=cc INTO CURSOR tmp
cc=cc+1
SCAN FOR NOT EMPTY(网址)
            xiazai(网址)
ENDSCAN 
ENDFOR    
endtime=SECONDS()*1000
TIMES=endtime-starttime
MESSAGEBOX("你所花费的时间为"+ALLTRIM(STR(TIMES,20))+"毫秒",64,"测试")
SELECT tqhdm
BROWSE
FUNCTION fuc1(tempstr,website)
LOCAL daima, mingcheng,websites,daima4,tmp
STORE '' TO daima,daima4,mingcheng,websites
DO WHILE .T.
    tempstr=STREXTRACT(tempstr,['><td>])
    IF EMPTY(tempstr)
    EXIT
    endif
    IF LEFT(tempstr,1)=="<"
        tempstr=STREXTRACT(tempstr,[href='])
        websites=STREXTRACT(tempstr,"","'>")
        websites=LEFT(website,RATC('/',website))+websites
        tempstr=STREXTRACT(tempstr,"'>")
        daima=STREXTRACT(tempstr,"","<")
        tempstr=STREXTRACT(tempstr,"'>")
        mingcheng=STRCONV(STREXTRACT(tempstr,"","<"),1)
    ELSE
        daima=STREXTRACT(tempstr,"","<")
        IF cc=5
            tempstr=STREXTRACT(tempstr,"<td>")
            daima4=STREXTRACT(tempstr,"","<")
            tempstr=STREXTRACT(tempstr,"<td>")
            mingcheng=STRCONV(STREXTRACT(tempstr,"","<"),1)
        ELSE
            tempstr=STREXTRACT(tempstr,"<td>")
            mingcheng=STRCONV(STREXTRACT(tempstr,"","<"),1)
        ENDIF
    ENDIF
    INSERT INTO tqhdm VALUE(cc,daima,daima4,mingcheng,websites)
ENDDO
ENDFUNC
FUNCTION xiazai(website)
LOCAL  tempstr
test.OPEN([GET], website,.F.)
test.SEND
tempstr=""
tempstr=test.responsetext
fuc1(tempstr,website)
ENDFUNC

看来我是太马虎了。现在结果是3136条了。第一次运行时间:10518毫秒。第二次运行时间:192毫秒

[ 本帖最后由 月沐庭轩 于 2012-10-29 20:47 编辑 ]

坚持学习vfp,QQ:306805680
2012-10-29 08:40
bccn201203
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:3
帖 子:680
专家分:1140
注 册:2012-3-14
收藏
得分:20 
程序代码:
CLEAR
T1=SECONDS()
=STRTOFILE([],[QHDM.TXT])
WZ=[4101.html]
LCSTR=CWY(LEFT(WZ,2)+[/]+WZ,'countytr')
NROW=ALINES(AA,LCSTR,[</td></tr>])
CSTR=[]
FOR I=1 TO NROW
    =ALINES(BB,AA(I),[</td><td>])
    B1=IIF([.]$AA(I),GETWORDNUM(BB(1),2,[>]),BB(1))
    WZ1=IIF([.]$AA(I),LEFT(WZ,2)+[/]+GETWORDNUM(BB(2),1,[>]),[])
    B2=IIF([.]$AA(I),GETWORDNUM(BB(2),2,[>]),BB(2))
    CSTR=CSTR+B1+[ ]+B2+CHR(13)+CHR(10)
    IF EMPTY(WZ1)
       LOOP
    ENDIF
    LCSTR1=CWY(WZ1,'towntr')
    NROW1=ALINES(AA1,LCSTR1,[</td></tr>])
    FOR I1=1 TO NROW1
        =ALINES(BB1,AA1(I1),[</td><td>])
        B11=IIF([.]$AA1(I),GETWORDNUM(BB1(1),2,[>]),BB1(1))
        WZ11=IIF([.]$AA1(I),LEFT(WZ1,6)+GETWORDNUM(BB1(2),1,[>]),[])
        B22=IIF([.]$AA1(I),GETWORDNUM(BB1(2),2,[>]),BB1(2))
        CSTR=CSTR+B11+[ ]+B22+CHR(13)+CHR(10)
        LCSTR2=CWY(WZ11,'villagetr')
        NROW2=ALINES(AA2,LCSTR2,[</td></tr>])
        FOR I2=1 TO NROW2
            =ALINES(BB2,AA2(I2),[</td><td>])
            CSTR=CSTR+BB2(1)+[ ]+BB2(2)+[ ]+BB2(3)+CHR(13)+CHR(10)
        ENDFOR
    ENDFOR
ENDFOR
MESSAGEBOX([运行时间:]+TRANSFORM(SECONDS()-T1)+[])
=STRTOFILE(CSTR,[QHDM.TXT],.T.)
MODIFY FILE QHDM.TXT
CREATE CURSOR CXDM (代码 C(12),分类 C(3),名称 C(40))
FOR I=1 TO ALINES(AA,FILETOSTR([QHDM.TXT]))
    N=ALINES(BB,AA(I),[ ])
    INSERT INTO CXDM VALUES (BB(1),ICASE(N=2,[],N=3,BB(2)),ICASE(N=2,BB(2),N=3,BB(3)))
ENDFOR
BROWSE
*---------------------
FUNCTION CWY
PARAMETERS WY,BZ
LCURL = [http://www.stats.]+WY
OHTML = CREATEOBJECT("MICROSOFT.XMLHTTP")
OHTML.OPEN([GET], LCURL, .F.)
OHTML.SEND
LCSTRA=STRTRAN(STRTRAN(STRTRAN(STRTRAN(STREXTRACT(STRCONV(OHTML.RESPONSEBODY,2),[名称</td></tr>],[</table></TD></TR>]),[<tr class='&BZ'><td>],[]),[</a>],[]),[<a href=],[]),['],[])
RETURN LCSTRA
2012-10-29 09:34
wjp456789
Rank: 5Rank: 5
来 自:四川成都
等 级:职业侠客
威 望:1
帖 子:345
专家分:330
注 册:2012-6-25
收藏
得分:5 
以下是引用月沐庭轩在2012-10-29 08:40:17的发言:

哈哈哈,那代码错误运行了,版主的代码非常严谨,向版主学习,又修改了一下,现在代码如下:
 
starttime=SECONDS()*1000
CREATE CURSOR tqhdm (层次 N(1),代码 c(12),分类 c(3),名称 c(40),网址 c(150))
test=CREATEOBJECT("MICROSOFT.XMLHTTP")
cc=2
websites="http://www.stats.
daima=SUBSTR(websites,RAT("/",websites)+1,4)
INSERT INTO tqhdm VALUE(cc,daima,"4101","郑州市",websites)
FOR i=1 TO 3
SELECT 网址 FROM tqhdm WHERE 层次=cc INTO CURSOR tmp
cc=cc+1
SCAN FOR NOT EMPTY(网址)
            xiazai(网址)
ENDSCAN  
ENDFOR     
endtime=SECONDS()*1000
TIMES=endtime-starttime
MESSAGEBOX("你所花费的时间为"+ALLTRIM(STR(TIMES,20))+"毫秒",64,"测试")
SELECT tqhdm
BROWSE
FUNCTION fuc1(tempstr,website)
LOCAL daima, mingcheng,websites,daima4,tmp
STORE '' TO daima,daima4,mingcheng,websites
DO WHILE .T.
    tempstr=STREXTRACT(tempstr,['>])
    IF EMPTY(tempstr)
    EXIT
    endif
    IF LEFT(tempstr,1)=="<"
        tempstr=STREXTRACT(tempstr,[href='])
        websites=STREXTRACT(tempstr,"","'>")
        websites=LEFT(website,RATC('/',website))+websites
        tempstr=STREXTRACT(tempstr,"'>")
        daima=STREXTRACT(tempstr,"","<")
        tempstr=STREXTRACT(tempstr,"'>")
        mingcheng=STREXTRACT(tempstr,"","<")
    ELSE
        daima=STREXTRACT(tempstr,"","<")
        IF cc=5
            tempstr=STREXTRACT(tempstr,"")
            daima4=STREXTRACT(tempstr,"","<")
            tempstr=STREXTRACT(tempstr,"")
            mingcheng=STREXTRACT(tempstr,"","<")
        ELSE
            tempstr=STREXTRACT(tempstr,"")
            mingcheng=STREXTRACT(tempstr,"","<")
        ENDIF
    ENDIF
    INSERT INTO tqhdm VALUE(cc,daima,daima4,mingcheng,websites)
ENDDO
ENDFUNC
FUNCTION xiazai(website)
LOCAL  tempstr
test.OPEN([GET], website,.F.)
test.SEND
tempstr=""
tempstr=test.responsetext
fuc1(tempstr,website)
ENDFUNC
 
看来我是太马虎了。现在结果是3136条了。第一次运行时间:10518毫秒。第二次运行时间:192毫秒
为什么第一次运行要花那么长的时间?

我是来向高手学习的!
2012-10-29 12:34
wjp456789
Rank: 5Rank: 5
来 自:四川成都
等 级:职业侠客
威 望:1
帖 子:345
专家分:330
注 册:2012-6-25
收藏
得分:0 
而且名称全是乱码

我是来向高手学习的!
2012-10-29 12:35
月沐庭轩
Rank: 9Rank: 9Rank: 9
来 自:京城
等 级:贵宾
威 望:17
帖 子:393
专家分:1106
注 册:2011-7-24
收藏
得分:0 
回复 26楼 wjp456789
第一次是要在网上采集数据,网速慢,所以慢了。第二次电脑上有了缓存,省去了上网采集数据的过程,所以就明显快多了。你说的乱码问题,在我这里没有呀,是怎么回事呢?
是不是得用 Strconv()函数?

坚持学习vfp,QQ:306805680
2012-10-29 15:11
wjp456789
Rank: 5Rank: 5
来 自:四川成都
等 级:职业侠客
威 望:1
帖 子:345
专家分:330
注 册:2012-6-25
收藏
得分:0 
25楼的要花1.4秒左右
24楼的要花219毫秒

我是来向高手学习的!
2012-10-29 17:20
wjp456789
Rank: 5Rank: 5
来 自:四川成都
等 级:职业侠客
威 望:1
帖 子:345
专家分:330
注 册:2012-6-25
收藏
得分:0 
24楼的程序在编辑时,有几个中文状态下的“)”和“,”需要改为英文状态下的符号。

我是来向高手学习的!
2012-10-29 17:22
快速回复:VFP编程技巧擂台赛[三]
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.033067 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved