本文视频教程可以查看百度经验:https://jingyan.baidu.com/article/af9f5a2d57738c43140a45d9.html
在之前做的一些项目中,遇到过需要从别的网站爬取信息的功能。我都是用HttpWebRequest获取网站源码,然后再自己分析内容去解析的。今天在做项目时,又遇到需要从别的网站爬取信息的功能。因为自己比较懒,不想花时间去学正则表达式,但是不用正则的话,解析代码的编写又比较花时间。于是,自己在网上搜索了下,终于发现了另外一个快速爬取其他网站信息的方法。
那就是使用HtmlAgilityPack,它是一个开源项目,为网页提供了标准的DOM API和XPath导航。使用WebBrowser和HttpWebRequest下载的网页可以用Html Agility Pack来解析。
HtmlAgilityPack的文档是CHM格式的,有时会无法正常阅读CHM格式的文件。如果是IE不能链接到您请求的网页或者打开后“页面无法显示”。请在要打开的CHM文件上右击属性,会在底下属性多了个“解除锁定”,单击后就可以正常显示了。
如果有需要下载,请在vs的NuGet中搜索HtmlAgilityPack,找到后进行安装。
下面,我们来看下用HtmlAgilityPack爬取数据的代码实例。
publicPost pp = new publicPost();
string ls_html= pp.getUrlRespHtml(url,null, "GBK", null,null);
HtmlAgilityPack.HtmlDocument hd = new HtmlAgilityPack.HtmlDocument();
hd.LoadHtml(ls_html);
HtmlAgilityPack.HtmlNodeCollection colist= hd.DocumentNode.SelectNodes("//*[@class='lists_bigimg_right']");
foreach (HtmlAgilityPack.HtmlNode node in colist)
{
HtmlAgilityPack.HtmlNode ls_a =node.SelectSingleNode(".//a[@href]");
HtmlAgilityPack.HtmlNode ls_p = node.SelectSingleNode(".//p");
string ls_text = ls_a.InnerText;
string ls_href = ls_a.OuterHtml;
string ls_detail = ls_p.InnerText;
}
获取节点里的属性,可以用node.GetAttributeValue(
"dm","1"
)方法。
这里的publicPost是本人自己根据网上其他人的源码进行修改过的获取网站html的通用类。
我们也可以直接使用这个类自带的方法获取html,代码如下:
HtmlAgilityPack.HtmlWeb webClient = new HtmlAgilityPack.HtmlWeb();
webClient.OverrideEncoding = Encoding.GetEncoding("gb2312");//编码,这里网上有些很多写法都不正确
HtmlAgilityPack.HtmlDocument doc = webClient.Load("http://......");
取属性值语法是htmlnode.Attributes["data-queryid"].Value。
在上面的代码里,我们解析了某个网页的class是lists_bigimg_right的元素,这里获取的是div。然后遍历所有的div,获取div中的链接地址、名称以及说明。
短短几句代码就实现了原来比较麻烦的解析过程。推荐大家可以使用这个工具类。
HtmlAgilityPack里基本上使用的语法都是XPath 语法,该语法大家可以去w3school学习。