当前位置:   article > 正文

爬虫如何获取多个html中的内容,网络爬虫干货,掌握这些,轻松获取网页内容...

爬虫如何获取多个html中的内容,网络爬虫干货,掌握这些,轻松获取网页内容...

本系列将由浅入深给大家介绍网络爬虫,一步一步教大家学会怎么分析请求,抓取数据,真正意义上爬取一切你想要的!

本章介绍:XPath+HtmlAgilityPack获取网页上任意内容

一、程序中模拟浏览器网络请求

484267c81d75eeb1427a6d97d9677beb.png模拟网络请求

上一章我们已经对网络请求有了一定的概念,并且学会简单的分析网站中的各种资源请求。那么放到程序里面,我们又怎么去模拟浏览器做请求呢?我们要做爬虫,一定是程序去做请求而不是我们人工去做,这就引出了模拟网络请求的概念。在C#里,一般使用HttpWebRequest或者WebClient的形式,作者认为两者最大的区别在于WebClient比HttpWebRequest更简单易用,是在前者的基础上进行的再一次封装,并且在使用WebClient时你不太可能犯错误,因为就几行代码而已,如果你想要扩展更多的请求属性,可使用“Headers.Add”随意扩展。以下是两种方式的核心代码,供大家参考。

3c3f489a85953b71036c73207411db5d.pngHttpWebRequest

a955c242c188e72ae7ec535320db8e3e.pngWebClient

概念聊完了还是要回归到实际应用中,对于上一章节中的新浪新闻请求url,我们要使用开发者工具监控是POST还是GET请求,一般是这两种,然后确定参数和返回类型,编码类型一般是UTF-8,具体操作如下

983429da0c445188d0f8a5f54ee1acb4.png确定请求方式,返回类型和参数

以下是C#程序中请求文章列表结果:

c9f4fc778161fb8285018b7eea1df063.png请求拿到文章列表数据

上一篇文章我们分析得到了文章的url链接,同样的方式,我们可以得到新闻详情的html

d2e90c35e4203b96e1bd3407d982cb8a.png得到新闻内容html

二、网页分析利器之XPath

上一步我们拿到了新闻内容,然后就要解析内容,找出我们想要的东西,这里我们使用开发者工具可以迅速定位到新闻内容所在的html标签。如何获取这个标签里的内容呢?这还要依赖于开发者工具的“Copy XPath”功能。

2c567ab65454de477f9da872e0b2275c.pngCopy XPath

复制出来的文本“//*[@id="artibody"]”就是能定位到文章内容的XPath表达式,那么我们就很容易明白XPath是什么了,其实通俗点讲就是定位网页标签内容的语法或表达式。不了解XPath的同学可以自行百度,文章末尾会附上常见的一些用法,欢迎讨论学习。

三、HTML 解析类库之HtmlAgilityPack

那么有了XPath表达式,怎么用在程序里面呢?又一大利器应运而生“HtmlAgilityPack”。在C# 中可通过Nuget进行安装,它的最大作用就是解析html,比正则表达式来更快更精准!在HtmlAgilityPack中常用到的类有HtmlDocument、HtmlNodeCollection、HtmlNode和HtmlWeb等。废话不多说,直接看怎么拿到新闻的主题内容,针对网站不同,可以添加去除不必要的备注和script。

b8af59ada1bf483dac0543e2b503d7c1.png使用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,还有很多就不一一列举了,有熟悉的大神可在评论中分享哦。

103b848b670004d360645959841064aa.pngXPath解析网页

五、总结一下

通过以上介绍,大概流程我们已经清楚了,归纳下来无外乎以下几点:模拟网络请求-->开发者工具Copy XPath-->HtmlAgilityPack解析得到网页内容-->拿到数据为所欲为!

今天的分享到这里就结束了,有很多不足之处,欢迎大家留言指正,我们共同交流,提升!

前期准备工作已经完毕,下一章节将进行项目实战!

我是隔壁老王,爱编程爱学习~_~

60e8233daff46e083a4d5889d9ddf46f.png

举报/反馈

本文内容由网友自发贡献,转载请注明出处:https://www.wpsshop.cn/w/Cpp五条/article/detail/110613?site
推荐阅读
相关标签
  

闽ICP备14008679号