类型提供程序'ProviderImplementation.HtmlProvider'报告错误:Cookie 的"值"="XXXX"部分无效



我正在使用htmlprovider进行网络刮擦股票公司新闻,例如https://www.nasdaq.com/symbol/{STOCK_SYMBOL_HERE}/news-headlines,但我在这条代码

的行中遇到了错误
let [<Literal>] stockNewsUrl = "https://www.nasdaq.com/symbol/AAPL/news-headlines"
let news = new HtmlProvider<stockNewsUrl>()

第二行上有smiggle,错误是Error FS3033 The type provider 'ProviderImplementation.HtmlProvider' reported an error: Cannot read sample HTML from 'https://www.nasdaq.com/symbol/AAPL/news-headlines': The 'Value'='AAPL,technology' part of the cookie is invalid.

要向https://www.nasdaq.com/symbol/aapl/aapl/news-headlines提出http请求,我们需要提供一个烹饪服务器。由于您正在使用fsharp.data库,因此我建议使用其HTTP实用程序:

type Nasdaq = HtmlProvider<"/tmp.html">
let cc = CookieContainer ()
let data =
    Http.RequestString ("https://www.nasdaq.com/symbol/AAPL/news-headlines", cookieContainer = cc)
    |> Nasdaq.Parse
data.Tables.``Today's Market Activity``.Html
|> printfn "%A"

当然,您必须先预先加载页面并首先保存到/tmp.html

小注意:如果我们已经有HTML字符串(如在情况下(,则使用Nasdaq.Parse;如果我们有URL,我们使用Nasdaq.Load

看起来失败了,因为f#数据以纳斯达克服务不喜欢的格式发送cookie。一个简单的解决方法是下载该页面一次以在编译时可用,然后使用其他方式在运行时下载页面。

type Nasdaq = HtmlProvider<"c:/temp/nasdaq.html">
let wc = new WebClient()
let downloaded = wc.DownloadString("https://www.nasdaq.com/symbol/AAPL/news-headlines")
let ns = Nasdaq.Load(downloaded)

这有效,但是有两个问题:

  • 页面dos不包含任何表/列表,因此ns值并不能使您静态访问有用的内容
  • 当我尝试使用WebClient下载数据时,我会得到超时例外,因此也许也无法正常工作(但这可能只是我落后于代理人或其他东西。(

相关内容

最新更新