使用CefSharp动态爬取天天基金网历史基金数据——动态爬取(一)

  • 确保安装CefSharp软件包,相关安装步骤可以自行搜索
  • CefSharp相关信息可在网上搜索,在这里主要使用到它作为浏览器的功能
  • 思路:
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";
                            });
                        }
                    }
                }
            }
        });
    }
});
  • 爬取网页数据效果如下:

 

 

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值