.Net Core数据爬虫
最近接触项目,通过.Net 爬取页面数据,话不多说
1.首先是使用HtmlAgilityPack来获取HTML页面
以下用本篇博客( https://www.cnblogs.com/ywkcode/)举例,通过HtmlAgilityPack,用XPath解析HTML文件。
(1)获取页面中导航栏的节点信息:
实现代码:
1 string htmlstr = GetHtmlStr("https://www.cnblogs.com/ywkcode/"); 2 HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument(); 3 4 doc.LoadHtml(htmlstr); 5 HtmlNode rootnode = doc.DocumentNode; //XPath路径表达式,这里表示选取所有span节点中的font最后一个子节点,其中span节点的class属性值为num 6 7 string xpathstring2 = "//div[@id='navigator']"; 8 HtmlNodeCollection aa2 = rootnode.SelectNodes(xpathstring2);
1 public static string GetHtmlStr(string url) 2 { 3 try 4 { 5 WebRequest rGet = WebRequest.Create(url); 6 WebResponse rSet = rGet.GetResponse(); 7 Stream s = rSet.GetResponseStream(); 8 StreamReader reader = new StreamReader(s, Encoding.UTF8); 9 return reader.ReadToEnd(); 10 } 11 catch (WebException) 12 { 13 //连接失败 14 return null; 15 } 16 }
(2)在实际使用中发现,如果在请求的页面中要获取动态数据或嵌入页面,HtmlAgilityPack则无法提供动态的数据解析,如下图所示
页面中的日历信息,是加载新的aspx页面 calendar.aspx
.aspx?calendar.aspx?
实现代码:
可以看到要无法获得class为“CalTitle”的节点
2.优化抓取数据方案
通过Selenium工具,模拟浏览器运行,爬取数据。
Selenium是一个用于Web应用程序测试的工具,支持IE(7-11),Safari,Google Chrome,Opera等,主要用于兼容性测试和脚本测试。
本次测试以谷歌为例
(1)首先下载谷歌浏览器对应的版本驱动
下载地址:
选择和开发环境浏览器版本一致的版本并下载
测试用例:
Version 83.0.4103.97 (Official Build) (32-bit)
(2)把下载好的exe文件拷贝至bin目录下:
(3)模拟驱动
实现代码:
1 ChromeOptions op = new ChromeOptions(); 2 ChromeDriver driver = new ChromeDriver(AppDomain.CurrentDomain.BaseDirectory.ToString(), op); 3 string Url = $"https://www.cnblogs.com/ywkcode/"; 4 driver.Navigate().GoToUrl(Url); 5 var modelHtmlList= driver.FindElementsByXPath(".//table[@class='CalTitle']");
如下图所示,获取到了class为“CalTitle”的节点内容,若页面加载很慢,可以通过线程等待一段时间即可thread.sleep();
参考地址:
以上,仅供学习记录和总结