我已经编写了一个从国家证券交易所下载文本文件的程序。这是下载功能:
downloadNseBhav: func [Date] [
NSE_Url: to-url rejoin [
"http://nseindia.com/content/historical/EQUITIES/"
(uppercase form-date Date "%Y/%b/") "cm" Sd "bhav.csv.zip"
; format NSE Bhavcopy url
]
either error? try [
write/binary to-file rejoin ["./NSE/" Sd "bhav.csv.zip"]
read/binary NSE_Url
; download bhavcopy zip file to disk in ./NSE folder
][
append Log/text "Server made a boo boo ......NSE Bhavcopy not found^/^/"
scroll-text Log
Exit
][
append Log/text "Downloaded NSE Bhavcopy Zip^/"
scroll-text Log
]
]
虽然所需的文件存在,但我多次收到文件未找到的消息。当请求多个文件并且其中一些文件未下载时,这很烦人。如果我再试一次,我会收到该文件。
我在Rebol 2文档中读取了wait
命令,发现wait是打开端口的默认值。我究竟做错了什么?有没有办法让Rebol等待几秒钟才能从服务器获得响应?
编辑 - 每天的活动都有一个文件。说,我正在下载10天(1月1日到1月10日。然后,我得到文件几天和错误几天。如果我立即再次下载相同的日期,我得到一些丢失的文件。第三和第四尝试将获取所有剩余的文件。但是,对于任何日期,每次发现文件未找到错误。
好吧,
我不能像Hostilfork所建议的那样使用Wireshark,但我可以通过以下代码稍作修改来捕获错误。
either error? err: try [ BC: read/binary NSE_Url ] ; download bhavcopy zip file to disk in ./NSE folder
[ err: disarm err
probe err
write/append %log.txt rejoin ["NSE EQUITIES/bhavcopy not found " DateYmd "^/"]
Exit
] []
]
此后,我于2015年12月1日至2015年12月15日两次下载。
首次尝试失败的列表 -
NSE EQUITIES/bhavcopy not found 2015-12-08
NSE EQUITIES/bhavcopy not found 2015-12-09
第二次尝试失败的列表 -
NSE EQUITIES/bhavcopy not found 2015-12-01
NSE EQUITIES/bhavcopy not found 2015-12-02
错误消息对所有情况都相同 -
emake object! [
code: 507
type: 'access
id: 'no-connect
arg1: "nseindia.com"
arg2: none
arg3: none
near: [BC: read/binary NSE_Url]
where: 'open-proto
请原谅我之前未正确捕获错误。我是Rebol的新手。
我不知道这是什么解决方案。我有一个8 mbps的网络连接,它运行正常。
出于好奇,我打开了Rebol控制台并连接了google.co.in 这是两次同时尝试的结果 -
test: read http:// google . co. in
Access Error: Cannot connect to google.co.in
Where: open-proto
Near: test: read http://google.co.in
test: read http://google.co.in
== {<!doctype html><html itemscope="" itemtype="http://schema.org/WebPage" lang="en-IN"><head><meta content="text/html; charset=UTF...
因此,截至目前,我正在遵循这两项建议。
我学到的另一件事 - 陷阱错误不能像这样 -
either error? err: try [
write/binary to-file rejoin ["./NSE/" Sd "bhav.csv.zip"]
read/binary NSE_Url]
必须将文件读入变量,否则如果实际接收到文件,则Rebol2会因错误而崩溃 - 错误:需要一个值。
答案 0 :(得分:2)
你可以用
设置http超时system/schemes/http/timeout: whatever
答案 1 :(得分:2)
正如tomc所说,如果Web服务器响应缓慢,您可以更改超时,这就是您遇到这些问题的原因,以及为什么会出现间歇性问题。可能是第二次现在缓存结果并准备好收集。
您还可以收集失败的列表,并在第二次通过时再次尝试。
顺便说一句
downloadNseBhav: func [Date] [
NSE_Url: to-url rejoin [
"http://nseindia.com/content/historical/EQUITIES/"
(uppercase form-date Date "%Y/%b/") "cm" Sd "bhav.csv.zip"
; format NSE Bhavcopy url
]
并写成
downloadNseBhav: func [Date] [
NSE_Url: rejoin [
http://nseindia.com/content/historical/EQUITIES/
uppercase form-date Date "%Y/%b/" "cm" Sd "bhav.csv" %.zip
; format NSE Bhavcopy url
]
因为rejoin强制系列与系列中的第一个数据类型相同,并且parens是不必要的。