首页 > 技术文章 > .Net Core数据爬虫

ywkcode 2020-08-07 00:22 原文

最近接触项目,通过.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)首先下载谷歌浏览器对应的版本驱动
下载地址:
http://chromedriver.storage.googleapis.com/index.html
 

 

选择和开发环境浏览器版本一致的版本并下载

测试用例:
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();
 
 
参考地址:
https://www.cnblogs.com/bomo/archive/2013/01/28/2879361.html
https://blog.csdn.net/zh453030035/article/details/100132014
 
以上,仅供学习记录和总结

推荐阅读