Scrapy、Beautiful Soup 和 Selenium 是三种流行的网络爬取工具。如果您不熟悉数据爬取,或者只是还没有尝试过所有的数据爬取,您可能会发现很难确定您需要哪一个。本指南简要介绍了它们的功能以及每种工具最适合使用的情况。如果你赶时间,可以直接跳到下面的比较表。
Scrapy——一个用于大规模数据采集的完整包
Scrapy 是所谓的网络爬行和爬取框架。与其他一些工具不同,它不需要任何其他依赖项即可工作(除非您正在处理 JS)。换句话说,它包含您爬取页面、下载和解析以及最终存储您爬取的数据所需的一切。
Scrapy 是基于 Python 的开源软件。这两个特性使它成为网络爬取的流行选择,这意味着您会找到很多关于使用它的信息:通过阅读全面的文档和咨询 StackOverflow 等网站上的其他爬取工具。
通过设计,Scrapy 被设计成具有极大的可扩展性。除了丰富的基本功能外,它还支持中间件和扩展,这两者都为 Scrapy 脚本(也称为蜘蛛)带来了自定义功能。该框架允许添加代理、控制爬网深度、cookie 和会话处理。甚至还有一个交互式控制台,用于查看您是否实时选择了正确的 CSS 或 XPath 表达式。总之,Scrapy 很强大。
Scrapy 最好的特性之一是它可以异步处理和处理请求。因此,您可以一次从多个页面中提取数据,这使得该框架速度非常快,非常适合大规模爬取。
然而,所有这些功能和可扩展性意味着Scrapy 并不是最容易使用的工具。尽管有大量的文档,您还是必须投入大量时间才能掌握窍门。
它也不会开箱即用地呈现 JavaScript ,因此您必须为此使用像 Puppeteer、Splash 或 Selenium 这样的无头浏览器。
总的来说,如果你有一个大型的网络爬取项目要做,或者打算在未来进行大规模爬取, 你应该看看 Scrapy 。
Beautiful Soup——适合初学者和小型工作的简单解析器
正如 Beautiful Soup 的开发人员所说,他们来这里是为了帮助您从写得糟糕的页面中提取数据。他们通过为您提供基于 Python 的数据解析库来做到这一点。
从本质上讲,这就是 Beautiful Soup——一个构建 HTML 或 XML 页面、选择您需要的数据并帮助您以适当格式提取数据的库。与 Scrapy 不同的是,它不能爬取页面或发出 GET 请求。因此,您必须使用另一个库(如 Requests)来实现这一点。
实际上,Beautiful Soup 不是一个解析器,而是一个. 它在后端使用 html.parser、HTML5lib 和 lxml,因此您可以尝试各种解析方法。例如,lxml 是最快的,而 HTML5lib 速度较慢但非常灵活。
Beautiful Soup 最大的好处是它使用起来非常简单:你可以在几分钟内用几行代码编写一个基本的爬虫。它也不容易折断。这些功能使 Beautiful Soup 在网络爬取工具中具有极大的吸引力,因此您可以从出色的文档和活跃的在线开发人员社区中受益。
Beautiful Soup允许并行化请求。但是设置起来不是很容易,速度上还是比不上Scrapy。
总的来说,Beautiful Soup 是一次性或小型网络爬取作业的绝佳选择,在这些作业中您不需要持续地大规模提取数据。
Selenium——一个用于依赖 JavaScript 的页面的 Web 驱动程序
Selenium 是一种API,可让您以编程方式控制无头浏览器。它的主要目的是帮助进行自动化网络测试,但 Selenium 也在网络爬取中发挥了作用。原因很简单——它能够处理 JavaScript 。
这些年来,越来越多的网站引入了依赖 JS 来工作的功能。一些例子可能是异步加载或那些你可以无限滚动的无底页面。常规的网页爬取脚本无法爬取嵌套在 JavaScript 元素中的内容,因此您需要先加载整个页面。能够这样做是 Selenium 声名鹊起的原因。
除了作为 JavaScript 问题的早期解决方案之外,Selenium 的用途也非常广泛。它运行在多种编程语言上,包括 Python、Java、Ruby 和 node.js。它可以控制所有主流浏览器:Chrome、Firefox,甚至 Internet Explorer。作为一个主要工具,它有一个庞大的社区,有着悠久的问题和解决方案历史。
Selenium 让您不仅可以加载网站,还可以与其进行交互:模拟操作、填写表格、单击按钮以及执行其他操作。换句话说,它包括适当的无头浏览器的全部功能。
然而,正是因为它控制着整个无头浏览器,Selenium 对资源的要求并不低。多线程的唯一方法是启动一个新的浏览器实例,这无济于事。效率根本不存在。如今,可以说有更好的无头网络爬取选择,例如 Puppeteer 或 Playwright。
尽管如此,如果您需要爬取少量到中等数量的依赖于 JavaScript 的页面, Selenium 仍然是一个不错的选择。否则,你最好有足够的计算能力,否则你的爬取会变得很慢。
比较三个选择
这是一张简短的表格,并排显示了 Scrapy、Beautiful Soup 和 Selenium 的主要特性:
Scrapy | Beautiful Soup | Selenium | |
网页爬取 | 是的 | 不 | 是的 |
数据解析 | 是的 | 是的 | 是的 |
数据存储 | 是的 | 不 | 是的 |
异步 | 是的 | 不 | 不 |
JavaScript 渲染 | 使用外部库 | 不 | 是的 |
选择器 | CSS、XPath | CSS | CSS、XPath |
代理 | 是的 | 使用外部库 | 是的 |
表现 | 快速地 | 平均的 | 慢的 |
可扩展性 | 高的 | 有限的 | 有限的 |
学习曲线 | 陡峭 | 简单的 | 陡峭 |
最适合 | 持续的大型爬取项目 | 小型到一般的爬取项目 | 需要 JavaScript 的中小型爬取项目 |
常见问题
1. Scrapy 比 Selenium 快吗?
是的。Scrapy不需要渲染整个页面,而且它是异步的,所以比Selenium快得多。
2. Selenium 适合网页爬取吗?
虽然 Selenium 并非专为网络爬虫设计(而是用于自动化测试),但它对于那些依赖 JavaScript 的网站来说也能很好地进行数据爬取。
3. 初学者应该选择哪种工具?
Beautiful Soup是最适合初学者尝试网络爬虫的选择。再加上像Requests这样的请求库,你很快就能编写简单的网络爬虫脚本。