赞
踩
本系列将由浅入深给大家介绍网络爬虫,一步一步教大家学会怎么分析请求,抓取数据,真正意义上爬取一切你想要的!
本章介绍:XPath+HtmlAgilityPack获取网页上任意内容
一、程序中模拟浏览器网络请求
模拟网络请求
上一章我们已经对网络请求有了一定的概念,并且学会简单的分析网站中的各种资源请求。那么放到程序里面,我们又怎么去模拟浏览器做请求呢?我们要做爬虫,一定是程序去做请求而不是我们人工去做,这就引出了模拟网络请求的概念。在C#里,一般使用HttpWebRequest或者WebClient的形式,作者认为两者最大的区别在于WebClient比HttpWebRequest更简单易用,是在前者的基础上进行的再一次封装,并且在使用WebClient时你不太可能犯错误,因为就几行代码而已,如果你想要扩展更多的请求属性,可使用“Headers.Add”随意扩展。以下是两种方式的核心代码,供大家参考。
HttpWebRequest
WebClient
概念聊完了还是要回归到实际应用中,对于上一章节中的新浪新闻请求url,我们要使用开发者工具监控是POST还是GET请求,一般是这两种,然后确定参数和返回类型,编码类型一般是UTF-8,具体操作如下
确定请求方式,返回类型和参数
以下是C#程序中请求文章列表结果:
请求拿到文章列表数据
上一篇文章我们分析得到了文章的url链接,同样的方式,我们可以得到新闻详情的html
得到新闻内容html
二、网页分析利器之XPath
上一步我们拿到了新闻内容,然后就要解析内容,找出我们想要的东西,这里我们使用开发者工具可以迅速定位到新闻内容所在的html标签。如何获取这个标签里的内容呢?这还要依赖于开发者工具的“Copy XPath”功能。
Copy XPath
复制出来的文本“//*[@id="artibody"]”就是能定位到文章内容的XPath表达式,那么我们就很容易明白XPath是什么了,其实通俗点讲就是定位网页标签内容的语法或表达式。不了解XPath的同学可以自行百度,文章末尾会附上常见的一些用法,欢迎讨论学习。
三、HTML 解析类库之HtmlAgilityPack
那么有了XPath表达式,怎么用在程序里面呢?又一大利器应运而生“HtmlAgilityPack”。在C# 中可通过Nuget进行安装,它的最大作用就是解析html,比正则表达式来更快更精准!在HtmlAgilityPack中常用到的类有HtmlDocument、HtmlNodeCollection、HtmlNode和HtmlWeb等。废话不多说,直接看怎么拿到新闻的主题内容,针对网站不同,可以添加去除不必要的备注和script。
使用XPath得到新闻内容
拿到新闻内容那真的是可以为所欲为了,你可以存成文本形式,也可以保存到数据库自己做一个新闻浏览网站等等。
四、XPath常用语法以及HtmlAgilityPack常用方法
XPath
1. 根据id选择://*[@id="xxx"]
2. 根据class选择://*[@class="xxx"]
3. 获取页面上所有的a/p/span...标签:a/p/span...
4. 根据title属性值获取元素://title[@lang='eng']
5. 选择某个标签下的div/p/span标签://*[@id="xxx"]/div[1]/span/p
6. 查询text节点值中带有cn字符串的title节点://title[contains(text,'cn')]
7. 不包含data属性的title节点:title[not(@data)]
8. 统计title节点的数量:count(//title)
9. 查询js中的某个变量值://script[contains(text(), '变量名')]
10. 当前节点的父节点:./parent::* 等等...
HtmlAgilityPack
1. 加载html:LoadHtml(strHtml)或者HmlWeb().Load(url)
2. HtmlNode获取标签属性:Attribute["属性名"].Value
3. HtmlNode获取标签html:xxx.InnerHtml
4. HtmlNode获取标签html的text:xxx.InnerText
5. 获取单个标签,返回HtmlNode:SelectSingleNode
6. 获取标签集合,返回HtmlNodeCollection:SelectNodes
7. 获取子节点集合(包括文本节点):ChildNodes
8. 获取下一个兄弟节点:NextSibling
9. 获取该节点的父节点:ParentNode
10. 获取前一个兄弟节点:PreviousSibling 等等...
以上是作者在写爬虫中经常用到的XPath,还有很多就不一一列举了,有熟悉的大神可在评论中分享哦。
XPath解析网页
五、总结一下
通过以上介绍,大概流程我们已经清楚了,归纳下来无外乎以下几点:模拟网络请求-->开发者工具Copy XPath-->HtmlAgilityPack解析得到网页内容-->拿到数据为所欲为!
今天的分享到这里就结束了,有很多不足之处,欢迎大家留言指正,我们共同交流,提升!
前期准备工作已经完毕,下一章节将进行项目实战!
我是隔壁老王,爱编程爱学习~_~
举报/反馈
赞
踩
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。