- 确保安装CefSharp软件包,相关安装步骤可以自行搜索
- CefSharp相关信息可在网上搜索,在这里主要使用到它作为浏览器的功能
- 思路:
- 使用CefSharp打开相关网页,以http://fundf10.eastmoney.com/jjjz_004719.html为例,代码如下:
private void btn_Click(object sender, RoutedEventArgs e)
{
web.Address = textBox.Text;
}
- 相关网页打开之后可发现其历史基金数据在以下HTML代码中:
<div id="jztable">
<table class="w782 comm lsjz">
<thead>
<tr>
<th class="first">净值日期</th>
<th>单位净值</th>
<th>累计净值</th>
<th>日增长率<img title="" id="jjjzTip" style="position: relative;top: 3px;left: 3px;" src="http://j5.dfcfw.com/image/201307/20130708102440.gif" data-placement="bottom" data-html="true" data-original-title="日增长率为空原因如下:<br>1、非交易日净值不参与日增长率计算(灰色数据行)。<br>2、上一交易日净值未披露,日增长率无法计算。"></th>
<th>申购状态</th>
<th>赎回状态</th>
<th class="tor last">分红送配</th>
</tr>
</thead>
<tbody>
<tr>
<td>2020-01-23</td>
<td class="tor bold">1.1168
</td>
<td class="tor bold">1.1168</td>
<td class="tor bold red">0.71%</td>
<td>限制大额申购</td>
<td>开放赎回</td>
<td class="red unbold"></td>
</tr>
... ...
<tr>
<td>2019-12-26</td>
<td class="tor bold">1.0519
</td>
<td class="tor bold">1.0519</td>
<td class="tor bold red">0.62%</td>
<td>开放申购</td>
<td>开放赎回</td>
<td class="red unbold"></td>
</tr>
</tbody>
</table>
</div>
- 在分析网页的HTML内容发现,其历史基金一次性获取并不完整,需要通过AJAX反复获取。通过需要使用CefSharp的JS异步操作技术,模拟网页按键操作即可实现自动翻页功能。部分代码如下:
script =
$"var btns = pagebar.getElementsByTagName(\"label\");" +
$"for(var i=0; i<btns.length; i++)" +
"{" +
$"if(btns[i].getAttribute(\"value\")=={(next).ToString()})" +
"{" +
"btns[i].click();" +
"break;" +
"}" +
"}";
web.GetBrowser().MainFrame.ExecuteJavaScriptAsync(script);
- 翻页完成后,通过读取当前页面数据即可获得相关历史基金数据。代码如下:
web.GetBrowser().MainFrame.GetSourceAsync().ContinueWith(x =>
{
if (!x.IsFaulted)
{
Dispatcher?.Invoke(() => {
_htmlDocument.LoadHtml(x.Result);
var v = _htmlDocument.GetElementbyId("jztable");
if (v != null)
{
if (v.SelectNodes("table").Count != 0)
{
var table = v.SelectNodes("table");
if (table[0].SelectNodes("tbody").Count != 0)
{
var tr = table[0].SelectNodes("tbody")[0].SelectNodes("tr");
for(int trIdx=0; trIdx < tr.Count; trIdx++)
{
var td = tr[trIdx].SelectNodes("td");
win?.Dispatcher?.Invoke(() => {
for (int tdIdx = 0; tdIdx < td.Count; tdIdx++)
{
var innerText = td[tdIdx].InnerText;
if (innerText.Contains("\n"))
{
innerText = innerText.Substring(0, innerText.IndexOf('\n'));
}
win.textBox.Text += innerText + "\t";
}
win.textBox.Text += "\n";
});
}
}
}
}
});
}
});
- 爬取网页数据效果如下: