从HTTP

时间:2016-01-15 07:03:42

标签: rebol rebol2

我已经编写了一个从国家证券交易所下载文本文件的程序。这是下载功能:

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日。然后,我得到文件几天和错误几天。如果我立即再次下载相同的日期,我得到一些丢失的文件。第三和第四尝试将获取所有剩余的文件。但是,对于任何日期,每次发现文件未找到错误。

好吧,

  1. 我将时间延长到10秒,正如tomc所说。
  2. 我也按照Graham Chiu的建议收集了那些失败的名单。
  3. 我不能像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日两次下载。

  4. 首次尝试失败的列表 -

    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会因错误而崩溃 - 错误:需要一个值。

2 个答案:

答案 0 :(得分:2)

在R2中

你可以用

设置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是不必要的。