注册 登录
编程论坛 VFP论坛

求助:如何将网上的表格内容下载下来?谢谢!

closeall 发布于 2021-05-05 14:50, 3252 次点击
网址:http://data.,这个版面上的‘分红送配详细列表’的数据想要下载下来,其他的不用了,如何写代码?我一点不会,求大家帮帮忙吧!谢谢!
29 回复
#2
林月儿2021-05-05 16:19
按f12,打开console,输入$(".dataview-body tbody").text()回车
#3
closeall2021-05-05 17:00
回复 2楼 林月儿
我是想在vfp form中,能做个循环,自动下载所有股票的这个信息,不只是一只股票。但我不会这种从网上下的命令,比如在prg中也行。想写各PRG,下来后存到一个表之中。谢谢回复
#4
sdta2021-05-05 17:59
JSON中的个别字段的数据类型与表中的数据类型不符合,转换稍微麻烦些。
#5
sdta2021-05-05 19:08
是这个结果?
只有本站会员才能查看附件,请 登录
#6
sdta2021-05-05 19:31
程序代码:
* VFP9 代码
CREATE CURSOR 分红送配 (报告期 C(10), 业绩披露日期 C(10), 送转总比例 N(6,1), 送股比例 N(6,1), 转股比例 N(6,1), 现金分红比例 C(50), 股息率_% N(6, 2),;
    每股收益_元 N(6,2), 每股净资产_元 N(6,2), 每股公股金_元 N(6,2), 每股未分配利润_元 N(6,2), 净利润同比增长_% N(6, 2), 总股本_亿 N(6,1),;
    预案公告日 C(10), 股权登记日 C(10), 除权除息日 C(12), 方案进度 C(20), 最新公告日期 C(10))
oHTTP=NEWOBJECT("MSXML2.XMLHTTP")
TEXT TO cUrl NOSHOW TEXTMERGE
http://dcfm./EM_MutiSvcExpandInterface/api/js/get?callback=jQuery112305016151387317396_1620197753903&st=ReportingPeriod&sr=-1&ps=50&p=1&type=DCSOBS&js=%7B%22data%22%3A(x)%2C%22pages%22%3A(tp)%7D&cmd=000001&token=894050c76af8597a853f5b408b759f5d
ENDTEXT
lcFld = "ReportingPeriod,ResultsbyDate,SZZBL,SGBL,ZGBL,AllocationPlan,GXL,EarningsPerShare,NetAssetsPerShare,MGGJJ,MGWFPLY,JLYTBZZ,TotalEquity,YAGGR,GQDJR,CQCXR,ProjectProgress,NOTICEDATE"
ALINES(laFld, lcFld, ",")
oHTTP.Open("GET", cUrl, .F.)
oHTTP.Send()
lcText = STRCONV(STRCONV(oHTTP.ResponseBody, 11),2)
lcText = STREXTRACT(lcText, '[{"', '}]')
FOR lnJ = 1 TO ALINES(laText, lcText, '},{"')
    APPEND BLANK
    FOR lnK = 1 TO ALINES(laStr, laText[lnJ], '":', ',"') STEP 2
        IF ASCAN(laFld, laStr[lnK]) = 0
            LOOP
        ENDIF
        DO CASE
            CASE laStr[lnK] == "ReportingPeriod"
                REPLACE 报告期 WITH &laStr[lnK + 1]
            CASE laStr[lnK] == "ResultsbyDate"
                REPLACE 业绩披露日期 WITH &laStr[lnK + 1]
            CASE laStr[lnK] == "SGBL"
                REPLACE 送股比例 WITH IIF(VARTYPE(&laStr[lnK + 1]) == "C", 0, &laStr[lnK + 1])
            CASE laStr[lnK] == "ZGBL"
                REPLACE 转股比例 WITH IIF(VARTYPE(&laStr[lnK + 1]) == "C", 0, &laStr[lnK + 1]) , 送转总比例 WITH 送股比例 + 转股比例
            CASE laStr[lnK] == "AllocationPlan"
                REPLACE 现金分红比例 WITH &laStr[lnK + 1]
            CASE laStr[lnK] == "GXL"
                REPLACE 股息率_% WITH IIF(VARTYPE(&laStr[lnK + 1]) == "C", 0, &laStr[lnK + 1] * 100)
            CASE laStr[lnK] == "EarningsPerShare"
                REPLACE 每股收益_元 WITH IIF(VARTYPE(&laStr[lnK + 1]) == "C", 0, &laStr[lnK + 1])
            CASE laStr[lnK] == "NetAssetsPerShare"
                REPLACE 每股净资产_元 WITH IIF(VARTYPE(&laStr[lnK + 1]) == "C", 0, &laStr[lnK + 1])
            CASE laStr[lnK] == "MGGJJ"
                REPLACE 每股公股金_元 WITH IIF(VARTYPE(&laStr[lnK + 1]) == "C", 0, &laStr[lnK + 1])
            CASE laStr[lnK] == "MGWFPLY"
                REPLACE 每股未分配利润_元 WITH IIF(VARTYPE(&laStr[lnK + 1]) == "C", 0, &laStr[lnK + 1])
            CASE laStr[lnK] == "JLYTBZZ"
                REPLACE 净利润同比增长_% WITH IIF(VARTYPE(&laStr[lnK + 1]) == "C", 0, &laStr[lnK + 1])
            CASE laStr[lnK] == "TotalEquity"
                REPLACE 总股本_亿 WITH &laStr[lnK + 1]/10^8
            CASE laStr[lnK] == "YAGGR"
                REPLACE 预案公告日 WITH &laStr[lnK + 1]
            CASE laStr[lnK] == "GQDJR"
                REPLACE 股权登记日 WITH &laStr[lnK + 1]
            CASE laStr[lnK] == "CQCXR"
                REPLACE 除权除息日 WITH &laStr[lnK + 1]
            CASE laStr[lnK] == "ProjectProgress"
                REPLACE 方案进度 WITH &laStr[lnK + 1]
            CASE laStr[lnK] == "NOTICEDATE"
                REPLACE 最新公告日期 WITH &laStr[lnK + 1]
        ENDCASE
    ENDFOR
ENDFOR
BROWSE


这个网页的数据不规范
#7
closeall2021-05-05 20:52
谢谢!就是这个!我知道你行的!!雪中送炭!
#8
closeall2021-05-05 21:00
回复 5楼 sdta
为什么我运行时只有一行记录啊?vfp7中运行的。
#9
closeall2021-05-05 21:01
只有本站会员才能查看附件,请 登录
#10
sdta2021-05-05 21:24
以下是引用closeall在2021-5-5 21:00:50的发言:

为什么我运行时只有一行记录啊?vfp7中运行的。

代码是不是被你修改了
#11
closeall2021-05-05 21:37
回复 10楼 sdta
只是拷贝过去,这部分命令我不会,可能是vfp7的区别,我正在装9,再试试。另外一个问题是如果只是将股票代码000001改到000002,下载下来的数据没有变化?我不会url这些命令,谢谢您帮忙。现在股市大概4300只股票,我之前是用通达信下载到本地的数据转过来的,网上下载的命令我不会,麻烦您指导一下,谢谢!
将“http://dcfm.(x)%2C%22pages%22%3A(tp)%7D&cmd=000001&token=894050c76af8597a853f5b408b759f5d”中的000001换成000002,那个表格没变,不知道这样是不是可以?


[此贴子已经被作者于2021-5-5 21:39编辑过]

#12
closeall2021-05-05 21:46
回复 5楼 sdta
VFP7下不行,vfp9下OK了,非常感谢!!
#13
sdta2021-05-05 23:06
以下是引用closeall在2021-5-5 21:37:11的发言:

只是拷贝过去,这部分命令我不会,可能是vfp7的区别,我正在装9,再试试。另外一个问题是如果只是将股票代码000001改到000002,下载下来的数据没有变化?我不会url这些命令,谢谢您帮忙。现在股市大概4300只股票,我之前是用通达信下载到本地的数据转过来的,网上下载的命令我不会,麻烦您指导一下,谢谢!
将“http://dcfm.(x)%2C%22pages%22%3A(tp)%7D&cmd=000001&token=894050c76af8597a853f5b408b759f5d”中的000001换成000002,那个表格没变,不知道这样是不是可以?

股市有4224只股票,对不对
#14
吹水佬2021-05-05 23:08
也可以用页面Document接口取数
只有本站会员才能查看附件,请 登录

程序代码:
oie = CREATEOBJECT("internetexplorer.application")
oie.Navigate("http://data./yjfp/detail/000001.html")
DO WHILE oie.Busy OR oie.ReadyState!=4
    DOEVENTS
    INKEY(1)
    ?? " 请稍候......",TIME()+0h0D
ENDDO
bError = .F.
TRY
    oTab = oie.Document.getElementsByTagName("tbody").[1]
CATCH
    bError = .T.
ENDTRY
IF !bError
    CREATE CURSOR tt (;
        f1 C(10),f2 C(10),f3 C(12),f4 C(10),f5 C(10),f6 C(10),;
        f7  N(6,2) NULL,f8  N(6,2) NULL,f9  N(6,2) NULL,f10 N(6,2) NULL,;
        f11 N(6,2) NULL,f12 N(6,2) NULL,f13 N(6,2) NULL,;
        f14 C(6),f15 C(6),f16 C(6),f17 C(8),f18 C(6))
    FOR EACH oRow IN oTab.Rows
        INSERT INTO tt VALUES (;
            oRow.cells(0).innertext,;
            oRow.cells(1).innertext,;
            oRow.cells(2).innertext,;
            oRow.cells(3).innertext,;
            oRow.cells(4).innertext,;
            oRow.cells(5).innertext,;
            IIF(oRow.cells( 6).innertext!="-", VAL(oRow.cells( 6).innertext), NULL),;
            IIF(oRow.cells( 7).innertext!="-", VAL(oRow.cells( 7).innertext), NULL),;
            IIF(oRow.cells( 8).innertext!="-", VAL(oRow.cells( 8).innertext), NULL),;
            IIF(oRow.cells( 9).innertext!="-", VAL(oRow.cells( 9).innertext), NULL),;
            IIF(oRow.cells(10).innertext!="-", VAL(oRow.cells(10).innertext), NULL),;
            IIF(oRow.cells(11).innertext!="-", VAL(oRow.cells(11).innertext), NULL),;
            IIF(oRow.cells(12).innertext!="-", VAL(oRow.cells(12).innertext), NULL),;
            oRow.cells(13).innertext,;
            oRow.cells(14).innertext,;
            oRow.cells(15).innertext,;
            oRow.cells(16).innertext,;
            oRow.cells(17).innertext)
    ENDFOR
    SELECT * FROM tt
ELSE
    ? " Error"
ENDIF
oie.Quit()
RETURN
#15
radiofan2021-05-06 08:25
以下是引用吹水佬在2021-5-5 23:08:19的发言:

也可以用页面Document接口取数

oie = CREATEOBJECT("internetexplorer.application")
oie.Navigate("http://data.)
DO WHILE oie.Busy OR oie.ReadyState!=4
    DOEVENTS
    INKEY(1)
    ?? " 请稍候......",TIME()+0h0D
ENDDO
bError = .F.
TRY
    oTab = oie.Document.getElementsByTagName("tbody").[1]
CATCH
    bError = .T.
ENDTRY
IF !bError
    CREATE CURSOR tt (;
        f1 C(10),f2 C(10),f3 C(12),f4 C(10),f5 C(10),f6 C(10),;
        f7  N(6,2) NULL,f8  N(6,2) NULL,f9  N(6,2) NULL,f10 N(6,2) NULL,;
        f11 N(6,2) NULL,f12 N(6,2) NULL,f13 N(6,2) NULL,;
        f14 C(6),f15 C(6),f16 C(6),f17 C(8),f18 C(6))
    FOR EACH oRow IN oTab.Rows
        INSERT INTO tt VALUES (;
            oRow.cells(0).innertext,;
            oRow.cells(1).innertext,;
            oRow.cells(2).innertext,;
            oRow.cells(3).innertext,;
            oRow.cells(4).innertext,;
            oRow.cells(5).innertext,;
            IIF(oRow.cells( 6).innertext!="-", VAL(oRow.cells( 6).innertext), NULL),;
            IIF(oRow.cells( 7).innertext!="-", VAL(oRow.cells( 7).innertext), NULL),;
            IIF(oRow.cells( 8).innertext!="-", VAL(oRow.cells( 8).innertext), NULL),;
            IIF(oRow.cells( 9).innertext!="-", VAL(oRow.cells( 9).innertext), NULL),;
            IIF(oRow.cells(10).innertext!="-", VAL(oRow.cells(10).innertext), NULL),;
            IIF(oRow.cells(11).innertext!="-", VAL(oRow.cells(11).innertext), NULL),;
            IIF(oRow.cells(12).innertext!="-", VAL(oRow.cells(12).innertext), NULL),;
            oRow.cells(13).innertext,;
            oRow.cells(14).innertext,;
            oRow.cells(15).innertext,;
            oRow.cells(16).innertext,;
            oRow.cells(17).innertext)
    ENDFOR
    SELECT * FROM tt
ELSE
    ? " Error"
ENDIF
oie.Quit()
RETURN

#16
closeall2021-05-06 14:15
首先感谢大侠们的关爱,这么多人帮助我!!非常感谢。现在还有一些问题。
1,吹水佬的我试了一下,他在浏览器里打开网页,从网页下载,这个有点不可行,因为4300只股票,半自动是不行的。
2,sdta给我的程序,基本上还好,还有一点问题我解决不了:
‘http://dcfm.(x)%2C%22pages%22%3A(tp)%7D&cmd=000001&token=894050c76af8597a853f5b408b759f5d’
这一条指令太长了,而且我用宏代换是不执行的,我要能将其中的000001,不停的换成000002等等就可以了,也就是接受1只股票是可以的,这条指令我带换不了。
3, radiofan 的程序也是要打开ie,我一下子更新4300只股票的资料,是有问题的,能不能不重新打开啊?而且相对sdta的比较慢一点。

#17
closeall2021-05-06 14:20
回复 13楼 sdta
我真不知道有多少只,我之前用通达信base来增加,退市的没删除,留个纪念,http://dcfm.(x)%2C%22pages%22%3A(tp)%7D&cmd=000001&token=894050c76af8597a853f5b408b759f5d
大侠,这一行如何改啊?
#18
closeall2021-05-06 18:14
回复 17楼 closeall
搞好了,将cmd=‘000001’去掉,把信息数量加到50000,就补全资料了。谢谢大家!祝大家家里有矿,有船啊
#19
sdta2021-05-07 09:20
以下是引用closeall在2021-5-6 14:20:17的发言:

我真不知道有多少只,我之前用通达信base来增加,退市的没删除,留个纪念,http://dcfm.(x)%2C%22pages%22%3A(tp)%7D&cmd=000001&token=894050c76af8597a853f5b408b759f5d
大侠,这一行如何改啊?

TEXT TO cUrl NOSHOW TEXTMERGE
http://dcfm.(x)%2C%22pages%22%3A(tp)%7D&cmd=000002&token=894050c76af8597a853f5b408b759f5d
ENDTEXT

改为:

lcGpdm = "000001"
cUrl = "http://dcfm.
    + "&st=ReportingPeriod&sr=-1&ps=50&p=1&type=DCSOBS&js=%7B%22data%22%3A(x)%2C%22pages%22%3A(tp)%7D&cmd=";
    + lcGpdm + "&token=894050c76af8597a853f5b408b759f5d"
#20
sdta2021-05-07 09:22
这个网页的前台和后台数据有部分不相符,慎用!!!!
#21
sdta2021-05-07 09:37
只有本站会员才能查看附件,请 登录
#22
closeall2021-05-07 09:55
回复 20楼 sdta
我只是需要送配表,之前的复权是模糊计算的,不准确能凑活用,现在涨跌停比例很乱,不好复权了。谢谢


[此贴子已经被作者于2021-5-7 09:57编辑过]

#23
sdta2021-05-07 10:01
以下是引用closeall在2021-5-6 14:20:17的发言:

我真不知道有多少只,我之前用通达信base来增加,退市的没删除,留个纪念,http://dcfm.(x)%2C%22pages%22%3A(tp)%7D&cmd=000001&token=894050c76af8597a853f5b408b759f5d
大侠,这一行如何改啊?

现在增加到4228只股票
http://data.
#24
sdta2021-05-07 10:10
分红送配(2020年年报)
http://data.
#25
closeall2021-05-07 10:49
回复 24楼 sdta
嘿嘿,求助那个‘https*******************************************’
谢谢!!!!

是这个吗?:

http://dcfm.(x)%2C%22pages%22%3A(tp)%7D&token=894050c76af8597a853f5b408b759f5d&filter=(ReportingPeriod%3D%5E2020-12-31%5E)

谢谢大侠!


[此贴子已经被作者于2021-5-7 10:55编辑过]

#26
sdta2021-05-07 11:26
在JSON文本的内容中获得自己需要的内容,实际上就是字符串解析
#27
sdta2021-05-07 12:33
2020年度分红送配客户名单
只有本站会员才能查看附件,请 登录
#28
closeall2021-05-07 13:15
回复 27楼 sdta
厉害了!继续学习中!

#29
sdta2021-05-07 13:58
全部转换为字符型,减少判断,提高运行速度
#30
closeall2021-05-07 14:28
回复 29楼 sdta
好的,我试试!
1