小米第三方recovery:股票数据格式

来源:百度文库 编辑:偶看新闻 时间:2024/04/29 21:51:54

goghugoghu

大智慧5.60格式

by:goghu

1代码表

1.1证券代码列表

证券代码列表对应文件为 dzh安装目录 \ internet \ tcpipdata \ index.dat 文件,该文件在大智慧每次启动时被删除,并重新从服务器上下载。

文件结构描述如下:

(1)文件大小 证券数量 × 9字节(每个证券占用 9 字节)

(2)每个证券内容描述

(2.1)12字节:排序序号,从0开始编号计数 == 2字节的整数

(2.2)38字节:证券代码 == 6字节的ASCII字符串

(2.3)99字节:统一为0x00,无特殊意义,可能是作为分隔符

1.2证券名称列表

证券名称列表对应文件为 dzh安装目录 \ internet \ tcpipdata \ init.dat 文件,该文件在大智慧每次启动时被删除,并重新从服务器上下载。

文件结构描述如下:

(1)文件大小 头部字段28字节 证券数量 × 32字节(每个证券占用 32 字节)

(2)头部字段

(2.1) 18字节:大智慧最后一次联网的日期,8字节ASCII字符串

(2.2) 910字节:未知

(2.3)1112字节:证券数量

(2.4)1328字节:未知

(3)每个证券内容描述

(3.1)18字节:证券名称

(3.2)914字节:证券代码

(3.3)1516字节:证券代码类型

(3.3.1)0x1F 0x00一般证券(场内交易的股票和基金等)

(3.3.2)0x1E 0x00 证券指数(上证指数、深圳)

(3.3.3) 0x20 0x00 证券指数(沪深300指数等)

(3.4)1732字节:未知

2自选股

自选股文件保存位置:dzh安装目录 \ CFG \ netwrkic.bk2

文件结构描述如下:

(1)文件最开始的4字节:自选股板块的数目

(2)后面是每个板块的内容按顺序描述如下(长度不定):

(2.1)4字节:板块编号,4字节整数

(2.2)1字节:板块名称的长度(单位为字节,一个汉字占用两个字节),1字节整数

(2.3)20字节:板块名称,20字节字符串。板块名称最长20字节,默认名称为“自选”加序号,所以修改名称后,在二进制文件中可能出现Love11的情况(04 4C 6F 76 65 31 31),这种情况不用理会后面的两个31,直接根据名称长度04取四个字节即可。

(2.4)4字节:该板块中证券的数目,4字节整数

(2.5)14字节:板块中证券的内容

(2.5.1)2字节:证券类型 0x00 0x06 上海股票;0x01 0x06 深圳股票

(2.5.2)6字节:证券代码,6字节字符串

(2.5.3)6字节:未知

3日线文件

日线文件保存位置:

上海:dzh安装目录 \ DATA \ SHase \ Day ,深圳:dzh安装目录 \ DATA \ SZnse \ Day ,名称为“证券代码.day”。

文件结构描述如下:

(1)文件大小 证券数量 × 40字节(每个证券占用 40 字节)

(2)每个证券内容描述

(2.1)14字节:日期 == 4字节的整数

(2.2)58字节:开盘价 == 4字节的整数(数值=真实开盘价×1000

(2.3)912字节:最高价 == 4字节的整数(数值=真实最高价×1000

(2.4)1316字节:最低价 == 4字节的整数(数值=真实最低价×1000

(2.5)1720字节:收盘价 == 4字节的整数(数值=真实收盘价×1000

分析家分笔数据文件结构

by:goghu

分析家分笔数据文件结构

.prp 起止地址  数据内容     数据含义  数据类型
--------HEAD----------------------------
00 - 03  F4 9B 13 FC 文件标志 Integer
04 - 07  10 02 00 00 保留 Integer
08 - 0B  00 91 40 3D 保留 Integer
0C - 0F  D2 02 00 00 证券总数 Integer
10 - 13  51 05 00 00 需添加之起始块号 Integer
14 - 17  50 05 00 00 当前最后空块号 Integer
-------TABLE records----------------------------
18 - 21  33 39 39 30 证券代码 Char[10]
22 - 25  30 31 00 FF 分笔交易记录数 Integer
26 - 57  FF FF BA 03...FF FF 记录块号 Word[25](ushort数组)
.
.
.
records list
.
.
------BODY DATA-----
   地   址    数据内容    数据含义       数据类型     
41000 - 41003 98 00 66 3D 日期           Integer    
41004 - 41007 00 00 18 41 最新价         float
41008 - 4100B 00 80 B4 43 累计成交量     float
4100C - 4100F 80 46 A7 48 累计成交金额   float
41010 - 41011 EA AA       委买量1        ushort 
41012 - 41013 2A 3F       委买量2        ushort
41014 - 41015 24 57       委买量3        ushort
41015 - 41017 23 01       委卖量1        ushort
41018 - 41019 8E 5B       委卖量2        ushort
4101A - 3101B 80 40       委卖量3        ushort
4101C         16       委买价1的小数部分 Byte
4101D         9A       委买价2的小数部分 Byte
4101E         80       委买价3的小数部分 Byte
4101F         40       委卖价1的小数部分 Byte
41020         30       委卖价2的小数部分 Byte
41021         57       委卖价3的小数部分 Byte
41022 - 41023 00 80    买入,卖出标识     Byte1.)从18h开始至40017h每64byte为一条股票数据分配记录,含义如上表18h - 57h所示;
2.)从41000h开始每4068byte为一股票数据存储块,每个股票数据存储块共存储113条记录,每一条记录的长度为36 byte:
    具体含义如上表41000h - 41023h所示;
3.) 日期字段意义均为:实际日期 = CDate('1970-01-01')+(日期字段 div 86400);即“日期字段”除以86400所得数为
    实际日期距1970年01月01日的天数。
4.)委买,委卖价由最新价加委买,委卖价小数部分得到,如:
   委买价1的小数部分=16h(<80h), 则委买价1=最新价+32/100;(16h=32d)
   委买价2的小数部分=9Ah(>80h), 则委买价2=最新价-(256-154)/100;(9Ah=154d)
5.)单笔成交量用本笔累计数减上笔累计数得到,
   若买入,卖出标识为80h,则单笔成交量是买入量;
   若买入,卖出标识为C0h,则单笔成交量是卖出量。

大智慧5股票软件数据结构剖析(1) -- 日K线数据结构

by:goghu大智慧5股票软件数据结构剖析(1) -- 日K线数据结构


大智慧是比较有名的股票软件,我将通过一系列的文章,剖析其数据结构,

这里先给出日K线的数据结构

日线数据放在:%app_dir%\DATA\SHase\Day(上证A股) 以及 %app_dir%\DATA\SZnse\Day(深圳A股)

#pragma once

struct DZH5Day
{
 unsigned long date;//date的格式:20070423
 unsigned long open;//开盘价
 unsigned long high;//最高价
 unsigned long low;//最低价
 unsigned long close;//收盘价
 unsigned long moneysum;//成交金额
 unsigned long turnover;//成交数量
 char unused[12];//保留
};

整个结构共40个字节,读者可以查看所有的日线文件,大小肯定是40的倍数

这样很容易读出相应的数据:
如:
FILE* pFile = fopen("600001.day", "rb");
if (NULL != pFile)
{
   while(!feof(pFile))
   {
      DZH5Day dayK;
      fread(&dayK, sizeof(DZH5Day), 1, pFile);
      ......
   }
}

posted on 2007-04-24 02:18 Kusamba 阅读(349) 评论(1)  编辑 收藏 引用 网摘
评论: # re: 大智慧5股票软件数据结构剖析(1) -- 日K线数据结构 2007-06-21 15:51 | moon2
你好,我刚刚接触股票类软件,对大智慧5的数组结构, 对实时的数据文件和结构不清楚,想对实时数据做解析而又无从下手.看到你的文档,想你一定是很清楚,特此来问问.大智慧的实时文件是放在"D:\DZH5\DATA\SHase\MINUTE.DTA"和"D:\DZH5\DATA\SHase\STKINFO.DTA"文件中吗?要是读文档内容的话,数据结构是什么?如清楚请告,谢谢..toney_kissinger@163.com  回复  更多评论
  

分析家数据读取及转换工具V0.7 (5月7日更新)

by:goghu[原创]分析家数据读取及转换工具V0.7 (5月7日更新)

分析家数据读取及转换工具使用说明

    V0.7新增功能

   (2007.4.9更新: 分笔成交数据中的"内盘"和"外盘"标志搞反了,已更正(动态行情中的"内盘"/"外盘"字段没有问题))

    分析家数据读取及转换工具V0.7版增加了以下功能:

(1) 可以象读取其它数据一样方便地读取复权行情和收盘收益率;

(2)增加了一个命令行工具fxj2txt.exe,可以将分析家数据转换为文本,供个别不方便调用DLL组件的软件(如SAS等)调用;

(3)提供了一个直接读取分析家数据的SAS程序(下载);

(4)提供了一个利用FinData.dll创建Wealth-lab数据读取插件的实例程序(源代码及安装程序下载)。

    V0.6新增功能

    分析家数据读取及转换工具V0.6版增加了以下功能:

(1)可以读取用户板块和股票评级数据;

(2)可以读取板块指数各类数据;

(3)可以读取市场代码和名称、表名,生成创建对应SAS数据表的PROC SQL语句;

(4)将分析家数据读取器整合到组件中,可以在语言中直接调用,同时增加了将读取出来的数据保存为文本文件的功能;

(5)增加了一个分析家数据转换工具(也可以在程序中直接调用),该转换工具可以一次性将各类分析家数据直接转换为文本文件(字段间的分隔符可以自定义,可以生成容易被EXCEL等读取的格式);

(6)修正了读取基金、权证报价时存在的一个BUG;基金、权证的报价保存三位小数位。

    简介

    用户一般采取两种方法读取分析家软件的各类数据:一种是先使用数据转换工具将分析家数据转换为某种格式,然后在软件中读取转换后的数据,这种方法无需要编写数据读取程序,操作简单,但难以灵活控制数据读取;另一种办法是通过编程直接读取分析家数据,这种方式较为灵活,但要求深入了解分析家数据存储结构,且熟悉文件I/O操作编程知识。“分析家数据读取 及转换组件”不仅提供了数据转换工具——“分析家数据转换器”,还提供了介于上述两种方法之间的另一选择——“分析家数据读取及转换组件”。分析家数据读取及转换组件是一个DLL,它可以通过方便地在各种语言中直接调用而读取分析家数据,用户不需要了解分析家数据存储结构,不需要自己编写数据读取程序,只需要少量编程知识就可以获得所需数据并进行加工处理 ;它还可以在各种语言中直接调用分析家数据转换工具将各类数据转换为文本文件。分析家数据读取组件采用C#开发,安装程序时会自动注册成为COM组件,可以在支持COM和.NET的语言中(如VB、Office VBA、VBS、Delphi、C#、VB.NET、C++.NET、J#、SAS、Matlab等)直接调用。该组件工具是免费的。源码可从http://www.sasfans.com/bbs/dispbbs.asp?boardid=2&ID=97下载。


    主要功能

    1、既可以读取分析家一般数据,如证券代码表、日线数据、复权行情数据及收益率、当日分笔数据、历史分笔数据、当前最新行情、5分钟线行情、除权数据、财务数据 、板块数据等,也可以读取专业数据,如资产负债表数据、损益表数据、现金流量表数据、财务分析指标、股本结构、分红送配、十大股东、基金周报、基金投资组合 、股票评级等数据;

    2、可读取沪、深、港等各个市场的已安装数据;读取时无须关闭正在运行的分析家软件;

    3、可以从注册表中读取出市场代码及名称,也可以以表格形式列出数据表名及对应文件名、字段信息(如字段名和字段说明),以便于程序自动处理 ;可以生成创建SAS表的语句;

    4、提供了分析家数据读取器和数据转换器,可以直接在程序中调用读取器和转换器;

    5、提供了一个用于演示和测试调用结果的工具;同时提供VBA、VBS、SAS等语言调用实例(SAS调用实例见http://www.sasfans.com/)。


    版本说明

    目前组件最新版本为0.6版,主要支持分析家6.0。如果分析家版本为6.0以下,则部分功能无法使用。


    下载安装方法

    (如果已安装了旧版本请先用提供的Uninstall工具删除!)
    首先,访问http://www.sasfans.com等网站下载安装文件FinDataToolsV0.7.rar(点击这里下载)。 解压后,双击安装文件开始安装,安装程序会自动检测系统是否已安装了.NET框架2.0中文版(.NET Framework 2.0),如果未安装则安装程序会提示安装(安装程序会.NET Framework 2.0下载页面;或者从这里直接下载:http://www.microsoft.com/Downloads/details.aspx?familyid=0856EACB-4362-4B0D-8EDD-AAB15C5E04F5&displaylang=zh-cn);最后,根据提示完成安装(一直点击“下一步”即可)。安装成功后,将在指定目录(默认为C:\FinData)生成:FinData.dll(组件)、FinData.tlb(COM类型库)、FinDataTools.exe( 分析家数据读取及转换工具) 、Fxj2Txt.exe(分析家数据转换命令行工具)、FinDataTools.xls(EXCEL调用例子)、FinDataTools.vbs(VBScript调用例子)等,同时将在“程序”菜单中创建一个名为“FinData”的菜单,包括“FinDataTools数据工具”、“卸载”等快捷方式。
    使用方法

    调用方法与其它COM/.NET组件一样。

    例如,安装后要测试一下是否注册成功为COM组件,可以创建一个VBS文件(扩展名为.VBS),键入以下两行:
        set fxj = createobject("findata.fxjdata")
        fxj.ShowFxjReader()

    执行时如果正确显示分析家数据读取器窗口,说明注册成功。把上面第二行换为fxj.ShowFxjConverter()则可以打开分析家数据转换器,等等。

    再举一个在EXCEL VBA中的调用例子:打开EXCEL Visual Basic编辑器,双击打开“工程”中的“ThisWorkBook”,点击“工具”、“引用”,在“可使用的引用”列表中找到并选择“FinData金融数据 工具”后确定。在ThisWorkBook代码区输入如下代码:
Sub ReadFxjData()
    '调用组件,读取数据保存在变量X中
    Dim x As Variant
    Dim fxj As New FinData.FxjData
    x = fxj.GetData("hq", "SZ000001") ‘读取数据保存在X中
    '以下语句将数据保存在工作表中
    For i = 0 To UBound(x, 1)
    For j = 0 To UBound(x, 2)
        ThisWorkbook.Worksheets(1).Cells(i + 1, j + 1) = x(i, j)
    Next
    Next
End Sub
按F5运行。其中关键语句是x = fxj.GetData("hq", "SZ000001"),只要改变方法GetData中的参数就可以读取到不同的数据,返回的X是一个二维 字符串数组。
    在.NET语言中调用方法也很简单,主要语句如下:
    FinData.FxjData fxj = new FinData.FxjData();
    string[,] s = fxj. GetData("hq", "SZ000001");

    上面只是一些例子,具体功能的使用见以下说明。


    组件方法和属性说明:
    (1)方法GetData
语法:public string[,] GetData(string dataType, string code) 或 public string[,] GetData(string dataType, string code, string newFileName)
功能:读取各类数据
参数说明:
dataType为数据类型,目录允许的值如下:
“dm”——代码表,对应分析家文件stkinfo51.dat
“hq”——日行情,对应分析家文件day.dat
“hqmb”——每笔成交,对应分析家文件report.dat或*.prp
“hq0”——最新行情,对应分析家文件stkinfo51.dat
“hq5”——五分钟线,对应分析家文件min.dat
“fp”——分红送配,对应分析家文件exprof.fdt
“gb”——股本结构,对应分析家文件capital.dat
“gd”——十大股东,对应分析家文件stkhold.dat
“cq”——除权数据,对应分析家文件stkinfo51.dat
“cw”——专业财务数据,对应分析家文件finance.fdt
“cw0”——最新财务数据,对应分析家文件stkinfo51.dat
“jjjz”——基金周报,对应分析家文件fundweek.fdt(V0.5中该代码为jjzb,现改为jjjz,“基金净值”拼音首字母)
“jjzh”——基金投资组合;对应分析家文件funddiv.fdt

“bk”——板块;对应分析家文件*.blk

“pj”——评级;对应分析家文件:评级.str

“hqfq”——复权行情。复权计算方法与一般行情软件有所不同:只对日线数据中的开盘价、最高价、最低价、收盘价进行复权处理,成交量未作复权处理;先根据价格和除权数据计算出每日总收益率,然后用“向前复权”方法计算出复权价格(优点是:假设了分红再投资,任何两点间的收益率不受分红送配时间的影响,便于分析比较);提供根据收盘价计算的收益率。

code为证券代码 ,格式如“SH000001”、“SZ000001”、“HK0001”等,其中板块指数的代码如“$$AA01”、“$$AA02”等;当dataType为“dm”时,为市场代码“SH”或“SZ”等,板块指数的市场代码为“$$”
                 如:GetData("hq","SZ399001") 读取SZ399001(深成指)的所有行情数据;GetData("hq","$$AA01")读取板块指数$$AA01行情。
                     GetData(“dm”,”SH”) 读取沪市证券代码表

newFileName为不含路径的文件名,例如:读取沪市代码表时默认从分析家目录安装目录下的DATA\SH\StkInfo51.Dat文件中读取,但可以指定从其它文件读取,如GetData(“dm”,”SH”,”stkinfo88888.dat”)将从stkinfo8888.dat文件读取代码表(当然前提是该文件结构与stkinfo51.dat相同)。该功能主要用于读取历史分笔数据,如GetData(“hqmb”,”SZ000001”,”20060322.PRP”)将读取深发展2006年3月22日的分笔成交数据。


返回值:返回一个二维字符串数组,每一列为一字段,每一行为一数据记录。注意,这里返回的是一个字符串数组,一般需要根据需要类型转换。


    (2)方法GetFields
语法:public string[,] GetFields(string dataType)
功 能:读取各种数据类型的字段名、字段含义、类型。
参数说明:dataType为指定数据类型同GetData。

返回值:一个二维数组

    (3)方法GetTables
调用格式:public string[,] GetTables()

功 能:读取各表的表名、中文说明、 对应文件。

返回值:一个二维数组
    (4)方法GetMarkets
语法:public string[,] GetMarkets()
功 能:从注册表中读取市场列表:代码、简称、名称,如:SH、沪、上海证券交易所;SZ、深、深圳证券交易所。

返回值:一个二维数组
    (5)方法GetTableDef
语法:public string GetTableDef(string dataType, string descDataType, bool delOldTable)
功 能:生成创建SAS表的PROC SQL语句。

参数:dataType为“dm”等数据表名,descDataType目前只能为“SAS”,delOldTable是否同时生成删除同名数据表的语句。

返回值:一个字符串
    (6)方法GetCodeType
语法:public string GetCodeType(string code)
功 能:根据证券代码获取证券品种,如:GetCodeType("SZ000001")将返回"gp"表示这是股票代码;GetCodeType("SH000001")将返回"zs”(指数);GetCodeType("SZ184688")将返回"jj"(基金),等。

参数:code为证券代码。

返回值:一个字符串:gp(股票)、zq(债券)、jj(基金)、qz(权证)、zs(指数)。

   (7)方法ShowAboutBox
语法:public void ShowAboutBox()
功 能:显示组件的“关于”窗口。

   (8)方法ShowFxjConverter
语法:public void ShowFxjConverter()
功 能: 显示“分析家数据转换器”窗口。可以读取各类数据,不过一般每次只能读取一只证券的数据;可以读取各字段信息;可以将读取出来的数据保存为文本文件。

   (9)方法ShowFxjReader
语法:public void ShowFxjReader()
功 能:显示“分析家数据读取器”窗口。可以将各类数据转换为文本文件,字段间的分隔符可以自定义;

    (10)属性FxjDataPath
功能:字符串型,可读写,返回分析家数据目录(一般为c:\fxj\data\),如果组件无法自动获取正确的分析家数据目录,可以设置该属性指定分析家数据目录。

    (11)属性FxjPath
功能:字符串型,返回分析家安装目录(一般为c:\fxj\)。
    (12)属性Error
功能:整型,只读,返回上一步操作是否出现错误。若该属性为0,表示没有错误发生,若为1则表示发生了错误,具体错误信息可以通过MSG属性获得。
    (13)属性Msg
功能:字符串型,只读,返回上一步操作的错误信息。
    (14)属性Version
功能:实型,返回组件当前版本号。

Fxj2Txt.exe使用说明:

    功能:生成以逗号为分隔符的文本。

    调用格式: fxj2txt.exe methodname  args ...    methodname可以是getdata、getfields、gettabledef、gettables、getmarkets、getcodetype,args为相应参数。如在DOS窗口下健入fxj2txt.exe getdata hq sz000001 将生成SZ000001(深发展)的行情数据等。可以用重定向符将生成的数据保存在一文本文件中:fxj2txt.exe getdata hq sz000001 > hqsz000001.txt

股票数据格式2

by:goghu

股票数据格式

 投资家数据数据结构
  
   投资家日线文件数据结构
  
   每28个字节为一日。
   Date:LongInt; //日期(距1970.01.01的秒数)
   OPen:LongInt; //开盘(元)
   Close:LongInt; //收盘(元)
   High:LongInt; //最高价(元)
   Low:LongInt; //最低价(元)
   Volume:LongInt; //成交量(股)
   Money:LongInt; //成交额(元)
  
   日期,x/86400取余后如果余数大于等于57600则加1(取整方法为如果大于16:00收盘时间则加1,否则不加1,视为昨天。)即为1970-01-01到当前的天数。分析家则不用这样都是整数。 开盘价(算法同分析家) 收盘价(算法同分析家) 最高价(算法同分析家)
   最低价(算法同分析家) 成交量(股)(算法同分析家) 成交额(元)(算法同分析家)从钱龙转过来正确,但自动接收好像不对为0  
   
工具箱  
 
【 · 发布:loveice  2003-07-29 00:00 】   
  天亿日线文件数据结构
  
   沪市日线文件路径:默认在\DATA\SHASE\DAY下。
   深市日线文件路径:默认在\DATA\SZNSE\DAY下。
  
   日线文件命名规则:股票代码.DAY
  
   每个日K线为40字节,具体如下:
   Date:LongInt; //日期
   OPen:LongInt; //开盘(元/1000)
   High:LongInt; //最高价(元/1000)
   Low:LongInt; //最低价(元/1000)
   Close:LongInt; //收盘(元/1000)
   Money:LongInt; //成交额(千元)
   Volume:LongInt; //成交量(手)
   Nouse1:LongInt; //没用
   Nouse2:LongInt; //没用
   Nouse3:LongInt; //没用
  
  
工具箱  
 
【 · 发布:loveice  2003-07-29 00:00 】   
  天网数据数据结构
  
   天网日线文件数据结构
  
   沪市日线文件路径:默认在YYY\DATA\SHASE\DAY下。
   深市日线文件路径:默认在YYY\DATA\SZNSE\DAY下。
  
   日线文件命名规则:股票代码.DAY
  
   每个日K线为40字节,具体如下:
   Date:LongInt; //日期
   OPen:LongInt; //开盘(元/1000)
   High:LongInt; //最高价(元/1000)
   Low:LongInt; //最低价(元/1000)
   Close:LongInt; //收盘(元/1000)
   Money:LongInt; //没用
   Volume:LongInt; //成交量(手)
   Nouse1:LongInt; //没用
   Nouse2:LongInt; //没用
   Nouse3:LongInt; //没用
  
  
工具箱  
 
【 · 发布:loveice  2003-07-29 00:01 】   
  慧眼日线文件数据结构
  
   日线文件路径:默认在\Stkdt下。
  
   日线文件命名规则:股票代码.DAT
  
   每个日K线为28字节,具体如下:
   Date:LongInt; //日期
   OPen:LongInt; //开盘(元/100)
   High:LongInt; //最高价(元/100)
   Low:LongInt; //最低价(元/100)
   Close:LongInt; //收盘(元/100)
   App:LongInt; //涨跌(收盘价之差)
   Volume:LongInt; //成交量(手)
  
   慧眼代码表文件数据结构
  
   慧眼98静态版的lstf.dat的数据结构(本文件是列表与日线无关)
  
   以4位整型为单位。
  
   第四个为日期。前100个字节为头信息。好像不能动。每个股票为60字节
  
   为代码(ha600001) 为名称
   开(分) 高(分) 低(分) 收(分)
   涨跌(分) 成交量(手) ?00 00 10 16(0) ?0
   ?0 ?0 ?0 ----------
  
   一个长整型的各位的含义
  
   即与00 00 11 13异或的结果
  
   显示值 (1-H)2^28 (1-L)2^24 (2-H)2^20 (2-L)2^16 (3-H)2^12 (3-L)2^8 (4-H)2^4 (4-L)2^0
   0 268435456 16777216 1048567 65536 1*4096 1*256 1*16 3
   1 1 1 1 1 0 0 0 2
   2 2 2 2 2 3 3 3 1
   3 3 3 3 3 2 2 2 0
   4 4 4 4 4 5 5 5 7
   5 5 5 5 5 4 4 4 6
   6 6 6 6 6 7 7 7 5
   7 7 7 7 7 6 6 6 4
   8 8 8 8 8 9 9 9 11
   9 9 9 9 9 8 8 8 10
   a a a a a 11 11 11 9
   b b b b b 10 10 10 8
   c c c c c 13 13 13 15
   d d d d d 12 12 12 14
   e e e e e 15 15 15 13
   f f f f f 14 14 14 12
  
   如果涨跌幅是负的话,则用FF FF FF FF 减去用上面算法算出的数再减1
  
   显示的成交量可以与内建的流通量一起由慧眼算换手率。
  
工具箱  
 
【 · 发布:loveice  2003-07-29 00:01 】   
  恒生数据数据结构
  
   (一)恒生日线文件数据结构
  
   沪市日线文件路径:默认在HSNEW\DATA\SHASE\DAY下。
   深市日线文件路径:默认在HSNEW\DATA\SZNSE\DAY下。
  
   日线文件命名规则:股票代码.DAY
  
   每个日K线为40字节,具体如下:
   Date:LongInt; //日期
   OPen:LongInt; //开盘(元/1000)
   High:LongInt; //最高价(元/1000)
   Low:LongInt; //最低价(元/1000)
   Close:LongInt; //收盘(元/1000)
   Money:LongInt; //成交额(千元)
   Volume:LongInt; //成交量(手)
   Nouse1:LongInt; //没用
   Nouse2:LongInt; //没用
   Nouse3:LongInt; //没用
  
工具箱  
 
【 · 发布:loveice  2003-07-29 00:02 】   
  (二)钱龙代码表文件格式
  
   沪市代码表文件路径:默认为ML30\DATA\SHASE\NAMETBL.SHA
   深市代码表文件路径:默认为ML30\DATA\SZNSE\NAMETBL.SZN
  
   First0:ShortInt; //1字节,只能为00
   Name:array [1..8] of Char;
   Kind:ShortInt;
   Code:array [1..6] of Char;//代码深圳为XXXX__
   YesClose:LongInt;//昨收
   Open:LongInt;//开盘
   High:LongInt;//最高
   Low:LongInt;//最低
   Close:LongInt;//收盘
   Volume:LongInt;//总手
   Money:LongInt;//金额
   Buy1M:LongInt;//买一价
   Buy1V:LongInt;//买一量
   Buy2M:LongInt;//买二价
   Buy2V:LongInt;//买二量
   Buy3M:LongInt;//买三价
   Buy3V:LongInt;//买三量
   Sale1M:LongInt;//卖一价
   Sale1V:LongInt;//卖一量
   Sale2M:LongInt;//卖二价
   Sale2V:LongInt;//卖二量
   Sale3M:LongInt;//卖三价
   Sale3V:LongInt;//卖三量
   Per:SmallInt;//只能为100??
   NowV:LongInt;//现手
  
   (三)钱龙网络版动态数据格式(即ml30\lond\dat下的数据格式)
  
   // Set the default value
   #define EXCH_MIN 240
   #define EXCH_A 9*60+30
   #define EXCH_AE 11*60+30
   #define EXCH_B 13*60+00
   #define EXCH_BE 15*60+00
   #define SEP_TAG 0xffffffff
   #define TRA_MAXN 1000
   #define INFO_PARA 0x84
   #define TYPE_NUM 0x4
   #define FALSE 0x0
   #define TRUE 0x1
   #define SLHS_SIZE 0x300
   #define SH_ZS ^a^
   #define SH_AG ^b^
   #define SH_BG ^c^
   #define SH_ZQ ^d^
   #define SZ_ZS ^A^
   #define SZ_AG ^B^
   #define SZ_BG ^C^
   #define SZ_ZQ ^D^
   #define DH_ZS 0x10
   #define DH_AG 0x11
   #define DH_BG 0x12
   #define DH_ZQ 0x13
   #define DZ_ZS 0x20
   #define DZ_AG 0x21
   #define DZ_BG 0x22
   #define DZ_ZQ 0x23
  
   struct APD_stock_data{ // in 199YMMDD.DAT
   unsigned char data_id; // =0x73 with min_data,// =0x09 without min_data,// =0x20 is deleted
   unsigned char stock_type; // many be a,b,c,d or A,B,C,D
   unsigned char stock_code[6]; // stock code
   unsigned char stock_name[8]; // name of the stock
   unsigned long last_close_price;
   unsigned long open_price;
   unsigned long high_price;
   unsigned long low_price;
   unsigned long close_price;
   unsigned long total_volume;
   unsigned long total_value;
   };
  
   struct APD_stock_min{ // store data for normal shares
   unsigned long cur_price; // price of every minutes
   unsigned long total_volume; // summary volume by this minute
   unsigned int average_percent; // swing percent of the average value<
   };
  
   struct APD_index_min{ // store data for index
   unsigned long cur_price; // index of every minutes
   unsigned long total_volume; // summary volume by this minute
   unsigned int average_percent; // swing percent of the average index
   unsigned int buy_vigour; // the vigour value of buying
   unsigned int sell_vigour; // the vigour value of selling
   };
  
   // Develop data files by appdata structured upwards
  
   struct Data_5min{ // in .nmn files
   unsigned long min_off; // Format is MMDDHHMM
   unsigned long open_price; // 0.001
   unsigned long high_price; // 0.001
   unsigned long low_price; // 0.001
   unsigned long close_price; // 0.001
   unsigned long min_amount; // 100
   unsigned long min_volume; // 100
   unsigned long time_count; // sum trade time
   unsigned char share_value; // share value
   unsigned char share_number; // share break number
   unsigned int share_bonus; // share bonus
   unsigned long shares_number; // sum number
   };
  
   struct His_data{ // in lonhis.???
   unsigned long cur_price;
   unsigned long total_volume; // total volume
   unsigned long total_value; // total value by this minute
   unsigned long buy_volume; // initiactive total buy volume
   unsigned long sell_volume; // initiactive total sell volume
   unsigned int rise_num; // summary rise shares of this minute
   unsigned int fall_num; // summary fall shares of this minute
   unsigned int average_percent; // swing percent of the average index
   unsigned int buy_vigour; // the vigour value of buying
   unsigned int sell_vigour; // the vigour value of selling
   unsigned int value_ADL; // the value of current ADL index
   unsigned int swing_flag; // the flag of rise or fall
   };
  
   struct Tra_data{ // in lontra.???
   unsigned int time_off;
   unsigned long cur_price;
   unsigned long total_vol;
   unsigned long buy_price;
   unsigned long sell_price;
   };
  
   struct Info_data{ // in loninfo.???
   unsigned char stock_id; // This byte is to id stock
   unsigned char data_tag; // always be 0 to id
   unsigned int stock_num;
   unsigned int start_num;
   unsigned int max_tra;
   unsigned int min_exch;
   unsigned int exch_min;
   unsigned int A_begin_time;
   unsigned int A_end_time;
   unsigned int B_begin_time;
   unsigned int B_end_time;
   };
  
   struct Cdp_data{ // shacdp.dat of HXTW
   unsigned char stock_code[6];
   unsigned char reserved[20];
   unsigned long reserved2;
   };
  
   // some dynamic data files structured upwards
  
   struct Data_day{ // in .day files
   unsigned long day_date; // Format is YYYYMMDD
   unsigned long open_price; // 0.001
   unsigned long high_price; // 0.001
   unsigned long low_price; // 0.001
   unsigned long close_price; // 0.001
   unsigned long day_amount; // 1000
   unsigned long day_volume; // 100
   unsigned long time_count; // sum trade time
   unsigned char share_value; // share value
   unsigned char share_number; // share break number
   unsigned int share_bonus; // share bonus
   unsigned long shares_number; // sum number
   };
  
   struct Slon_para{ // in file slonpara.dat
   unsigned int sh_A_para; // Offset of SH_A stock
   unsigned int sh_B_para;
   unsigned int sh_C_para;
   unsigned int sh_total_para;
   unsigned int sz_A_para;
   unsigned int sz_B_para;
   unsigned int sz_C_para;
   unsigned int sz_total_para;
   unsigned int data_tag[3];
   };
  
   struct Slon_day{ // in .day files of Slon
   unsigned long day_date; // Format is YYYYMMDD
   unsigned long open_price; // 0.001
   unsigned long close_price; // 0.001
   unsigned long high_price; // 0.001
   unsigned long low_price; // 0.001
   unsigned long day_amount; // 1000
   unsigned long day_volume; // 100
   unsigned int reserved[6]; // Some infomation I don^t know
   };
  
   struct Slon_HS{ // in lonhs.dat of Slon
   unsigned int data_tag1; // Some infomation I don^t know
   unsigned char stock_type; // =0xff is delete, =0x64 is OK
   unsigned long stock_code; // number of stock code
   unsigned char stock_name[8]; // name of stock
   unsigned char data_tag2; // =0x0, Some infomation I don^t know
   unsigned int data_tag3; // =0x64, Some infomation I don^t know
   unsigned int last_close_price;
   unsigned int open_price;
   unsigned long PMA5_volume; // The volume of 5day average
   unsigned int high_price;
   unsigned int low_price;
   unsigned int close_price;
   unsigned long data_tag4; // Some infomation I don^t know
   unsigned long total_volume1; // Total volume
   unsigned long total_volume2; // Total volume
   unsigned int buy_1_price; // The price of buying now
   unsigned char buy_2_sub; // The offset of buy 1 and buy 2 price
   unsigned char buy_3_sub; // The offset of buy 1 and buy 3 price
   unsigned long buy_1_volume;
   unsigned long buy_2_volume;
   unsigned long buy_3_volume;
   unsigned int sell_1_price; // The price of selling now
   unsigned char sell_2_add; // The offset of sell 1 and sell 2 price
   unsigned char sell_3_add; // The offset of sell 1 and sell 3 price
   unsigned long sell_1_volume;
   unsigned long sell_2_volume;
   unsigned long sell_3_volume;
   unsigned int refx;
   unsigned int refy;
   unsigned int hisfptr;
   unsigned int numppg;
   unsigned char pgnum;
   unsigned int hisptr00;
   unsigned int hisptr01;
   unsigned int hisptr02;
   unsigned int hisptr03;
   unsigned int hisptr04;
   unsigned int hisptr05;
   unsigned int hisptr06;
   unsigned int hisptr07;
   unsigned int hisptr08;
   unsigned int hisptr09;
   unsigned int data_tag5;
   unsigned long cur_volume;
   unsigned char reserved1[12];
   unsigned int minfptr;
   unsigned int minsize;
   unsigned long data_tag6;
   unsigned long out_volume;
   unsigned char reserved2[133];
   unsigned char data_tag7; // always 07
   unsigned char reserved3[145];
   unsigned char end_hour;
   unsigned char end_minute;
   unsigned int lastmin_vol;
   unsigned int data_tag8;
   unsigned long total_volume3;
   unsigned int cur_price;
   unsigned long average_price;
   unsigned char reserved4[82];
   };
  
   /* SLON data structure from MR.ZHAO BIAO
  
   Lonhs.dat结构分析(QB)
   位置  长度  类型    说明
   1   2   INTEGER  ******************
   2   1   STRING   标志,FF->delete 64->ok
   3   4   LONG    股票代码
   4   8   STRING   股票名称
   5   1   STRING   00-> ? *****************
   6   2   INTEGER  64-> ? *****************
   7   2   INTEGER  前收盘价
   8   2   INTEGER  开盘价
   9   4   LONG    五日均量
   10   2   INTEGER  最高价
   11   2   INTEGER  最低价
   12   2   INTEGER  收盘价
  
  
   
工具箱  
 
【 · 发布:loveice  2003-07-29 00:03 】   
  图文卡与钱龙分析软件接口规范
  
   第一章 系统概述
  
   系统的物理结构
  
   股票分析软件 Lonsd.exe(单机版)
  
   驱动程序 Driver.exe(TSR)
  
   操作系统 DOS3.30 or High
  
   硬件平台 PC + 数据接收机
  
   数据接收机可有多种实现方式,典型的有:
  
   VBI(图文电视)方式
  
   RDS(调频副载波)方式
  
   MODEM(调制解调器)方式
  
   可视图文方式
  
   X.25方式
  
   股票分析软件Lonsd.exe通过驱动程序Diver.exe访问股票的行情数据,与不同的接收方式或硬件平台无关,而每一种数据接收机均需一个特殊的驱动程序Diver.exe以保证数据的正常接收。驱动程序Diver.exe为一常驻内存程序(TSR),负责实时数据的接收。所有的数据接收机的硬件生产厂商需提供用户针对该接收机的驱动程序Diver.exe,并保证能接收到本规范所定义的钱龙动态股票分析软件所需要的数据项,用户即可使用钱龙公司出品的最新股票分析单机版软件。实时数据发射端和数据接收机之间的通讯协定由数据接收机的硬件生产厂商决定,只须满足速度及稳定性要求即可。
  
   系统的配置需求
  
   CPU 80386、80486 or Pretium
  
   Memory >=2M, Free Memory>=1.6M( 建议>=4M)
  
   Display Standard VGA 640*480 16色
  
   DOS VER3.30 or High(建议使用SmartDrv.exe)
  
   TLOOS 钱龙公司天生赢家Winnegro专用软件狗一个
  
   接收速度 建议>=1 记录数/秒
  
   第二章 动态单机版工作流程
  
   驱动程序Diver.exe和分析软件Lonsd.exe的共用数据区
  
   共用数据区由BIOS通讯区和行情数据区两部分组成。BIOS通讯区由硬件类型、硬件机号、行情类型、数据区地址(段地址和偏移量),数据区记录首指针、尾指针和Diver驻留标志等元素组成。行情数据区以队列方式存放,每条启示为96个字节,共有256条记录,记录格式见第三章。
  
   驱动程序Diver.exe的工作流程
  
   非驻留部分:
  
   初始化,检查硬件-数据接收机是否存在。
  
   接收所有股票的基本资料,建立证券名称对照表(需存盘,含各种指数),证券名称对照表见第三章,证券名称对照表按类别(type)排序,相同类别则按股票代号排序。
  
   初始化BIOS通讯区,置硬件类型、硬件机号和行情类型、数据区段地址、偏移置和Diver驻留标志均需为0。
  
   驻留部分:
  
   Driver驻留标志置为0xaa,检查分析软件是否启动,即判断数据区内存地址是否已置好。
  
   若好,则接收数据。若当前数据首指针为n,则将行情数据写至(数据区内存地址+n*88)位置,然后置数据首指针置为n+1。(当n=255时,数据首指针置为0)。
  
   若数据区内存地址为0,则停止接收数据。
  
   分析软件Lonsd.exe的工作流程
  
   检查是否已安装驱动程序,若是则申请数据区内存,置数据区内存地址。
  
   将数据区首指针和尾指针置为0。
  
   接收股票行情数据:判断首指针是否等于尾指针,若不等,设当前尾指针为m,则从(数据区内存地址+m*88)读一条记录,然后置数据尾指针置为m+1。(当m=255时,数据尾指针置为0)。
  
   进入分析系统,循环处理第3条。
  
   退出分析软件后将数据区内存地址重新置为0。
  
   第三章 数据区、数据包及数据文件格式
  
   BIOS通讯区数据表
  
   硬件类型 0040:00f0 byte 1 Driver 不能为0
  
   硬件机号 0040:00f1-00f5 5byte 5 Driver  
  
   行情类型 0040:00f6-00f7 16bit 1 Driver 最多为16种
  
   数据区段地址 0040:00f8-00f9 word 1 Lonsd  
  
   数据区偏移地址 0040:00fa-00fb word 1 Lonsd  
  
   记录首指针 0040:00fc byte 1 Lonsd 由Driver改变
  
   记录尾指针 0040:00fd byte 1 Lonsd 由Lonsd改变
  
   汇金指标 0040:00fe byte 1 无  
  
   Driver驻留标志 0040:00ff byte 1 Driver 已驻留为0xaa
  
   总计 0040:00f0-00ff   16    
  
   注:1、当汇金指标的值<=0f时,其值等于0,新股增加采用插入方式,其值等于1,新股增加采用代码表的方式,即使用exe目录下的NameTbl.Sha、NameTbl.Sza。
  
   2、当汇金指标的值>0f时,则表示接收行情的方式当ax=0时,使用软中断接收行情,当ax=1时,使用硬中断接收行情0,并使用exe目录下的NameTbl.Sha、NameTbl.Sza。
  
   指数数据包
  
   数据包类型 type char 1 证券类型
  
   证券代码 code(6) char 6  
  
   昨日收盘 close long 4  
  
   今日开盘 open long 4  
  
   今日最高 high long 4  
  
   今日最低 low long 4  
  
   今日最新 new long 4  
  
   总买盘量 vbuy long 4 可忽略
  
   总卖盘量 bsell long 4 可忽略
  
   总成交量 volume long 4 单位:百股
  
   成交金额 amount long 4 单位:百元
  
   总家数 total int 2 可忽略
  
   日期 date long 4 可忽略
  
   时间 time Long 4 可忽略
  
   保留 reserved(34) Char 34  
  
   校验码 chksum Char 1  
  
   股票名称 name Char 8  
  
   总计     96  
  
   个股数据包
  
   数据包类型 type Char 1 证券类型
  
   证券代码 code(6) Char 6  
  
   昨日收盘 close Long 4  
  
   今日开盘 open Long 4  
  
   今日最高 high Long 4  
  
   今日最低 low Long 4  
  
   今日最新 new Long 4  
  
   买盘价1 pbuy1 Long 4  
  
   买盘量1 vbuy1 Long 4  
  
   买盘价2 pbuy2 Long 4  
  
   买盘量2 vbuy2 Long 4  
  
   买盘价3 pbuy3 Long 4  
  
   买盘量3 vbuy3 Long 4  
  
   卖盘价1 psell1 Long 4  
  
   卖盘量1 vsell1 Long 4  
  
   卖盘价2 psell2 Long 4  
  
   卖盘量2 vsell2 Long 4  
  
   卖盘价3 psell3 Long 4  
  
   卖盘量3 vsell3 Long 4  
  
   总成交量 volume Long 4 单位:股
  
   成交金额 amount Long 4 单位:元
  
   校验码 chksum Char 1  
  
   股票名称 name Char 8  
  
   总计     96  
  
   信息数据包
  
   数据包类型 type Char 1  
  
   时间 time Int 2 如12:59表示为1259
  
   流水号 sieralno Int 2 信息编号(0-9999)
  
   提供者 provider Char 14 信息来源
  
   总块数 totblock Int 2  
  
   块号 blockno Int 2 块号=0时为信息标题
  
   信息内容 content(64) Char 64 每块信息为64字节
  
   校验码 chksum Char 1  
  
   总计     88  
  
   证券名称对照表NameTbl.Sha NameTbl.Szn
  
   证券类型 type Char 1 Bit7为标志位
  
   证券代码 code(6) Char 6 不满8位填空格
  
   证券名称 name(8) Char 8  
  
   最小交易单位 unit Char 1 每手股数/10
  
   总计     16  
  
   注意事项
  
   所有股票的价格及指数的值均为实际值乘1000。股票的成交金额以元为单位,成交量(买卖盘)以股数为单位。指数的成交金额以百元为单位,成交量(买卖盘)以百股为单位。
  
   日期的表示:如1996年1月1日为19960101(长整型)。
  
   B股的价格单位:上交所为美元,深交所为港元,因此在计算B股指数的成交金额时必须乘上汇率,否则会导致B股成交金额和大盘成交金额有误差。
  
   信息数据包块号=0时的内容为该信息的标题。信息的正文块号从1开始。
  
   两个证券名称对照表文件的目录分别为\ML30\DATA\SHASE\NameTbl.Sha和\ML30\DATA\SZNSE\NameTbl.Sza。
  
   Type作为证券类型时,Bit7为标志位,Bit7=1时忽略该股票。
  
   Lonsd对每一个行情来源(上交所或深交所)最多能处理16个指数和560个股票。
  
   目前Lonsd 读取行情记录时暂不对校验码(chksum)做检查。
  
   附录一 实时行情种类
  
   Byte 0: 0040:00f6
  
   Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0
  
   保留 保留 保留 保留 保留 保留 深证所 上证所
  
   Reserved Reserved Reserved Reserved Reserved Reserved SZNSE SHASE
  
   Byte 1: 0040:00f7
  
   Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0
  
   保留 保留 保留 保留 保留 保留 保留 保留
  
   Reserved Reserved Reserved Reserved Reserved Reserved Reserved Reserved
  
   附录二 数据包类型/证券类型
  
   上海指数 0x10
  
   上海A股 0x11
  
   上海B股 0x12
  
   上海债券 0x13
  
   上海权证 0x14
  
   上海红利 0x15
  
   上海配股 0x16
  
   上海证交所信息 0x1f
  
   深圳指数 0x20
  
   深圳A股 0x21
  
   深圳B股 0x22
  
   深圳债券 0x23
  
   深圳权证 0x24
  
   深圳红利 0x25
  
   深圳配股 0x26
  
   深圳证交所信息 0x2f
  
   综合财经信息 0x05
  
   空包 0xff
  
   注:法人股系统及各期货交易上市的期货行情资料待日后(V3.10)增加。
  
   附录三 证券代码(code)
  
   个股的代码
  
   个股的代码即为个股的股票代码,深圳证券交易所上市的股票的代码前4位有效,后2位填空格。
  
   指数的代码
  
   上证综合指数 999999
  
   上证A股指数 999998
  
   上证B股指数 999997
  
   上证工业股指数 999996
  
   上证商业股指数 999995
  
   上证地产股指数 999994
  
   上证公用事业股指数 999993
  
   上证综合股指数 999992
  
   上证30指数 999991
  
   深圳成份股指数 9996
  
   深圳成份A股指数 9995
  
   深圳成份B股指数 9994
  
   深证工业股指数 9993
  
   深证商业股指数 9992
  
   深证金融股指数 9991
  
   深证地产股指数 9990
  
   深证公用事业股指数 9989
  
   深证综合股指数 9988
  
   深证基金指数 9987
  
   深证综合指数 9999
  
   深证综合A股指数 9998
  
   深证综合B股指数 9997
  
  
  
工具箱  
 
【 · 发布:loveice  2003-07-29 00:05 】   
   shan_lee :
  
    给你这么多(有些没考虑4位升6位)希望能对你有用。代码表我只给了钱龙的,不过由于它内容少,格式简单,你很容易举一反三把其它的看懂的。
工具箱  
 
【 · 原创:goldeye  2004-01-03 01:52 】   
  loveice兄不简单。
  想几年前为了从恒生补钱龙数据,对这些文件也解了很长时间。
  
  (二)钱龙代码表文件格式
  Per:SmallInt;//只能为100??
  ---------
  估计跟小数位数有关,分或厘
  
  钱龙3.0版数据存储格式
  日线:其余12字节未使用
  ------
  是成交笔数 等一些当时没有的信息,盘后分析功能有关,
  我也是改一些数后发现的。
  
  
工具箱  
 
【 · 原创:鹿鸣嗷嗷  2004-02-25 13:32 】   
  强人啊:))
工具箱  
 
【 · 原创:鱼鹰  2004-02-25 13:37 】   
  WOW!
  收藏!
工具箱  
 
【 · 原创:hexinstock  2004-02-25 14:06 】   
  牛!
工具箱  
 
【 · 原创:斑点  2004-02-25 17:30 】   
  嘻嘻,身在宝山不知者何其多
工具箱  
 
【 · 原创:cutecat  2004-02-25 19:14 】   
  不知道该如何感谢.
  
工具箱  
 
【 · 原创:hylt  2004-03-30 19:03 】   
  请教:哪个软件可以导出带除权的文本数据?
工具箱  
 
【 · 原创:loveice  2004-03-30 21:14 】   
  《飞狐》可以导出带除权的文本数据
工具箱  
 
【 · 原创:绿苹果  2004-03-30 22:53 】   
  顶!
  
  俺很需要报表的数据来源,DBF的最好,TXT的也行,不知通过怎样的渠道或用怎样的方法获得?另外,能从PDF格式中获得吗?先谢谢了.
  
工具箱  
 
【 · 原创:hylt  2004-03-31 23:17 】   
  【 原创:loveice 时间:2004-3-30 21:14:52 】
  《飞狐》可以导出带除权的文本数据
  
  谢谢老大,我现在用的正是飞狐,但飞狐有个麻烦,就是没有自己可靠的数据源,包括除权数据。另外我想在文本数据里加上一列历史流通盘,不知怎么才能搞到。我现在用的是Wealth-Lab软件,请看:http://www.0-3.cn/bbs/viewtopic.php?t=541
  
  绿苹果:可以看看证旺:http://www.zmatch.com/

股票数据格式1

by:goghu

★股票数据格式-TO:shan_lee
【 发布:loveice  2003-07-28 23:54  远山近水   浏览/回复:2126/27】 
  shan_lee :
     要将商品行情软件的数据导入自己的数据库,除了要知道商品软件数据的数据结构,同时还与你自己数据库的数据结构有关。一般情况下,业余爱好者往往都是使用ASCII即text文本结构。text格式的数据易读易懂,可以让许多国际股票软件和工具软件(比如:GET\TT\SUPERCHART\SSPS\EXECL等等)直接调用。
     如果你考虑用text格式,有以下几种方法:一、比如《飞狐》,它可以直接为你输出text数据,而且在输出前你还可以按自己要求设置其数据间格式。二、运用其他网友编好的现成的数据转换软件予以转换,比如fxjtotext、ctext等,这些小软件网上都能找到。三、自己动手,麻烦是麻烦点,但可以给自己更大的灵活的空间,比如说搞个自己格式的数据。
     自己动手,就要知道商品软件的数据格式,我这里给你几个常见的软件的数据格式,希望对你有点用处。当然这些数据的转换原则上是适用于盘后静态,要是动态,那就复杂多了,我只跟你给出钱龙的,供参考。
  
工具箱  
 
【 · 发布:loveice  2003-07-28 23:56 】   
  钱龙3.0版数据存储格式
  
   上海日线存储路径为:\ml30\data\shase\day,文件扩展名为:.day
   上海周线存储路径为:\ml30\data\shase\week,文件扩展名为: .wek
   上海月线存储路径为:\ml30\data\shase\month,文件扩展名为: .mnt
   深圳日线存储路径为:\ml30\data\sznse\day
   深圳周线存储路径为:\ml30\data\sznse\week
   深圳月线存储路径为:\ml30\data\sznse\month
  
   以深发展日线为例:
   1A76:0100 D6 CD 2F 01 52 07 01 00-52 07 01 00 52 07 01 00
   1A76:0110 52 07 01 00 86 0F 00 00-4D 02 00 00 00 00 00 00
   1A76:0120 00 00 00 00 00 00 00 00-D7 CD 2F 01 60 03 01 00
   1A76:0130 60 03 01 00 60 03 01 00-60 03 01 00 82 05 00 00
   1A76:0140 D4 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00
  
   每一条记录的长度为40字节:
   1-4字节为日期,D6 CD 2F 01转换为十进制是:19910102
   5-8字节为开盘价*1000
   9-12字节为最高价*1000
   13-16字节为最低价*1000
   17-20字节为收盘价*1000
   21-24字节为成交量(手)
   25-28字节为成交金额
   其余12字节未使用
  
   另:周线,月线格式与日线格式一致.
  
   下面是我用C语言编的一个显示深发展日线的小程序,运行时要将000001.day拷到当前目录.
  
   #include
   #include
   #include
  
   typedef struct {
   unsigned long date;
   unsigned long open;
   unsigned long high;
   unsigned long low;
   unsigned long close;
   unsigned long travl;
   unsigned long traca;
   char unuse[12];
   } RECORD;
  
   RECORD reco;
   int readrec(FILE *);
  
   void main()
   {
   FILE *fp;
   if((fp = fopen("000001.day","rb")) == NULL) // 打开深发展日线
   { printf("Error: Can^t open 000001.DAY !\n");
   exit(0); }
   readrec(fp);
   fclose(fp);
   if(getch()==0) getch();
   exit(0);
   }
  
   int readrec(FILE *fp)
   {
   float fn;
   while (! feof(fp)) {
   fread(&reco,sizeof(RECORD),1,fp);
   printf("%10lu ",reco.date);
   fn=float(reco.open)/1000;
   printf("%8.2f ",fn);
   fn=float(reco.high)/1000;
   printf("%8.2f ",fn);
   fn=float(reco.low)/1000;
   printf("%8.2f ",fn);
   fn=float(reco.close)/1000;
   printf("%8.2f ",fn);
   printf("%8lu ",reco.travl);
   printf("%8lu\n",reco.traca);
   }
   printf("\n");
   return 0;
   }
  
工具箱  
 
【 · 发布:loveice  2003-07-28 23:56 】   
  分析家3.1x版数据存储格式
  
   上海日线存储文件为:\superstk\data\sh\day.dat
   深圳日线存储文件为:\superstk\data\sz\day.dat
  
   以上海日线存储文件day.dat为例:
  
   00000h: F4 9B 13 FC 10 02 00 00-00 00 00 00 D1 04 00 00
   00000h: 81 0C 00 00 48 0C 00 00-31 41 30 30 30 31 00 FF
   00020h: FF FF B0 09 00 00 16 00-17 00 18 00 19 00 1A 00
   00030h: 1B 00 1C 00 1D 00 1E 00-07 0A FF FF FF FF FF FF
   00040h: FF FF FF FF FF FF FF FF-FF FF FF FF FF FF FF FF
   00050h: FF FF FF FF FF FF FF FF
   ......
   ......
   41000h: 80 47 B2 2B B9 1E 25 41-CD CC 4C 41 EC 51 18 41
   41010h: 9A 99 41 41 80 06 B2 47-40 1C BC 4C 00 00 00 00
   41020h: 00 3C B6 2B 34 33 3F 41-AF 47 49 41 01 00 30 41
   41030h: 34 33 3B 41 00 07 12 47-A4 3C 26 4C 00 00 00 00
  
   该文件格式与磁盘文件物理存储方式类似:
  
   起止地址 数据内容 数据含义 数据类型
   00 - 03 F4 9B 13 FC 日线文件标志 Integer
   04 - 07 10 02 00 00 保留 Integer
   08 - 0B 00 00 00 00 保留 Integer
   0C - 0F D1 04 00 00 证券总数 Integer
   10 - 13 81 0C 00 00 需添加之起始块号 Integer
   14 - 17 48 0C 00 00 当前最后空块号 Integer
   18 - 21 31 41 30 30 30...FF 证券代码 Char[10]
   22 - 25 B0 09 00 00 日线记录数 Integer
   26 - 57 16 00 17 00...FF FF 记录块号 Word[25]
   ......
   41000 - 41003 80 47 B2 2B 日期 Integer
   41004 - 41007 B9 1E 25 41 开盘价 Single
   41008 - 4100B CD CC 4C 41 最高价 Single
   4100C - 4100F EC 51 18 41 最低价 Single
   41010 - 41013 9A 99 41 41 收盘价 Single
   41014 - 41017 80 06 B2 47 成交量 Single
   41018 - 4101B 40 1C BC 4C 成交金额 Single
   4101C - 4101D 00 00 上涨家数 Word
   4101E - 4101F 00 00 下跌家数 Word
  
   注:
   1)起止地址、数据内容为十六进制,数据类型为 Delphi 下之定义。
   2)从18h开始至40017h每64byte为一条股票数据分配记录,含义如上表18h - 57h所示;
   3)从41000h开始每8KB为一股票数据存储块,每个股票数据存储块共存储256条日线记录,每一条记录的长度为32 byte(含义如上表;上涨家数及下跌家数只对指数有效);
   4)从41000h开始的8KB为第0号数据存储块,以后类推;
   5)系统对每个股票日线数据存储以存储块为单位进行分配。
   6)具体应用实例分析家数据管理程序。
   7) 日期字段的意义为:实际日期 = StrToDate(^1970-01-01^)+(日期字段 div 86400);即“日期字段”除以86400所得数为实际日期距1970年01月01日的天数。
  
  
工具箱  
 
【 · 发布:loveice  2003-07-28 23:57 】   
  胜龙的数据格式
  
   上海日线存储路径为:\slon\data\sh\day,文件扩展名为:.day
   上海周线存储路径为:\slon\data\sh\week,文件扩展名为: .wek
   上海月线存储路径为:\slon\data\sh\month,文件扩展名为: .mnt
   深圳日线存储路径为:\slon\data\sz\day
   深圳周线存储路径为:\slon\data\sz\week
   深圳月线存储路径为:\slon\data\sz\month
   以深发展日线为例:
   0F74:0100 29 32 D0 FE AD F8 FE FF-AD F8 FE FF AD F8 FE FF
   0F74:0110 AD F8 FE FF 77 F0 FF FF-B2 FD FF FF FF FF FF FF
   0F74:0120 FE FF FF FF 94 E3 FB FF-28 32 D0 FE 9F FC FE FF
   0F74:0130 9F FC FE FF 9F FC FE FF-9F FC FE FF 7D FA FF FF
   0F74:0140 2B FF FF FF FF FF FF FF-FE FF FF FF 94 E3 FB FF
   每一条记录的长度为40字节:
   1-4字节为日期(如19910102)转换为整数的反码
   5-8字节为开盘价*1000 的反码
   9-12字节为最高价*1000 的反码
   13-16字节为最低价*1000 的反码
   17-20字节为收盘价*1000 的反码
   21-24字节为成交量(手) 的反码
   25-28字节为成交金额(万元)的反码
   29-36字节未使用
   37-40字节为除权价*1000 的反码
   另:周线,月线格式与日线格式一致.
   下面是我用C语言编的一个显示深发展日线的小程序,运行时要将
   000001.day拷到当前目录.
   #include
   #include
   #include
   typedef struct
   {
   unsigned long date;
   unsigned long open;
   unsigned long low;
   unsigned long high;
   unsigned long close;
   unsigned long travl;
   unsigned long traca;
   char unuse[12];
   } RECORD;
   RECORD reco;
   int readrec(FILE *);
   void main()
   {
   FILE *fp;
   if((fp = fopen("000001.day","rb")) == NULL)
   {
   printf("Error: Can^t open 000001.DAY !\n");
   exit(0);
   }
   readrec(fp);
   fclose(fp);
   if(getch()==0) getch();
   exit(0);
   }
   int readrec(FILE *fp)
   {
   float fn;
   while (! feof(fp))
   {
   fread(&reco,sizeof(RECORD),1,fp);
   printf("%10lu ",~reco.date);
   fn=float(~reco.open)/1000;
   printf("%8.2f ",fn);
   fn=float(~reco.low)/1000;
   printf("%8.2f ",fn);
   fn=float(~reco.high)/1000;
   printf("%8.2f ",fn);
   fn=float(~reco.close)/1000;
   printf("%8.2f ",fn);
   printf("%8lu ",~reco.travl);
   printf("%8lu\n",~reco.traca);
   if(kbhit()) break;
   }
   printf("\n");
   return 0;
   }
工具箱  
 
【 · 发布:loveice  2003-07-28 23:59 】   
  汇金数据格式
  
   上海日线存储路径为:\hjin\exe\lineday\sh,文件扩展名为:.psd
   上海周线存储路径为:\hjin\exe\lineweek\sh,文件扩展名为: .psw
   上海月线存储路径为:\hjin\exe\linemon\sh,文件扩展名为: .psm
   深圳日线存储路径为:\hjin\exe\lineday\sz
   深圳周线存储路径为:\hjin\exe\lineweek\sz
   深圳月线存储路径为:\hjin\exe\linemon\sz
   以深发展日线为例:
   1A76:0100 D6 CD 2F 01 EC D1 86 42-EC D1 86 42 EC D1 86 42
   1A76:0110 EC D1 86 42 7B F9 86 42-14 E6 00 00 20 D7 CD 2F
   1A76:0120 01 CD CC 84 42 CD CC 84-42 CD CC 84 42 CD CC 84
   1A76:0130 42 D5 04 85 42 D0 52 00-00 20 D8 CD 2F 01 54 23
   1A76:0140 84 42 54 23 84 42 54 23-84 42 54 23 84 42 9E E7
   1A76:0150 83 42 A0 41 00 00 20
   每一条记录的长度为29字节:
   1-4字节为日期,D6 CD 2F 01转换为十进制是:19910102
   5-8字节为开盘价
   9-12字节为最高价
   13-16字节为最低价
   17-20字节为收盘价
   21-24字节为均价
   25-28字节为成交量(股)
   其余1字节未使用
   另:周线,月线格式与日线格式一致.
   下面是我用C语言编的一个显示深发展日线的小程序,运行时要将
   sz0001.psd拷到当前目录.
   #include
   #include
   #include
   typedef struct {
   unsigned long date; //日期
   float open; //开盘价
   float high; //最高价
   float low; //最低价
   float close; //收盘价
   float cavl; //均价
   unsigned long travl; //成交量
   char unuse;
   } RECORD;
   RECORD reco;
   int readrec(FILE *);
   void main()
   {
   FILE *fp;
   if((fp = fopen("sz0001.psd","rb")) == NULL) // 打开深发展日线
   { printf("Error: Can^t open SZ0001.PSD !\n");
   exit(0); }
   readrec(fp);
   fclose(fp);
   if(getch()==0) getch();
   exit(0);
   }
   int readrec(FILE *fp)
   {
   while (! feof(fp)) {
   fread(&reco,sizeof(RECORD),1,fp);
   printf("%10lu ",reco.date);
   printf("%8.2f ",reco.open);
   printf("%8.2f ",reco.high);
   printf("%8.2f ",reco.low);
   printf("%8.2f ",reco.close);
   printf("%8.2f ",reco.cavl);
   printf("%8lu\n",reco.travl);
   }
   printf("\n");
   return 0;
   } 
工具箱  
 
【 · 发布:loveice  2003-07-28 23:59 】   
  海融动态“闪电版”日线数据格式
  
   上海日线存储路径为:\hrdyn\shday,文件扩展名为:.day
   深圳日线存储路径为:\hrdyn\szday,文件扩展名为:.day
  
   以深发展日线(0001.day)为例:
  
   0000h: F8 30 31 01 CD CC 88 41-AE 47 89 41 00 00 86 41
   0010h: 71 3D 86 41 24 02 20 00-62 26 87 41 00 00 00 00
   0020h: 00 00 00 00 00 00 00 00-F9 30 31 01 66 66 86 41
   0030h: CB A1 88 41 14 AE 85 41-A4 70 87 41 9C C5 11 00
   0040h: AA C3 86 41 00 00 00 00-00 00 00 00 00 00 00 00
  
  
  
   起止地址 数据内容 数据含义 数据类型
   0000 - 0003 F8 30 31 01 日 期 Integer
   0004 - 0007 CD CC 88 41 开盘价 Single
   0008 - 000B AE 47 89 41 最高价 Single
   000C - 000F 00 00 86 41 最低价 Single
   0010 - 0013 71 3D 86 41 收盘价 Single
   0014 - 0017 24 02 20 00 成交量 Integer
   0018 - 001B 62 26 87 41 均 价 Single
   001C - 001F 00 00 00 00 前收盘 Single
   0020 - 0021 00 00 竞 Word
   0022 - 0023 00 00 量
   Word
   0024 - 0027 00 00 00 00 成交笔数 Integer
  
   注:
   1)起止地址、数据内容为十六进制,数据类型为 Delphi 下之定义。
   2)从0028h开始每40byte为一条股票数据记录,含义如上表0000h - 0027h所示;
  
工具箱  
 
【 · 发布:loveice  2003-07-29 00:00 】   
  

OnDocumentComplete <--页面下载完毕

by:goghu猛料里的:

procedure TfrmIE2.WebDocumentComplete(Sender: TObject; pDisp: IDispatch;
  var URL: OleVariant);
begin
  if not(Web.Busy) then begin
    ShowMessage('下载完毕');
  end;
end;
对于每次连接(不论是鼠标点击还是用Navigate2方法连接),TWebBrowser的流程是这样的:

OnBeforeNavigate2          <--开始链接时会触发此事件
OnNavigateComplete2        <--成功的链接到此网页(以后才会有下面的事件)
OnDownloadBegin            <--开始下载
OnDownloadComplete          <--下载结束
OnDocumentComplete          <--页面下载完毕

对于每个HTML页面,顺序都是如此.如果是Frame或IFrame的文件都会当成HTML页面处理.也就是说如果一个页面中有3个IFrame,那么总共会触发4次BeforeNavigate2事件.

对于每个连接且需要显示出来的二进制文件(如*.gif,*.bmp,*.jpg...)都会触发一个DownloadBegin和DownloadComplete事件.

自动上网抓数据的机器人

by:goghu自动上网抓数据的机器人(转载)

       在大多数情况下,上网冲浪是件令人愉快的事情。但若是数百上千的超链接摆在你面前,而你又不得不一一点击这些链接、进入相应的网页、手工筛选出每页里你需要的信息、最后再将这些信息编进数据库中、....,你将做何感想?如果每天都从事这种繁杂、枯燥的工作会不会让你发疯?
    “自动上网机器人”或许可救你出“苦海”:你可以喝着咖啡、听着音乐、看着“机器人”辛勤地替你工作,那感觉是不是棒极了!
     本文结合实例详尽讨论了用VB实现“上网机器人”的技术细节。我们知道,搜集和下载资料是人们使用互联网的最主要的目的之一,但有些信息资源过于庞大,用手工摘取的方法是困难的或根本就是行不通的。例如,你需要搜集欧洲进口机械设备的公司名录以便给他们发信邀请其参加博览会,在网上找到这些信息并不难,但出于数据安全等方面的考虑,几乎所有提供类似信息的网站都没有提供直接下载数据的功能。
     要想搜集齐想要的数据,唯一可用的方法就是一页一页地浏览每个公司的信息页,摘取其中有用的数据并存入数据库。但当公司总数超过数千时,巨大的工作量会让任何人望而却步!其实,这浩大的工作完全可以由程序来完成,因为这些任务完全是机械的重复性工作。而且,用程序完成比用手工要快得多。本文涉及的技术细节是通用的,即对实例程序稍加修改就可完成任何“自动上网冲浪”任务。

    自动拨号上网、自动处理中途掉线、任务完成后自动挂断,这些都是“上网机器人”的最基本的功能之一。它还能给你带来明显的经济回报:如果你让“机器人”在晚间至凌晨的上网费优惠期内拨号上网去自动冲浪,那真可称得上是典型的“一石三鸟”----你睡觉、它工作、还省钱!有关这方面的细节将在本文的第三部分里讨论。该部分提供了实现上述各功能的若干方法,并比较了这些方法各自的优劣。

    本文的第一和第二部分分别以两个实例讨论了自动浏览的技术细节:在网页上的输入区内自动填入数据以便完成诸如用户登录等的操作、自动更新CheckBox、自动选择下拉式列表(ComboBox)的值、自动点击网页上的按钮、从网页上精确提取有用的数据并存盘、将网页上二维表(Table)内的数据一一提取出来并转换且存储成可直接导入数据库或 Excel的格式,以及控制浏览进程的技巧等等。

第一部分  从网页上精确提取数据

    本部分的实例是:下载沪深两市全部约1100家个股的基本信息及财务数据。若用手工操作,如上图所示,需要在股票代码区内分别输入1100个股票代码,在下拉式列表(ComboBox)中分别选择“个股资料”和“财务数据解读”,算下来约是2200次操作!这样的工作当然是由程序来完成划算得多。况且手工提取数据(先选中、再使用Ctrl+C拷贝)极容易出错(多选或漏选),又很费眼神。

1. 在输入区内自动填入数据

    为使程序能高效地自动浏览,需引入一些最基本的功能,如在输入区内自动填入数据、自动点击按钮等等。虽然用变换 URL地址的方法有时也能完成任务,但往往过于费力,尤其当网页上的输入区较多时更是如此。

    为了在输入区内输入数据,需要先搜索到该对象的名字,然后将该对象的值置为要填入的数据即可。搜索名字的工作可编程完成,亦可用 FrontPage轻松获得。

2. 自动在下拉式列表(ComboBox)中进行选择

    同样地,首先要获得下拉式列表的名字。然后根据下拉式列表的元素总数(length属性)在列表中搜索要设置的值(列表的 Options集合中元素的Text属性),找到后,将该元素设为选中元素(元素的Selected属性)。

3. 自动点击按钮

    对于按钮来讲,可根据其名字访问,亦可根据其值访问。按钮的值就是显示在按钮上的文字。一个按钮可能没有名字,但一定有值。本例的程序就是根据值来访问按钮。执行按钮的 Click方法就相当于点击了该按钮。

 

 

    图二中红色箭头所指即为程序自动填入输入框、自动在ComboBox中选择以及自动点击按钮的情况。

4. 精确提取数据

    仅将有用的数据存储下来才是有意义的。必须研究网页,找出有效数据所在的Tag区(可用文本编辑器或 FrontPage),然后用该对象的innerText属性获得最终的文本。本例中要存储的数据如下图所示,其所用的Tag为“PRE”。

 

    下面给出的是实例程序的完整代码:

' 程序一:从网页上精确提取数据
'
' 为运行本程序,应在“菜单->工程->部件”中添加“Microsoft Internet Controls”
' 并在“菜单->工程->引用”中添加“Microsoft HTML Object Library”
'
' 为了简洁,程序仅下载九只个股的基本信息
Option Explicit
Private Const Form_ID = 1
Dim Code(9) As String
Dim Current As Long
Private Sub Form_Load()
  Form1.MousePointer = 11
  ' 以下是个股代码
  ' 为了程序简洁,这里仅使用九只代码。
  ' 而在真实环境中,应从数据文件中读入全部个股代码。
  Code(0) = "600001": Code(1) = "600002": Code(2) = "600003"
  Code(3) = "600005": Code(4) = "600006": Code(5) = "600007"
  Code(6) = "600008": Code(7) = "600009": Code(8) = "600010"
  Current = 0
  WebBrowser1.Navigate "www.stockstar.com.cn"   ' 起始网址
End Sub

Private Sub WebBrowser1_DocumentComplete(ByValpDisp As Object, URL As Variant)
  Dim i, k
  Text2 = WebBrowser1.LocationURL    ' 显示当前网址
  ' 判断当前网页是否全部调入完毕
  If Not (pDisp Is WebBrowser1.Object) Then Exit Sub
  On Error Resume Next
  Select Case Text2
  Case "http://www.stockstar.com.cn/home.htm"  ' 当进入主页面时执行以下程序
   For i = 0 To WebBrowser1.Document.Forms(Form_ID).length - 1
      ' 找到代码输入框后填入个股代码
      If WebBrowser1.Document.Forms(Form_ID)(i).Name = "code" Then _
        WebBrowser1.Document.Forms(Form_ID)(i).Value = Code(Current)
      ' 在下拉式列表中进行选择
      If WebBrowser1.Document.Forms(Form_ID)(i).Name = "target" Then
        For k = 0 To WebBrowser1.Document.Forms(Form_ID)(i).length - 1
           If WebBrowser1.Document.Forms(Form_ID)(i).Options(k).Text _
                     = "个股资料" Then
             WebBrowser1.Document.Forms(Form_ID)(i).Options(k).Selected = True
             Exit For
           End If
        Next k
      End If
      ' 点击按钮
      If WebBrowser1.Document.Forms(Form_ID)(i).Value = " 查询 " Then _
        WebBrowser1.Document.Forms(Form_ID)(i).Click
   Next
  Case Else   ' 当进入数据页面时执行以下程序
   For i = 0 To WebBrowser1.Document.All.length - 1
      If WebBrowser1.Document.All(i).tagName = "PRE" Then
        ' 精确提取数据
        Text1 = Text1 + Code(Current) + vbCrLf + _
                WebBrowser1.Document.All(i).innerText + vbCrLf
        Exit For
      End If
   Next
   ' 数据存盘
   Open "C:\Data2.Txt" For Append As #1
   Print #1, Text1: Text1 = "": Close #1
   ' 换下一只股票
   Current = Current + 1
   If Current >= 9 Then
     ' 上网任务完成后,应在此调用自动挂断过程。
     Form1.MousePointer = 0: MsgBox "Finished!": End
   End If
   ' 回退到主页面,查询下一只股票的信息
   WebBrowser1.GoBack
  End Select
End Sub

第二部分  将网页上的二维表导入数据库

    在上一部分中,我们讨论了让程序自动在网上浏览并将所需的数据准确、快速地存储下来的方法。现在,我们将迎接更大的挑战:将网页上以表格形式存在的二维数据提取出来,并存成可直接导入数据库的“Microsoft Excel 逗号分隔值文件”(即.csv文件)。 

    用手工在网页上直接提取类似上图中所示的表格数据是非常困难的。如果这样的表格有数十页甚至上百页之多,手工提取工作将是不可想象的,而且非常容易出错。

    本部分的实例是:将沪深两市全部约1100家个股的财务评分表数据(共54页,每页20家,如上图所示)快速、准确地转换成“.csv”文件。

1. 自动设置CheckBox的值

    由于只有注册用户才能访问上述财务评分表,因此实例程序首先演示了自动注册的功能。下图显示的是注册前以及自动注册后的画面。

    我们在上一部分中已讨论了自动填写输入区以及自动点击按钮等的方法。对于自动设置CheckBox值,其方法完全类似:首先要搜索到该CheckBox的名字,然后将该对象的Checked属性置为True或False即可。

2. 将网页上的二维表导入数据库

   首先定义一个IHTMLElementCollection对象用于收集网页上所有的 Table,然后用getElementsByTagName方法执行收集工作:

Dim Tables AsIHTMLElementCollection
   Set Tables = WebBrowser1.Document.getElementsByTagName("Table")

 

 

    一个网页上往往有多个 Table。我们用HTMLTable对象来处理每个Table:

Dim Table1 AsHTMLTable
    For Each Table1 In Tables
    Next

    HTMLTable对象的innerText属性记录了整个 Table的全部信息,包括字段名。因此我们可以根据字段名判断出哪个 Table是我们需要的。

    为了逐行逐列地提取数据,我们还需要HTMLTableRow对象和HTMLTableCell对象:

Dim Row AsHTMLTableRow, Cell As HTMLTableCell
    For i = 1 To Table1.rows.length - 1      ' 逐行处理
       Set Row = Table1.rows(i)
       j = 0
       For Each Cell In Row.cells      ' 逐列处理
          ' Row.cells(j).innerText即为当前行及当前列上的单元数据
          Text1 = Text1 + Trim(Row.cells(j).innerText) + ","
          j = j + 1
       Next
       ' 一行处理完毕后,去除行尾的逗号并加上回车
       Text1 = Left(Text1, Len(Text1) - 1) + vbCrLf
    Next

    至此,当前网页上的二维表已转换成“.csv”格式。

3. 自动浏览时的页面控制技巧

    我们从上个例子中就已经清晰地看到,自动浏览程序的主体是WebBrowser控件的DocumentComplete事件。只有在当前页面已被完全调入后,我们才能开始对当前页面进行数据处理,然后再根据当前在哪个页面来决定下一步的浏览方向。

    需要指出的是,DocumentComplete事件的发生并不一定意味着当前页面已被全部调入。如果页面上没有其它子框架(frames),发生DocumentComplete事件即表明当前页面(即主框架)已完成调入;若页面上有多个框架,则每个框架完成时都会发生DocumentComplete事件;当所有子框架都完成后,主框架最后产生一次DocumentComplete事件。为了判断出这最后一次DocumentComplete事件,需要比较每次事件发生时的对象(pDisp)是否是WebBrowser控件对象本身:

Private Sub WebBrowser1_DocumentComplete(ByValpDisp As Object, _
                                             URL As Variant)
      If (pDisp Is WebBrowser1.Object) Then
        Debug.Print "Document is finished loading."
      End If
    End Sub

   下面是实例程序的完整代码(运行该程序可得到完整的1061行“.csv”格式的数据,分别代表1061个上市公司的财务信息。该文件可直接导入Access数据库或 Excel中。):

' 程序二:将网页上的二维表导入数据库
'
' 为运行本程序,应在“菜单->工程->部件”中添加“Microsoft Internet Controls”
' 并在“菜单->工程->引用”中添加“Microsoft HTML Object Library”
'
Option Explicit
Dim Page As Long
Private Sub Form_Load()
Form1.MousePointer = 11
WebBrowser1.Navigate "www.stockstar.com.cn" ' 起始网址
End Sub
Private Sub WebBrowser1_DocumentComplete(ByVal pDisp As Object, URL As Variant)
Dim Table1 As HTMLTable, Tables As IHTMLElementCollection
Dim Row As HTMLTableRow, Cell As HTMLTableCell
Dim i, j, tmp
Text2 = WebBrowser1.LocationURL ' 显示当前网址
' 判断当前网页是否全部调入完毕
If Not (pDisp Is WebBrowser1.Object) Then Exit Sub
On Error Resume Next
Select Case Text2
Case "http://www.stockstar.com.cn/home.htm" ' 当进入主页面时执行以下程序
' 用户注册登录
For i = 0 To WebBrowser1.Document.Forms(0).length - 1
' 找到 CheckBox 后,将其值改为 False,以防止用户名及密码被存储
If WebBrowser1.Document.Forms(0)(i).Name = "checkSavePW" Then _
WebBrowser1.Document.Forms(0)(i).Checked = False
If WebBrowser1.Document.Forms(0)(i).Name = "userId" Then _
WebBrowser1.Document.Forms(0)(i).Value = "kompass_china"
If WebBrowser1.Document.Forms(0)(i).Name = "passwd" Then _
WebBrowser1.Document.Forms(0)(i).Value = "kompass1"
' 此处是按名字访问按钮(上例中是按值访问按钮)
If WebBrowser1.Document.Forms(0)(i).Name = "continue" Then _
WebBrowser1.Document.Forms(0)(i).Click
Next
Case "http://my.stockstar.com/scripts/mystockstar.dll?login"
' 当用户登录完成后,准备打开表格的第一页
WebBrowser1.Navigate "http://finance.stockstar.com/scripts/finance.dll?" + _
"showstkdfpm&begin=0&ret=1&index=2&concode=01"
Page = 1
Case Else ' 当进入数据页面(表格的第一页至最后一页)时执行以下程序
Set Tables = WebBrowser1.Document.getElementsByTagName("Table")
For Each Table1 In Tables
If Left(Table1.innerText, 2) = "名次" Then ' 找到需要的Table
' 将表格转换成“.csv”格式
For i = 1 To Table1.rows.length - 1
Set Row = Table1.rows(i)
j = 0
For Each Cell In Row.cells
Text1 = Text1 + Trim(Row.cells(j).innerText) + ","
j = j + 1
Next
Text1 = Left(Text1, Len(Text1) - 1) + vbCrLf
Next
' 数据存盘
Open "C:\Data.csv" For Append As #1
Print #1, Left(Text1, Len(Text1) - 2): Text1 = "": Close #1
Exit For
End If
Next
' 准备打开下一页
Page = Page + 1
tmp = "http://finance.stockstar.com/scripts/finance.dll?showstkdfpm&ret=" + _
Trim(Str(Page)) + "&index=2&concode=01"
If Page <= 54 Then ' 判断是否浏览结束
WebBrowser1.Navigate tmp
Else
' 上网任务完成后,应在此调用自动挂断过程。
Form1.MousePointer = 0
MsgBox "Finished!!": End
End If
End Select
End Sub

   以下给出的是上述程序所存数据文件的片段:

1,乐凯胶片,600135,材料,81.493,18.445,23.165,8.850,20.717,10.315
2,歌华有线,600037,传播娱乐,80.553,13.009,22.256,12.141,20.304,12.844
3,外运发展,600270,仓储运输,80.326,17.331,23.005,8.829,19.900,11.261
4,东方钽业,0962,有色金属,80.312,15.160,22.483,11.648,21.290,9.730
5,双汇发展,0895,食品,79.772,15.428,20.673,11.508,20.235,11.930
6,四川美丰,0731,化肥,79.361,15.795,23.235,11.323,16.921,12.088
... ... ...
1059,轮胎橡胶,600623,车类,7.167,8.265,10.973,-34.411,14.120,8.219
1060,PT吉轻工,0546,日用轻工产品,-11.895,5.740,-49.149,7.999,14.136,9.379
1061,广船国际,600685,机械仪器,-57.452,9.824,-1.528,-89.648,14.366,9.533

第三部分  自动拨号、自动挂断以及自动处理中途掉线

    一个出色的“自动上网机器人”程序应能按照既定的时间准时开始拨号、并当所需任务已完成后立即挂断。而且仅做到这些还不够,它还应在发出拨号指令后跟踪拨号操作是否真的成功、上网速度如何、是否需要挂断后重新拨号、自动浏览过程中是否出现掉线、以及最终的挂断操作是否真的成功完成,等等。

    因此,“机器人”程序应定时检查在线状况,以保证浏览时一定在在线状态、浏览完毕后一定不在在线状态。同时还要检查浏览进度,当浏览速度过慢时尝试挂断后重新拨号。

    本部分讨论了实现“自动拨号”、“检查在线状况”、以及“自动挂断”这三个功能的若干方法,比较了诸方法各自的优劣,并总结给出了使用建议。本部分的示例程序将这三个功能的诸方法集成在一起,以便于大家对比使用(见下图)。

1. 自动拨号

    方法1A:使用rnaui.dll

    rnaui.dll是微软的“拨号网络用户接口”程序集,一般在“\Windows\System”目录下。其中的RnaDial程序用于启动拨号。该程序可在命令行执行(在“开始”->“运行”中键入):

    rundll32.exe rnaui.dll,RnaDial <拨号网络连接名>

    其中的“RnaDial”和“<拨号网络连接名>”是区分大小写的。

    但由于上述命令仅启动拨号窗口而未立即开始拨号,因此在程序中使用时还应再

送出模拟“回车”的按键:

ret = Shell("rundll32.exe rnaui.dll,RnaDial " + 连接名, 1)
    SendKeys "{enter}", True

    方法1B:使用wininet.dll

    wininet.dll是微软的Internet扩充函数集,一般在“\Windows\System”目录下。其中的InternetAutodial、InternetAutodialHangup和InternetGetConnectedState三个函数分别可完成自动拨号、自动挂断和判断在线状态等任务。InternetAutodial的定义为:

Private Declare Function InternetAutodial Lib "wininet.dll" _
           (ByValdwFlags As Long, ByValdwReserved As Long) As Long

        若将第一个参数(dwFlags)的值设为2,该函数无需用户干预就可自动拨号。但使用该函数有一个前提:即必须将“Internet 属性”->“连接”设成“始终拨打默认连接”(见下图)。

    用InternetAutodial函数自动拨号的情况可参见下图。从图中可以看出,该方法可自动重试多次。具体的重试次数在默认连接的“设置”->“高级”中定义:

 

    方法1C:使用RAS

    RAS 是微软的远程访问服务(Remote Access Service)API集合。其中的 API函数RasDial可完成拨号任务。但由于该函数在使用上略显复杂而不太常用,故示例程序中未采纳。

    自动拨号方法小结:rnaui方法使用起来最简单,又由于它不一定非要使用默认连接,因此也最灵活。但这种灵活恰恰又给它带来了弱点,即如果不提供连接名,该方法不会自动调用默认连接。此外,这种方法还有两个最大的缺点:一是仅拨号一次,若出现占线或没有响应等情况时不会自动重试;二是调用程序不容易得到拨号是否成功的返回值。相比之下,wininet方法虽仅能拨打默认连接(无默认连接时,使用第一个连接),但它可多次试拨,并且InternetAutodial函数等待拨号成功或所有试拨结束以便给调用程序返回拨号是否成功的值,因此,在“自动上网机器人”的环境中wininet方法是最适宜的。

2. 检查在线状况

    方法2A:wininet方法

    若InternetGetConnectedState函数返回True,则为在线状态。该方法最大的缺点是:若当前连接不是用wininet方法建立的,则返回值可能不准确。

    方法2B:查找窗口法

    拨号连接成功后,下图所示的窗口一定存在(不管它是最小化在任务栏的最右端,或是开启为下图所示的状态):

      用FindWindow API函数找到该窗口即意味着当前在线。此外,查找窗口法的另一个用处是查找“重新连接”窗口:当中途掉线时,操作系统往往会询问你是否重新连接,找到该窗口并发出模拟“回车”按键即可实现再拨号。

    查找窗口法的缺点是:由于找窗口时需要提供窗口标题,因此即使使用的是默认连接也必须事先知道默认连接名。

    方法2C:RAS 方法

    先用RasEnumConnections函数返回整个RAS集合,再用RasGetConnectStatus函数判断第一个 RAS连接的状态。RAS方法的最大优点是:不管当前连接是否是用wininet建立的,RAS 方法均可对在线状态做出正确判断。

    方法2D:注册表法

    在线时,注册表的“\HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\RemoteAccess”处有键值“Remote Connection”,且其值不为零;不在线时,该处无“Remote Connection”键值(当本次系统启动后从未拨号成功时),或者其值为零(表明曾拨号成功,但现在已断掉)。

  检查在线状况之方法小结:由于wininet方法的局限性,一般我们应避免使用之;查找窗口法是可靠的,只是要知道连接名;因此我们推荐使用RAS 方法和注册表法。

3. 自动挂断

    方法3A:wininet法

  使用InternetAutodialHangup函数。同样地,若当前连接不是用wininet方法建立的,则返回值可能不准确(即不能成功挂断)。

    方法3B:窗口查找法

  找到图九所示的窗口,然后用ShowWindow API函数使之成为当前窗口,最后发出模拟+C的按键操作(从图九中可以看出,+C是“断开连接”按键的快捷方式)。

    方法3C:RAS 法

  用RasHangUp函数执行挂断。不管用何种方法建立的连接,RAS 法均能可靠地完成任务。

  自动挂断方法小结:相比之下,窗口查找法和RAS 法是可以信赖的。

4. 本部分总结

  综上所述,对于“自动拨号”、“检查在线状况”、以及“自动挂断”的各种方法,我们推荐“1A-2C-3C”组合。当然各方法可综合使用(如加入2D、3B等),以确保万无一失。在具体编程时还应注意:拨号后判断结果,如不成功应重新拨号;任务进行过程中定时检查在线状态,出现掉线后应及时处理;最后的挂断操作后应再查在线状态,以确保挂断成功。

    下面是实例程序的完整代码。源代码中的全局定义已按照wininet、RAS、注册表等进行分类,各具体方法也均按序排列,以便于大家挑选使用。该程序的执行情况在本部分的开始处已给出(图六)。

' 程序三:自动拨号、自动挂断以及自动处理中途掉线
'
Option Explicit
' 有关 wininet 的全局定义
Private Const INTERNET_AUTODIAL_FORCE_UNATTENDED = 2
Private Const INTERNET_CONNECTION_MODEM = 1
Private Declare Function InternetAutodial Lib "wininet.dll" _
(ByVal dwFlags As Long, ByVal dwReserved As Long) As Long
Private Declare Function InternetAutodialHangup Lib _
"wininet.dll" (ByVal dwReserved As Long) As Long
Private Declare Function InternetGetConnectedState Lib _
"wininet.dll" (ByRef lpdwFlags As Long, ByVal _
dwReserved As Long) As Long
' 有关“窗口查找”的全局定义
Private Declare Function FindWindow Lib "user32" _
Alias "FindWindowA" (ByVal lpClassName As String, _
ByVal lpWindowName As String) As Long
Private Declare Function ShowWindow Lib "user32" _
(ByVal hwnd As Long, ByVal nCmdShow As Long) As Long
Private Const SW_SHOW = 5
' 有关 RAS 的全局定义
Private Const RASCS_DONE = &H2000&
Private Const RAS_MaxEntryName = 256
Private Const RAS_MaxDeviceType = 16
Private Const RAS_MaxDeviceName = 128
Private Type RASCONN
dwSize As Long
hRasConn As Long
szEntryName(RAS_MaxEntryName) As Byte
szDeviceType(RAS_MaxDeviceType) As Byte
szDeviceName(RAS_MaxDeviceName) As Byte
End Type
Private Type RASCONNSTATUS
dwSize As Long
RasConnState As Long
dwError As Long
szDeviceType(RAS_MaxDeviceType) As Byte
szDeviceName(RAS_MaxDeviceName) As Byte
End Type
Private Ras_Buf(255) As RASCONN
Private Ras_Status As RASCONNSTATUS
Private lpcb As Long
Private lpcConnections As Long
Private Declare Function RasEnumConnections Lib _
"rasapi32.dll" Alias "RasEnumConnectionsA" (lprasconn _
As Any, lpcb As Long, lpcConnections As Long) As Long
Private Declare Function RasGetConnectStatus Lib _
"rasapi32.dll" Alias "RasGetConnectStatusA" (ByVal _
hRasConn As Long, lpRASCONNSTATUS As Any) As Long
Private Declare Function RasHangUp Lib "rasapi32.dll" _
Alias "RasHangUpA" (ByVal hRasConn As Long) As Long
' 有关“注册表”的全局定义
Private Const HKEY_LOCAL_MACHINE = &H80000002
Private Declare Function RegOpenKey Lib "advapi32.dll" Alias _
"RegOpenKeyA" (ByVal hKey As Long, ByVal lpSubKey As _
String, phkResult As Long) As Long
Private Declare Function RegQueryValueEx Lib "advapi32.dll" _
Alias "RegQueryValueExA" (ByVal hKey As Long, ByVal _
lpValueName As String, ByVal lpReserved As Long, lpType _
As Long, lpData As Any, lpcbData As Long) As Long
Private Declare Function RegCloseKey Lib "advapi32.dll" _
(ByVal hKey As Long) As Long
Dim ret As Long
'自动拨号
Private Sub wininet拨号测试_Click()
If InternetAutodial(INTERNET_AUTODIAL_FORCE_UNATTENDED, 0) _
Then MsgBox "已连接(wininet法)"
End Sub
Private Sub rnaui拨号测试_Click()
ret = Shell("rundll32.exe rnaui.dll,RnaDial " + Text1, 1): DoEvents
SendKeys "{enter}", True: DoEvents
End Sub
'检查是否断线
Private Sub wininet方法_Click() ' wininet法检查是否断线
If InternetGetConnectedState(INTERNET_CONNECTION_MODEM, 0) Then
MsgBox "在线."
Else
MsgBox "当前未连接。"
End If
End Sub
Private Sub 查找窗口法_Click() ' 查找窗口法检查是否断线
ret = FindWindow("#32770", "重新连接")
If ret <> 0 Then
Call ShowWindow(ret, SW_SHOW)
SendKeys "{enter}", True: Exit Sub
End If
ret = FindWindow("#32770", "连接到 The95963")
If ret <> 0 Then
MsgBox "在线."
Else
MsgBox "当前未连接。"
End If
End Sub
Private Sub RAS方法_Click() ' RAS方法检查是否断线
Ras_Buf(0).dwSize = Len(Ras_Buf(0)) + 1
lpcb = 256 * Ras_Buf(0).dwSize
ret = RasEnumConnections(Ras_Buf(0), lpcb, lpcConnections)
If ret Then
MsgBox "出错!": Exit Sub
End If
Ras_Status.dwSize = Len(Ras_Status) + 2
ret = RasGetConnectStatus(Ras_Buf(0).hRasConn, Ras_Status)
If ret = 0 And Ras_Status.RasConnState = RASCS_DONE Then
MsgBox "在线."
Else
MsgBox "当前未连接。"
End If
End Sub
Private Sub 注册表法_Click() ' 注册表法检查是否断线
Dim SubKey As String, ValueName As String
Dim Data As Long, Result As Long
SubKey = "System\CurrentControlSet\Services\RemoteAccess"
ret = RegOpenKey(HKEY_LOCAL_MACHINE, SubKey, Result)
If ret = 0& Then
ValueName = "Remote Connection"
ret = RegQueryValueEx(Result, ValueName, 0&, 0&, ByVal Data, 0&)
ret = RegQueryValueEx(Result, ValueName, 0&, 0&, Data, Len(Data))
If ret = 0& And Data <> 0 Then
MsgBox "在线!"
Else
MsgBox "当前未连接。"
End If
RegCloseKey (Result)
End If
End Sub
'自动挂断
Private Sub wininet法_Click() ' wininet法自动挂断
If InternetAutodialHangup(0) Then MsgBox "已挂断(wininet法)"
End Sub
Private Sub 窗口查找法_Click() ' 窗口查找法自动挂断
ret = FindWindow("#32770", "连接到 The95963")
If ret <> 0 Then
Call ShowWindow(ret, SW_SHOW)
SendKeys "%c", True
MsgBox "已挂断(窗口查找法)"
End If
End Sub
Private Sub RAS法_Click() ' RAS法自动挂断
Ras_Buf(0).dwSize = Len(Ras_Buf(0)) + 1
lpcb = 256 * Ras_Buf(0).dwSize
ret = RasEnumConnections(Ras_Buf(0), lpcb, lpcConnections)
If ret Then
MsgBox "出错!": Exit Sub
End If
Ras_Status.dwSize = Len(Ras_Status) + 2
ret = RasGetConnectStatus(Ras_Buf(0).hRasConn, Ras_Status)
If ret = 0 And Ras_Status.RasConnState = RASCS_DONE Then
If RasHangUp(Ras_Buf(0).hRasConn) = 0 Then _
MsgBox "已挂断(RAS法)"
End If
End Sub


Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=9939

有什么好的办法来判断网页全部下载完成呢

by:goghu

问者:sztaotao(淘淘) 信誉:96 级别:user1 日期:2006-8-13 18:07:39

我要实现的功能是循环内多次打开不同的网页,当前网页完成打开后才能打开下一个网页,这个功能不知道如何去实现?我试过用DocumentComplete事件来判断,但这个事件还是不太准,因为有些网页打开时会触发多次,有什么好的办法来判断网页全部下载完成呢?

回复:



答者:NiYuLong(NiYuLong) 信誉:100 级别:user1 日期:2006-8-14 9:22:21 id:36122500

While WebBrowser1.Busy = TrueDoEventsWendWhile WebBrowser1.Document.ReadyState <> "complete"DoEventsWend一般情况下,用这两段就可以了!

答者:sztaotao(淘淘) 信誉:96 级别:user1 日期:2006-8-14 23:02:38 id:36141846

这样写仍然是不行,只是打开了第一个和最后一个网页,中间的网页估计是很快跳过去了。估计是打开的网页多次触发了DocumentComplete事件有影响。

答者:chen1bin2(天涯浪子) 信誉:100 级别:user3 日期:2006-8-25 10:05:32 id:36351486

在complete事件中打开别的网页

答者:aspower_(敬个礼 握个手 大家都素好朋友!) 信誉:100 级别:user1 日期:2006-8-25 10:14:19 id:36351805

在complete事件以内容判断

答者:klever(klever) 信誉:96 级别:user3 日期:2006-8-26 9:38:59 id:36372696

在complete事件,如果有脚本或框架,都会出发这个事件,可URL参数是不同的,子框架完成时才出发主框架所以你只要判断if web.locationURL=URL就行了web.locationURL是网页的地址,和网页是一样的参数相等说明触发的是主框架

答者:bykai() 信誉:99 级别:user1 日期:2006-8-30 10:53:39 id:36444809

我知道,我刚完成你那程序,有问题可以问我 Private Sub WebBrowser1_StatusTextChange(ByVal Text As String)    LblMsg.Caption = Text    zhuangtai = TextEnd Sub代码写在WebBrowser1_DownloadComplete函数里面如果下载完毕Text 就会显示"完毕"还有一个问题,有些网页打开会时间很长,你还要做判断,比方说,在21秒内下载未完毕则强制转到下一页面

答者:hpygzhx520() 信誉:97 级别:user4 日期:2006-9-2 12:43:56 id:36511325

WebBrowser1.Busy=false

自动注册提交

by:goghu  前些天在网上看到有人需要邮箱自动注册的程序,于是自己也写了一个,在查资料的过程中我看到一些网友写的类似文章,有一些是基于网络协议,需要了解session,cookie这些东西,对于一个新手来说很繁琐,等到把这些东西搞懂,热情也消耗殆尽。VB的优点就在于可以让那些对于计算机底层不是很了解的人迅速实现自己的程序设计,我找到了一种比较简单的办法,要求对HTML标记语言有所了解即可,现在把自己的经验写出来于各位网友共享,该方法也许不值一提,也许对您有所帮助。

我的办法就是利用控件WebBrowser,我想很多人对它都很熟悉,在新建一个工程之后您要做的是添加两个控件,一个是WebBrowser,另一个是Scriptlet,这两个控件配合使用,就可以完成这个任务了,Scriptlet中的IHTMLDocument2对象可以用来获得WebBrowser控件中的HTML文档。这两个控件的名字在组件对话框里分别叫Microsoft HTML Object Library和Microsoft Internet Controls。

这两个控件添加完成之后,你还需要知道WebBrowser的一个事件DocumentComplete,这个事件在整个网页下载完成之后触发,也就是说在页面完成之后这个事件即被执行,有了这些就可以顺利的实现注册了。

下面以eyou网站的免费邮箱注册为例来实现我的程序设计,新建标准工程后向Form中添加一个WebBrowser控件。所有代码如下:

Dim ii As Integer



Private Sub Form_Load()

WebBrowser1.Navigate "http://freemail.eyou.com/signup.html?bgp=%CE%D2%BD%D3%CA%DC&bgp_enable=on"

End Sub



Private Sub WebBrowser1_DocumentComplete(ByVal pDisp As Object, URL As Variant)

Dim doc As IHTMLDocument2

Set doc = WebBrowser1.Document

Dim tmp As String


If InStr(doc.body.innerText, "寻找一个新的用户名") > 0 Then

tmp = "sdfsdf23" + Trim(Str$(ii))

doc.All.Item("uid").focus

SendKeys tmp

SendKeys "{enter}"

End If

If InStr(doc.body.innerText, "输入您的个人资料") > 0 Then

doc.All.Item("Password").Value = "123456"

doc.All.Item("Confirm").Value = "123456"

doc.All.Item("FirstName").Value = "tomcant"

doc.All.Item("question").Value = "what is your name"

doc.All.Item("answer").Value = "my name is ddd"

doc.All.Item("year").Value = "80"

doc.All.Item("month").Value = "3"

doc.All.Item("day").Value = "18"

doc.All.Item("day").focus

SendKeys "{enter}"

End If

If InStr(doc.body.innerText, "申请邮箱成功") > 0 Then

ii = ii + 1

WebBrowser1.Navigate "http://freemail.eyou.com/signup.html?bgp=%CE%D2%BD%D3%CA%DC&bgp_enable=on"

End If
End Sub


Eyou的免费邮箱注册入口地址为http://freemail.eyou.com/signup.html?bgp=%CE%D2%BD%D3%CA%DC&bgp_enable=on,所以要在Form_load事件中使用WebBrowser控件的Navigate方法。

在eyou的注册入口页面完成之后WebBrowser1_DocumentComplete即被执行,在这个函数中主要有三个条件语句,在三个条件语句之前有如下三句:

Dim doc As IHTMLDocument2

Set doc = WebBrowser1.Document

Dim tmp As String

doc定义为IHTMLDocument2对象用以取得WebBrowser1的文档,tmp字符串是循环注册中的用户名,在程序刚开始定义了ii这个integer变量,在每次注册完成之后ii加1附于tmp之后用以改变用户名。

第一个条件语句如下:
If InStr(doc.body.innerText, "寻找一个新的用户名") > 0 Then

tmp = "sdfsdf23" + Trim(Str$(ii))

doc.All.Item("uid").focus

SendKeys tmp

SendKeys "{enter}"

End If

首先判断是否是注册入口页面,通过InStr(doc.body.innerText, "寻找一个新的用户名") > 0语句实现,doc.body.innerText即取得了该页面中的所有文字。如果是则构造一个用户名。doc.All.Item("uid").focus使用户名文本框取得焦点,其中uid是该文本框的ID,这个ID的取得是通过查看HTML源代码得到的,所以要求对HTML标记语言有所了解。使用户名文本框取得焦点之后通过SendKeys函数模拟键盘向文本框发送tmp字符串,这样用户名即填写完成,之后发送回车键提交表单。关于SendKeys函数的使用大家可查阅MSDN帮助。

第二个条件语句首先判断改页面是否是个人资料填写页面,然后填写个人资料,其方法同填写用户名一致,取得个文本框的ID后填写其值,最后提交表单。

最后一个条件语句判断邮箱注册成功后将ii加一,然后将页面重新定位到注册入口页面,至此一个循环完成。

以上代码即实现了自动注册提交。