网页爬虫简单学习

优采云 发布时间: 2022-08-16 10:01

  网页爬虫简单学习

  最近因工作需求,需要使用爬虫去采集数据,下面介绍一下我用到过的 Beautiful Soup 库和 XPath。

  Beautiful Soup

  Beautiful Soup 是 python 的一个库,最主要的功能是从网页抓取数据。官方解释如下:

  Beautiful Soup 提供一些简单的、python 式的函数用来处理导航、搜索、修改分析树等功能。它是一个工具箱,通过解析文档为用户提供需要抓取的数据,因为简单,所以不需要多少代码就可以写出一个完整的应用程序。Beautiful Soup 自动将输入文档转换为 Unicode 编码,输出文档转换为 utf-8 编码。你不需要考虑编码方式,除非文档没有指定一个编码方式,这时,Beautiful Soup 就不能自动识别编码方式了。然后,你仅仅需要说明一下原始编码方式就可以了。Beautiful Soup 已成为和 lxml、html6lib 一样出色的 python 解释器,为用户灵活地提供不同的解析策略或强劲的速度。

  Beautiful Soup 将复杂 HTML 文档转换成一个复杂的树形结构,每个节点都是 Python 对象,所有对象可以归纳为 4 种:

  Tag:

  通俗点讲就是 HTML 中的一个个标签。

  NavigableString:

  获取标签内部的文字。

  

  BeautifulSoup:

  BeautifulSoup 对象表示的是一个文档的全部内容。大部分时候,可以把它当作 Tag 对象,是一个特殊的 Tag,我们可以分别获取它的类型,名称,以及属性。

  Comment:

  Comment 对象是一个特殊类型的 NavigableString 对象,其实输出的内容仍然不包括注释符号,但是如果不好好处理它,可能会对我们的文本处理造成意想不到的麻烦。我们找一个带注释的标签。

  lxml

  BeautifulSoup 已经是非常强大的库了,不过还有一些比较流行的解析库,例如 lxml,使用的是 Xpath 语法,同样是效率比较高的解析方法。lxml 用法源自 lxml python 官方文档,更多内容请直接参阅官方文档。

  XPath 语法

  XPath 是一门在 XML 文档中查找信息的语言。XPath 可用来在 XML 文档中对元素和属性进行遍历。XPath 是 W3C XSLT 标准的主要元素,并且 XQuery 和 XPointer 都构建于 XPath 表达之上。

  <br /><br /> Harry Potter<br /> J K. Rowling<br /> 2005<br /> 29.99<br /><br />

  这里就大致简单介绍一下,关于这两个库的用法在网上一搜即可。

  

  BeautifulSoup 是一个库,而 XPath 是一种技术,python 中最常用的 XPath 库是 lxml,这两者应该怎么取舍,可以根据实际情况和以下对比来决定。

  BeautifulSoup 和 lxml 的原理不一样,BeautifulSoup 是基于 DOM 的,会载入整个文档,解析整个 DOM 树,因此时间和内存开销都会大很多。而 lxml 只会局部遍历,另外 lxml 是用 C 写的,而 BeautifulSoup 是用 python 写的,因此性能方面自然会差很多。

  BeautifulSoup 用起来比较简单,API 非常人性化,支持 css 选择器。lxml 的 XPath 写起来麻烦,开发效率不如 BeautifulSoup。例如:

  title = soup.select('.content div.title h3')

  同样的代码用 Xpath 写起来会很麻烦:

  title=tree.xpath("//*[@class='content']/div[@class='content']/h3")

  如果在提取某个页面的某个标签的 xpath 路径的话,可以如下图:

  个人觉得 BeautifulSoup 与 xpath 相比,优势就是无需考虑文档结构。只需要找元素对应的 CSS 就可以。xpath 比较恶心人的地方就在于你要确保元素路径的准确,所以有的时候调试起来还是有点儿麻烦的。

  如果你要采集的图片、商品说明、价格、划线价格、备注等等都有不同的 CSS 属性,那 BeautifulSoup 用起来最舒服。当然,也包括小说网站等等,总之,你要采集的数据根据 CSS 有典型的规律性的,可以首选 BeautifulSoup。但如果一个页面有三个表格,而且表格中的文字和属性都有重复的。显然无法使用 CSS 属性或条件表达式将其区分开。那就只能用 xpath 了。

  而 xpath 可能遇到的是,浏览器渲染网页时会自动补全源码中缺少的标签,你在浏览器开发者工具中看到的源码和请求的源码不一定是一样的,你用开发者工具中的功能复制的路径也不一定是对的。比如有些网页的表格会不写tbody 标签,直接 th、tr、td。浏览器在渲染时会自动把 tbody 补全到源码里,但是你请求的源码里是没有的。

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线