【问题标题】:Read files from HTTP从 HTTP 读取文件
【发布时间】:2016-04-20 17:42:06
【问题描述】:

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

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 命令,发现等待是打开端口的默认设置。我究竟做错了什么?有没有办法让 Rebol 等待几秒钟才能得到服务器的响应?

编辑 - 每天的活动都有一个文件。说,我要下载 10 天(1 月 1 日到 1 月 10 日。然后,我得到了几天的文件和几天的错误。如果我立即再次下载相同的日期,我会得到一些丢失的文件。第三和第四try 将获取所有剩余的文件。但是,对于任何日期,每次出现文件未找到错误都是随机的。

嗯,

  1. 正如 tomc 所说,我将超时时间增加到 10 秒。
  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 日下载了两次。

第一次尝试失败的列表-

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

【问题讨论】:

  • 当您说您收到一个未找到文件的错误时,您的意思是您从网络服务器收到了一个响应,并且它说它不存在......有时它会给您一个答案?如果是这种情况,则由 Web 服务器决定。看看在流量中使用WireShark 之类的东西,如果请求是正确的并且服务器并不总是给你,那并不是 Rebol 的问题(除了将自己标识为非网络浏览器,这可能会改变nseindia 的反应行为...)
  • 让我说得更清楚些。每天的活动都有一个文件。说,我要下载 10 天(1 月 1 日到 1 月 10 日。然后,我得到了几天的文件和几天的错误。如果我立即再次下载相同的日期,我会得到一些丢失的文件。第三和第四try 将获取所有剩余的文件。但是,对于任何日期,每次出现文件未找到错误都是随机的。因此,我觉得 Rebol 没有等待足够的时间来接收文件。
  • 请参阅"Should questions include “tags” in their titles?",其中的共识是“不,他们不应该”!
  • 很抱歉在标题中包含标签。以后我会好好照顾的。
  • 仅供参考 - wait 也可以采用 integer!time! 参数。例如。 wait 3 停止 3 秒,wait 0:2 持续 2 分钟,wait 1:2:3 持续 1 小时 2 分 3 秒。

标签: rebol rebol2


【解决方案1】:

在 R2 中,您可以使用

设置 http 超时
system/schemes/http/timeout: whatever

【讨论】:

    【解决方案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 强制该系列与该系列中的第一个数据类型相同,并且括号是不必要的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多