大部分程序开发者应该都有过爬取网页的经历,每个人爬取的方法也不太相同,有的用强大的正则表达式,有的用selector,有的也会用第三方提供的插件等等。每种方法都有各自的优缺点,比如正则的抓取效率问题但是通用性强,selector上手难度,插件类比如simple_dom_php抓取不到直接error退出进程问题等等。这里不做过多评价,只介绍一个好用的、强大的、易上手的抓取工具xpath。
什么是xpath
一句话,
XPath 是一门在 XML 文档中查找信息的语言。简单来说,html类似于xml结构,但是没有xml格式那么严格。
十分钟入门xpath
入门用法,如何抓取百度首页图片链接
使用谷歌浏览器获取需要抓取元素的xpath路径
![](https://i-blog.csdnimg.cn/blog_migrate/1f5121fb69b2880b377e4b31cf3cc134.gif)
把自动生成的路径拷贝到代码中(ps:这里把网页代码保存在了本地!)
![](https://i-blog.csdnimg.cn/blog_migrate/873e62c8e19c6d04361dfcd0e7025d33.png)
运行查看结果
![](https://i-blog.csdnimg.cn/blog_migrate/8618d34406283a0cd8d0d372e6badb30.png)
第二步:掌握基本语法,xpath语法类似于路径选择,非常容易上手
以下图html举例如何获取不同的节点:
![](https://i-blog.csdnimg.cn/blog_migrate/911471f89336310a876312c3fa067eec.png)
方法一:根据路径获取节点信息
![](https://i-blog.csdnimg.cn/blog_migrate/992cd322ecb4c72026d9098d9057c32d.png)
方法二:根据属性值快速选取节点
![](https://i-blog.csdnimg.cn/blog_migrate/4f931fcb3d770943d5fd4f344cde27c6.png)
掌握以上几种常用法,基本上就可以快速开发一个页面的抓取功能了,是不是非常简单,赶紧自己动手试试吧。更深入的用法无非是在上面基础上加了一些函数操作,具体可以搜索xpath教程,这里只做入门,不再深入介绍。
性能如何?
这里我使用上述html建立了以下基准进行测试:
1、使用PHP语言 (php版本5.4.41)
2、选取相同网页,约20W字符 (www.baidu.com)
3、各抓取一千次 (循环一千次,抓取所有img标签的图片地址)
分别用正则和xpath进行抓取,比较处理时间。
首先定义两个抓取方法:
![](https://i-blog.csdnimg.cn/blog_migrate/ed61d4f40f01eda6054efe79d4c90eff.png)
循环调用一千次,得出结论:本次测试,xpath爬取可以做到秒级;正则是分钟级别
说明:上述测试基准可能不太明确,但是差异较大已经足够得到我们需要的对比结果。
总结一下:
XPath的优势在于它的速度,这是因为它把html以树形的结构进行存储,在你通过层级关系查找节点的时候,并不需要对所有字符串进行遍历,它的底层是通过libxml构建一棵DOM树实现的查找。
XPath其实并不容易掌握(ps:我的意思是要深入掌握),它的语法和函数都非常多,学习起来成本也比较高,但是在普通的抓取业务中,只需要掌握一些基本的就足够了。
XPath的语法和规则跟语言是无关的。
这里只讨论了xpath对单个网页的爬取新的基本方法,帮助开发人员快速抓取网页中的信息。因为简单快速,适用范围必然比不上强大的正则表达式,可以根据各自的应用场景选择。