【问题标题】:How to scrape data from nasdaq omx nordic如何从 nasdaq omx nordic 抓取数据
【发布时间】:2018-02-10 16:09:33
【问题描述】:

我试图直接从这里刮价格http://www.nasdaqomxnordic.com/etp/etn/etninfo?Instrument=SSE132883 使用使用 Html Agility Pack 插件。

那没有用,所以我查看了访问该页面时发出的请求。使用一些表单数据对以下 url 进行了一些调用。 http://www.nasdaqomxnordic.com/webproxy/DataFeedProxy.aspx.

我尝试通过使用邮递员创建请求并传递相同的表单数据来复制这一点,但收到无效请求。

【问题讨论】:

    标签: c# asp.net-core web-scraping .net-core


    【解决方案1】:

    正如您已经注意到的,您只需将正确的输入发布到“http://www.nasdaqomxnordic.com/webproxy/DataFeedProxy.aspx”。

    我从 chrome 的开发者窗口复制了下面的 requestXML。

    string url = "http://www.nasdaqomxnordic.com/webproxy/DataFeedProxy.aspx";
    string requestXML = @"<post>
                        <param name=""Exchange"" value=""NMF""/>
                        <param name=""SubSystem"" value=""Prices""/>
                        <param name=""Action"" value=""GetInstrument""/>
                        <param name=""inst__a"" value=""""/>
                        <param name=""ext_xslt"" value=""/nordicV3/trades_table.xsl""/>
                        <param name=""inst.an"" value=""nm""/>
                        <param name=""inst__e"" value=""3""/>
                        <param name=""Instrument"" value=""SSE132883""/>
                        <param name=""ext_xslt_lang"" value=""en""/>
                        <param name=""ext_xslt_hiddenattrs"" value="",x,id,tr,""/>
                        <param name=""ext_xslt_tableId"" value=""tradesForShareTable""/>
                        <param name=""ext_xslt_options"" value="",noflag,menu,""/>
                        <param name=""app"" value=""/etp/etn/etninfo""/>
                        </post>";
    
    using (var client = new HttpClient())
    {
        var values = new Dictionary<string, string>()
        {
            { "xmlquery", requestXML }
        };
        var content = new FormUrlEncodedContent(values);
        var resp = await client.PostAsync(url, content);
        var html = await resp.Content.ReadAsStringAsync();
    
        var doc = new HtmlAgilityPack.HtmlDocument();
        doc.LoadHtml(html);
        var table = doc.DocumentNode.Descendants("tr")
                        .Select(tr =>
                        new
                        {
                            Id = tr.Attributes["id"]?.Value,
                            Data = tr.Elements("td").Select(x => x.InnerText).ToList()
                        })
                        .Where(x => x.Id != null)
                        .ToList();
    
    }
    

    【讨论】:

    • URL 和请求数据正是我用邮递员尝试过的带有请求标头的,但得到的 URL 无效。我从没想过它只会在 HTTP 客户端上工作,但确实如此。非常感谢
    【解决方案2】:

    不确定 Html Agility Data Pack,过去使用过它,但目前我要抓取的最多的东西是使用 JavaScript(或 JQuery)。特别是如果它使用 ajax 加载内容或需要渲染 JS 的能力,那么您需要浏览器组件或 无头浏览器。这样做也意味着如果网站实时更新价格(即无需重新加载),那么您也不需要每次都启动新会话,只需在 5 秒睡眠后重新读取 dom,对某些人来说真的很有效抓取任务。

    使用 Chrome 驱动程序检查 PhantomJS 或 Selenium(PhantomJS 驱动程序已经有一段时间没有更新了)。

    【讨论】:

      猜你喜欢
      • 2018-09-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-10-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多