| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 5390 人关注过本帖, 1 人收藏
标题:VFP编程技巧擂台赛[三]
只看楼主 加入收藏
sdta
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:江苏省连云港市
等 级:版主
威 望:335
帖 子:9841
专家分:27213
注 册:2012-2-5
收藏
得分:0 
程序代码:
CLEAR
T1=SECONDS()
CREATE CURSOR TQHDM (层次 N(1),代码 C(12),分类 C(3),名称 C(40),网址 C(100))
LOCAL DM,MC
DM=[41.html] && 如:[41.html][4101.html][410102.html],分别代表市、县、乡
MC=[河南省]    && 对应于上面的DM,如郑州市
CWZ=[http://www.stats.]
NUM=LEN(GETWORDNUM(DM,1,[.]))
CDM=ICASE(NUM=2,DM,NUM=4,LEFT(DM,2)+[/]+DM,NUM=6,LEFT(DM,2)+[/]+SUBSTR(DM,3,2)+[/]+DM)
CC=ICASE(NUM=2,1,NUM=4,2,NUM=6,3) && 123 分别代表市、县、乡
EX=2 && EX>=CC AND EX<=5 &&控制提取数据范围,EX=2,说明只提取到县级数据,余以此类推。
NLEN=LEN(CWZ)
URL=CWZ+CDM
INSERT INTO TQHDM VALUES (CC,PADR(GETWORDNUM(DM,1,[.]),12,[0]),[],MC,URL)
DO WHILE .T.
   SELECT * FROM TQHDM INTO CURSOR TEMP WHERE 层次=CC
   IF EOF()
      EXIT
   ENDIF
   SCAN FOR NOT EMPTY(网址)
      CSTR=CWY(SUBSTR(ALLTRIM(网址),NLEN+1),ICASE(CC=1,'citytr',CC=2,'countytr',CC=3,'towntr',CC=4,'villagetr'))
      NROW=ALINES(AA,CSTR,[</td></tr>])
      FOR I=1 TO NROW
          =ALINES(BB,AA(I),[</td><td>])
          DM=RIGHT(BB(1),12)
          FL=IIF(CC+1=5,BB(2),[])
          MC=IIF(CC+1=5,BB(3),SUBSTR(BB(2),AT([>],BB(2))+1))
          URL=IIF([.html]$AA(I),SUBSTR(ALLTRIM(网址),1,RAT([/],网址))+SUBSTR(BB(2),1,AT([>],BB(2))-1),[])
          INSERT INTO TQHDM VALUES (CC+1,DM,FL,MC,URL)
      ENDFOR
   ENDSCAN
   IF CC=EX
      EXIT
   ENDIF
   CC=CC+1
ENDDO
MESSAGEBOX(SECONDS()-T1)
SELECT TQHDM
BROWSE
FUNCTION CWY
PARAMETERS WY,BZ
LCURL = [http://www.stats.]+WY
OHTML = CREATEOBJECT("MICROSOFT.XMLHTTP")
OHTML.OPEN([GET], LCURL, .F.)
OHTML.SEND
CSTRA=STRTRAN(STRTRAN(STRTRAN(STRTRAN(STREXTRACT(STRCONV(OHTML.RESPONSEBODY,2),[名称</td></tr>],[</table></TD></TR>]),;
      [<tr class='&BZ'><td>],[]),[</a>],[]),[<a href=],[]),['],[])
RETURN CSTRA

在17楼代码的基础上稍做修改,可以分别提取市、县、乡级数据[根据输入内容不同],只要修改第四行DM= 及第五行MC= 后面的内容,就可以提取不同的数据。


[ 本帖最后由 sdta 于 2012-10-29 20:22 编辑 ]

坚守VFP最后的阵地
2012-10-29 20:09
月沐庭轩
Rank: 9Rank: 9Rank: 9
来 自:京城
等 级:贵宾
威 望:17
帖 子:393
专家分:1106
注 册:2011-7-24
收藏
得分:0 
回复 31楼 sdta
这样,就可以提取任意省的数据了?我看你的代码里,可以改变的有三个变量,除了你说的两个,还有一个EX,这样,就可以提取任意省的任意层级的行政区划数据了,非常妙,版主能够举一反三,确实太好了。
在前面加上 PARAMETERS DM,MC,EX就可以封装成一个非常有用的函数了。
DM的值其实就是省的标准代码加了个.htm,所以只要知道各省的标准代码,MC这个参数(即省名,或市县名,就可以省略了),EX,是1,提取到市级,是2,提取到县级,是3,提取到乡级,是4,提取到村级,不用5了。即EX的取值范围是1——4.

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

坚持学习vfp,QQ:306805680
2012-10-29 21:02
sdta
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:江苏省连云港市
等 级:版主
威 望:335
帖 子:9841
专家分:27213
注 册:2012-2-5
收藏
得分:0 
回复 32楼 月沐庭轩
在学习过程中不断提高

坚守VFP最后的阵地
2012-10-29 21:12
sdta
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:江苏省连云港市
等 级:版主
威 望:335
帖 子:9841
专家分:27213
注 册:2012-2-5
收藏
得分:0 
回复 32楼 月沐庭轩
提取河南省的全部数据大约需要多少时间

坚守VFP最后的阵地
2012-10-29 21:13
月沐庭轩
Rank: 9Rank: 9Rank: 9
来 自:京城
等 级:贵宾
威 望:17
帖 子:393
专家分:1106
注 册:2011-7-24
收藏
得分:0 
以下是引用wjp456789在2012-10-29 17:22:16的发言:

24楼的程序在编辑时,有几个中文状态下的“)”和“,”需要改为英文状态下的符号。

已经改过来了。谢谢提醒!

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

坚持学习vfp,QQ:306805680
2012-10-29 21:18
月沐庭轩
Rank: 9Rank: 9Rank: 9
来 自:京城
等 级:贵宾
威 望:17
帖 子:393
专家分:1106
注 册:2011-7-24
收藏
得分:0 
以下是引用sdta在2012-10-29 21:13:28的发言:

提取河南省的全部数据大约需要多少时间

我正在试你的代码。

坚持学习vfp,QQ:306805680
2012-10-29 21:18
月沐庭轩
Rank: 9Rank: 9Rank: 9
来 自:京城
等 级:贵宾
威 望:17
帖 子:393
专家分:1106
注 册:2011-7-24
收藏
得分:0 
以下是引用sdta在2012-10-29 21:13:28的发言:

提取河南省的全部数据大约需要多少时间

提取到县级10.555秒,提取到村级212.748秒(其中县级以上有缓存)。到村级数据有54296条。第二次运行,提取到县级0.028秒,提取到村级8.838秒。

坚持学习vfp,QQ:306805680
2012-10-29 21:27
sdta
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:江苏省连云港市
等 级:版主
威 望:335
帖 子:9841
专家分:27213
注 册:2012-2-5
收藏
得分:0 
请教个问题,我的电脑运行速度为什么会慢,提取河南省的全部数据大约需要64-65秒,每次时间相差比较大,什么问题。


坚守VFP最后的阵地
2012-10-29 21:32
月沐庭轩
Rank: 9Rank: 9Rank: 9
来 自:京城
等 级:贵宾
威 望:17
帖 子:393
专家分:1106
注 册:2011-7-24
收藏
得分:0 
向版主学习,将我的代码也加以改造,
程序代码:
CLEAR  
starttime=SECONDS()*1000
CREATE CURSOR tqhdm (层次 N(1),代码 c(12),分类 c(3),名称 c(40),网址 c(150))
test=CREATEOBJECT("MICROSOFT.XMLHTTP")
DM=[41.html] && 如:[41.html][4101.html][410102.html],分别代表市、县、乡
MC=[河南省]    && 对应于上面的DM,62是甘肃省,41是河南省
CWZ=[http://www.stats.]
NUM=LEN(GETWORDNUM(DM,1,[.]))
CDM=ICASE(NUM=2,DM,NUM=4,LEFT(DM,2)+[/]+DM,NUM=6,LEFT(DM,2)+[/]+SUBSTR(DM,3,2)+[/]+DM)
CC=ICASE(NUM=2,1,NUM=4,2,NUM=6,3) && 123 分别代表市、县、乡
LOCAL cc1
cc1=cc&&cc1是从省还是从市县开始提取的层级。
EX=2 && EX,是1,提取到市级,是2,提取到县级,是3,提取到乡级,是4,提取到村级。即EX的取值范围是1——4
websites=CWZ+CDM
daima=SUBSTR(websites,RAT("/",websites)+1,4)
INSERT INTO tqhdm VALUE(cc,daima,PADR(GETWORDNUM(DM,1,[.]),12,[0]),MC,websites)
FOR i=cc1 TO EX
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
PARAMETERS 

第一次运行,到县级2.168秒,到村级239.031秒,第二次到县级1.405秒,到村级7.353秒。我不懂呀,我想也许是网络速度不稳定吧?你的代码我这次又试了,竟然变慢多了。你的代码现在在有缓存下运行,即第二次运行到县级1.420秒,到村级8.771秒!

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

坚持学习vfp,QQ:306805680
2012-10-29 21:41
月沐庭轩
Rank: 9Rank: 9Rank: 9
来 自:京城
等 级:贵宾
威 望:17
帖 子:393
专家分:1106
注 册:2011-7-24
收藏
得分:30 
程序代码:
*!*    需要两个参数,即:
*!*    1、biaozhundaima,省或市、县、乡代码,
*!*    2、cencicenci,是1,提取到市级,是2,提取到县级,是3,提取到乡级,是4,提取到村级。即EX的取值范围是1——4
*!*    如果省略第二个参数,默认提取到村级
*!*    甘肃省的标准代码是62,河南省的标准代码是41,郑州的标准代码是4101等!!
*!*    将此代码保存为文件xingzhengquhua,在利用此函数时,比方说甘肃省,
*!*    可以用xingzhengquhua(62,4)来显示甘肃省的行政区划到村级,
*!*    用xingzhengquhua(41,3)来显示河南省的行政区划到乡级,
*!*    用xingzhengquhua(6211254)来显示甘肃省漳县的行政区划到村级
*!*    程序分为一个主程序模块,三个次程序模块
*!*    主程序模块*****************************************************
FUNCTION xingzhengquhua(biaozhundaima,cenci)
starttime=SECONDS()*1000
test=CREATEOBJECT("MICROSOFT.XMLHTTP")
CREATE CURSOR tqhdm (层次 N(1),代码 c(12),分类 c(3),名称 c(40),网址 c(150))
cwz=[http://www.stats.]
IF VARTYPE(biaozhundaima)=="C"
    dm=biaozhundaima
ELSE
    dm=ALLTRIM(STR(biaozhundaima))
ENDIF
num=LEN(dm)
cdm=ICASE(num=2,dm,num=4,LEFT(dm,2)+[/]+dm,num=6,LEFT(dm,2)+[/]+SUBSTR(dm,3,2)+[/]+dm,;
    num=9,LEFT(dm,2)+[/]+SUBSTR(dm,3,2)+[/]+SUBSTR(dm,5,2)+[/]+dm)
cc=ICASE(num=2,1,num=4,2,num=6,3,num=9,4)+PROGRAM(-1)-1
IF PARAMETERS()=2
    ex=cenci
ELSE
    ex=4
ENDIF
IF ISNULL(cdm)
    MESSAGEBOX("行政区划代码位数不对")
ENDIF
websites=cwz+cdm+".html"
xiazai(websites)
endtime=SECONDS()*1000
TIMES=endtime-starttime
MESSAGEBOX("你所花费的时间为"+ALLTRIM(STR(TIMES,20))+"毫秒",64,"测试")
SELECT tqhdm
BROWSE
ENDFUNC
*!*    主程序模块结束**************************************************
*!*    下载HTML代码程序块*********************************************
FUNCTION xiazai(website)
LOCAL tempstr
test.OPEN("get", website,.F.)
test.SEND
tempstr=test.responsetext
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,websites,daima, mingcheng,cc2
cc2=(PROGRAM(-1)-1)/2+cc
IF ex=cc2-2
    RETURN
ENDIF
DO WHILE .T.
    websites=STREXTRACT(tempstr,"","'>")
    websites=LEFT(website,RATC('/',website))+websites
    tempstr=STREXTRACT(tempstr,"'>")
    daima=STREXTRACT(tempstr,"","<")
    tempstr=STREXTRACT(tempstr,"'>")
    mingcheng=STRCONV(STREXTRACT(tempstr,"","<"),1)
    tempstr=STREXTRACT(tempstr,[href='])
    INSERT INTO tqhdm VALUE(cc2,daima,"",mingcheng,websites)
    xiazai(websites)
    IF EMPTY(tempstr)
        EXIT
    ENDIF
ENDDO
ENDFUNC
*!*    分析有链接的网页代码程序块结束*******************************
*!*    分析无链接的网页代码程序块即居委会和村*******************************
FUNCTION func2(tempstr)
LOCAL tempstr,daima, mingcheng,daima4,cc2
cc2=(PROGRAM(-1)-1)/2+cc
IF ex=cc2-2
    RETURN
ENDIF
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=STRCONV(STREXTRACT(tempstr,"","<"),1)
    INSERT INTO tqhdm VALUE(cc2,daima,daima4,mingcheng,"")
ENDDO
ENDFUNC
*!*    分析无链接的网页代码程序块结束*******************************

提取河南省数据到村级,第二次3158毫秒!!

[ 本帖最后由 月沐庭轩 于 2012-10-30 11:10 编辑 ]

坚持学习vfp,QQ:306805680
2012-10-29 22:44
快速回复:VFP编程技巧擂台赛[三]
数据加载中...
 
   



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

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