使用HtmlAgilityPack快速实现网页爬虫

本文视频教程可以查看百度经验: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学习。

http://www.w3school.com.cn/xpath/xpath_syntax.asp

你可能感兴趣的