我试图直接从这里刮取价格http://www.nasdaqomxnordic.com/etp/etn/etninfo?Instrument=SSE132883 使用Html Agility Pack插件。
那没有用,所以我查看了访问页面时正在进行的请求。有一些表格数据调用以下网址。 http://www.nasdaqomxnordic.com/webproxy/DataFeedProxy.aspx
我试图通过使用邮递员创建请求并传递相同的表单数据但是收到无效请求来复制此内容。
答案 0 :(得分:2)
正如您已经注意到的,您只需要将正确的输入发布到“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();
}
答案 1 :(得分:-1)
不确定Html Agility Data Pack,在过去使用它,但目前我用的最多的东西是使用JavaScript(或JQuery)。特别是如果它用ajax加载东西或需要渲染JS的能力,那么你需要浏览器组件或 无头浏览器。这样做也意味着如果网站实时更新价格(即无需重新加载),那么你也不需要每次都开始新的会话,只需在5秒的睡眠后重新读取dom,对某些人来说真的很有效刮刮任务。
使用Chrome驱动程序检出PhantomJS或Selenium(PhantomJS驱动程序已有一段时间没有更新)。