教你用狐表做爬虫获取网页元素。狐表HttpClient+第三方xPath分析工具HtmlAgilityPack

发表日期: 2021-05-24

1简介

爬虫思路:获取网页然后根据dom分析xPath获取相应的元素

  1. 我们使用httpClient,获取网页

  2. 通过HtmlAgilityPack工具解析Dom

  3. 通过xPath提取Dom元素,不需要复杂的正则

HtmlAgilityPack网友总结的方法:https://www.cnblogs.com/mq0036/p/11705424.html

HtmlAgilityPack官网文档:https://html-agility-pack.net/parser


接下来用颜色表做案例

url:http://color.jmtianlu168.com/

file


2.添加dll

2.1下载dll

支持.net 4.0:HtmlAgilityPack.zip

2.2狐表添加引用

把dll拷贝到狐表的程序根目录后,添加引用,并添加命名空间

  1. 命名空间:HtmlAgilityPack

  2. 别名:Hap

2.3重启狐表

重启后检查引用和命名空间是否还存在,存在的话新dll就开始生效了

有可能没添加成功的,认真检查!!

3获取网页

3.1使用狐表的HttpClient

Dim hc As New HttpClient("http://color.jmtianlu168.com/")
hc.SkipError=True
hc.Resp '如果中文乱码,请改为 gbk
Dim hd As new Hap.HtmlDocument
hd.LoadHtml(hc.GetData())

3.2从本地网页获取

Dim s As String = FileSys.ReadAllText("S:\FoxDev\爬虫监控\网页.html",Encoding.UTF8)
Dim hd As new Hap.HtmlDocument
hd.LoadHtml(s)

4获取xPath

4.1基础获取

xPath就是根据dom结构,一层层解析路径,提取元素的方法,基础用法如下:(具体可以去w3cSchool看)

我们在谷歌浏览器按F12,打开控制台

file

得到有偏差的xPath

/html/body/table/tbody/tr[4]/td[4]

4.2路径修正

用F12获取的的xPath多数会有偏差,你可以右键看下源代码,dom结构是否真的如此

file

file

其实这里源代码界面能发现,并没有html和body,真实的xPath是

/table/tbody/tr[4]/td[4]

差异的原因:因为chrome会对页面进行一定的修正处理,加上现在很多是ajax异步获取,你用代码请求的dom和当前浏览器展示的dom不一定完全一致,所以这个xPath仅供调试参考,实际上都要进行修正的

最常见的例子,就是tbody是要去掉的


调试方法:

可能你会问,我怎么分析啊?

第一步,必须右键查看页面源码,自己分析结构,判断问题出在哪里,最好配合HbuilderX之类的代码整理,更清晰的查看结构

file


第二步:你可以先到xPath在线小工具http://www.ab173.com/other/xpath.php

把网页源代码粘贴进去,测试下你的xPath,然后利用步进逼近

注意的坑:xPath的路径,是从1开始,而不是从0开始,例如div[1]

file


/html
/html/body
/html/body/form
/html/body/form/div[2]
//等等逼近你想要的...

5获取节点

5.1获取首个节点

Dim xPath As String = "/table/tbody/tr[4]/td[4]"
Dim hn As Hap.HtmlNode = hd.DocumentNode.SelectSingleNode(xPath)
If hn IsNot Nothing Then
    Output.Show("InnerHtml:" & hn.InnerHtml)
End If

输出结果:

InnerHtml:脸红的淡紫色

注意的坑:由于xPath不一定正确,所以获取回来的可能是Nothing,记得做判断

5.2获取某个节点的相关属性

基础用法:

Dim xPath As String = "/table/tbody/tr[4]/td[4]"
'获取该节点的父节点
Dim hn As Hap.HtmlNode = hd.DocumentNode.SelectSingleNode(xPath)
If hn IsNot Nothing Then
    hn = hn.ParentNode
    Output.Show("Parent的OuterHtml:" &  hn.OuterHtml)
End If

类似的用法,还有

方法名作用
FirstChild获取首个子节点
LastChild获取最后一个子节点
OuterHtml获取整个节点的html代码
InnerHtml获取<>夹住的内部Html代码
InnerText获取<>夹住的内部无html的纯文本
Name获取Html元素名
Attributes  获取节点的属性集合

扩展获取class:

获取class之类的属性值

Dim xPath As String = "/table/tbody/tr[4]/td[4]"
Dim hn As Hap.HtmlNode = hd.DocumentNode.SelectSingleNode(xPath)
If hn IsNot Nothing Then
    Dim hars As Hap.HtmlAttributeCollection = hn.Attributes
    Output.Show(hars.Count)
    For Each har As Hap.HtmlAttribute In hars
        Output.Show(har.Name & ":" & har.Value)
    Next
End If

输出结果:

1
style:text-align: center;

5.3获取某节点的子节点的集合

Dim xPath As String = "/table/tbody/tr[4]/td[4]"
Dim hn As Hap.HtmlNode = hd.DocumentNode.SelectSingleNode(xPath)
Dim CNodes As Hap.HtmlNodeCollection = hn.ChildNodes
Output.Show(CNodes.Count)
For Each hn2 As Hap.HtmlNode In CNodes
    Output.Show("InnerHtml:" & hn2.InnerHtml)
Next

5.4获取某个节点集合

Dim xPath As String = "/table/tbody/tr[4]/td[4]"
Dim CNodes As Hap.HtmlNodeCollection  = hd.DocumentNode.SelectNodes(xPath)
Output.Show(CNodes.Count)
For Each hn As Hap.HtmlNode In CNodes
    Output.Show("InnerHtml:" & hn.InnerHtml)
Next

6我要说几句

  1. 爬虫有一定法律风险,请合理利用

  2. 狐表不是专业的爬虫工具,建议只用在简单的网页,更复杂的交互网站,建议学习专业的python爬虫工具

  3. 很多网站有反爬和ip监控,如果你想去爬淘宝、京东,尤其是美团,做梦!

  4. 网站变动,xPath很大可能会变动,就会需要重新编写路径



随便看看

Copyright © 2016-2022 江门蓬江区华越科技公司 版权所有 | 承接软件定制开发,欢迎联系
粤ICP备17073215号