使用 F# 抓取股票股利数据
Web scraping stock dividend data with F#
我正在尝试使用 F# 和 FSharp.Data 库从网页中抓取股票股息数据。可以在 http://www.nasdaq.com/symbol/ibm/dividend-history.
查看示例页面
为了请求网页,我的代码设置为一个简单的控制台应用程序作为示例,如下所示:
open FSharp.Data
[<EntryPoint>]
let main argv =
let url = "http://www.nasdaq.com/symbol/ibm/dividend-history"
let result = Http.RequestString(url)
System.Console.ReadLine() |> ignore
0 // return an integer exit code
当 运行 时,RequestString 方法错误:
“'System.ArgumentOutOfRangeException' 类型的未处理异常发生在 FSharp.Core.dll
附加信息:长度不能小于零。
看起来页面的格式设置使得 "traditional" 抓取方法不起作用。任何想法或想法将不胜感激。
这是我在 运行 代码时得到的完整堆栈跟踪:
System.ArgumentOutOfRangeException: Length cannot be less than zero.
Parameter name: length
at System.String.Substring(Int32 startIndex, Int32 length)
at FSharp.Data.HttpHelpers.getAllCookiesFromHeader@671.Invoke(Int32 i, String cookiePart) in C:\Git\FSharp.Data\src\Net\Http.fs:line 675
at Microsoft.FSharp.Collections.ArrayModule.IterateIndexed[T](FSharpFunc`2 action, T[] array)
at FSharp.Data.HttpHelpers.getAllCookiesFromHeader(String header, Uri responseUri, CookieContainer cookieContainer) in C:\Git\FSharp.Data\src\Net\Http.fs:line 671
at <StartupCode$FSharp-Data>.$Http.InnerRequest@803-5.Invoke(WebResponse _arg2) in C:\Git\FSharp.Data\src\Net\Http.fs:line 803
at Microsoft.FSharp.Control.AsyncBuilderImpl.args@835-1.Invoke(a a)
--- End of stack trace from previous location where exception was thrown ---
at Microsoft.FSharp.Control.AsyncBuilderImpl.commit[a](Result`1 res)
at Microsoft.FSharp.Control.CancellationTokenOps.RunSynchronously[a](CancellationToken token, FSharpAsync`1 computation, FSharpOption`1 timeout)
> at Microsoft.FSharp.Control.FSharpAsync.RunSynchronously[T](FSharpAsync`1 computation, FSharpOption`1 timeout, FSharpOption`1 cancellationToken)
at <StartupCode$FSI_0004>.$FSI_0004.main@() in C:\Users\helgeu.COMPODEAL\AppData\Local\Temp\~vs2B9.fsx:line 8
Stopped due to error
不幸的是,我认为您偶然发现了与此 cookie 处理代码相关的错误:
https://github.com/fsharp/FSharp.Data/issues/904
<咆哮>
我曾尝试研究该代码,但它让我头疼,因为一些 google 关于如何在 C# 中处理 cookie 的答案被邪恶地剪切和粘贴,然后被错误地翻译成 F#。
考虑向 github 案例添加信息可能是比这里更好的选择。
我正在尝试使用 F# 和 FSharp.Data 库从网页中抓取股票股息数据。可以在 http://www.nasdaq.com/symbol/ibm/dividend-history.
查看示例页面为了请求网页,我的代码设置为一个简单的控制台应用程序作为示例,如下所示:
open FSharp.Data
[<EntryPoint>]
let main argv =
let url = "http://www.nasdaq.com/symbol/ibm/dividend-history"
let result = Http.RequestString(url)
System.Console.ReadLine() |> ignore
0 // return an integer exit code
当 运行 时,RequestString 方法错误:
“'System.ArgumentOutOfRangeException' 类型的未处理异常发生在 FSharp.Core.dll
附加信息:长度不能小于零。
看起来页面的格式设置使得 "traditional" 抓取方法不起作用。任何想法或想法将不胜感激。
这是我在 运行 代码时得到的完整堆栈跟踪:
System.ArgumentOutOfRangeException: Length cannot be less than zero.
Parameter name: length
at System.String.Substring(Int32 startIndex, Int32 length)
at FSharp.Data.HttpHelpers.getAllCookiesFromHeader@671.Invoke(Int32 i, String cookiePart) in C:\Git\FSharp.Data\src\Net\Http.fs:line 675
at Microsoft.FSharp.Collections.ArrayModule.IterateIndexed[T](FSharpFunc`2 action, T[] array)
at FSharp.Data.HttpHelpers.getAllCookiesFromHeader(String header, Uri responseUri, CookieContainer cookieContainer) in C:\Git\FSharp.Data\src\Net\Http.fs:line 671
at <StartupCode$FSharp-Data>.$Http.InnerRequest@803-5.Invoke(WebResponse _arg2) in C:\Git\FSharp.Data\src\Net\Http.fs:line 803
at Microsoft.FSharp.Control.AsyncBuilderImpl.args@835-1.Invoke(a a)
--- End of stack trace from previous location where exception was thrown ---
at Microsoft.FSharp.Control.AsyncBuilderImpl.commit[a](Result`1 res)
at Microsoft.FSharp.Control.CancellationTokenOps.RunSynchronously[a](CancellationToken token, FSharpAsync`1 computation, FSharpOption`1 timeout)
> at Microsoft.FSharp.Control.FSharpAsync.RunSynchronously[T](FSharpAsync`1 computation, FSharpOption`1 timeout, FSharpOption`1 cancellationToken)
at <StartupCode$FSI_0004>.$FSI_0004.main@() in C:\Users\helgeu.COMPODEAL\AppData\Local\Temp\~vs2B9.fsx:line 8
Stopped due to error
不幸的是,我认为您偶然发现了与此 cookie 处理代码相关的错误:
https://github.com/fsharp/FSharp.Data/issues/904
<咆哮>
我曾尝试研究该代码,但它让我头疼,因为一些 google 关于如何在 C# 中处理 cookie 的答案被邪恶地剪切和粘贴,然后被错误地翻译成 F#。
考虑向 github 案例添加信息可能是比这里更好的选择。