Поставщик типа «ProviderImplementation.HtmlProvider» сообщил об ошибке: часть файла cookie «Value» = «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>()

Во второй строке есть волнистая линия, и ошибка была 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.


person marvs    schedule 23.05.2019    source источник


Ответы (2)


Чтобы сделать HTTP-запрос к https://www.nasdaq.com/symbol/AAPL/news-headlines, мы должны предоставить Контейнер cookie. Поскольку вы используете библиотеку 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.

person Nghia Bui    schedule 24.05.2019
comment
Спасибо большое! Я еще не загрузил страницу, но мне достаточно доступа к сайту, чтобы продолжить. - person marvs; 24.05.2019

Похоже, это не удается, потому что F# Data отправляет файлы cookie в формате, который не нравится службе Nasdaq. Простой обходной путь — загрузить страницу один раз, чтобы образец был доступен во время компиляции, а затем загрузить страницу во время выполнения, используя другие средства.

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)

Это работает, но есть две проблемы:

  • Страница не содержит никаких таблиц/списков, поэтому значение ns не дает вам хорошего статического доступа к чему-либо полезному.
  • Я получаю исключение тайм-аута, когда пытаюсь загрузить данные с помощью WebClient, так что, возможно, это тоже не работает (но может быть просто я за прокси или что-то в этом роде..)
person Tomas Petricek    schedule 23.05.2019
comment
Привет @Tomas Petricek, у меня также проблема с загрузкой данных с помощью WebClient. Я не думаю, что я за прокси. - person marvs; 24.05.2019
comment
ОБНОВЛЕНИЕ: я протестировал другой сайт и могу скачать контент. Но первая проблема, НЕ имеющая хорошего статического доступа, является проблемой. - person marvs; 24.05.2019
comment
@marvs Да, поставщик HTML работает только с файлами HTML с красивыми таблицами или списками. Если на веб-странице их нет, то, к сожалению, она не может творить чудес. - person Tomas Petricek; 25.05.2019