为什么写这篇短文

  1. 最近在做一个 DL×CV 的 proj,需要大量的广东美食图片数据,刚好写一发爬虫。
  2. 发现身边很多同学突然看起了 python,而上手 proj 就是写爬虫,然而网上资料纷繁复杂,纠结是用 bs 还是 scrapy。

这里的介绍非常简要,涉及深层姿势的部分请出门右拐官网。

一些背景姿势

在 bs 和 scrapy 之间做选择前,首先当然要了解他们是什么,差别何在。

  • Scrapy 是一个非常成熟的工具包,你只要写很少的东西就能达到你要的效果——创建一个 spider 下载网页并提取其中有用的数据。
  • BeautifulSoup 则是一个面向网页的工具,它能够解析 DOM 树并提取某些特定的节点(比如 <img>,<p> 等)。

也就是说,只用 bs 是做不了爬虫的,必须要引入 requests 之类的包用来下载网页,这样 bs 才能对网页进行解析。

所以,二者差别其实挺大的:

  • Scrapy 用于从网络上下载,清洗,存储数据,而且内置了很多代码节约你的编写时间。
  • 而 BeautifulSoup 仅仅只是对网页进行解析抽取。

如何选择呢?

如果你是想快速撸出一个爬虫,Scrapy 当仁不让。它已经帮你解决了大量的本该由你自己解决的问题,比如:

  • 爬取的数据格式错综复杂,Scrapy 能让你用很短的代码完成数据的格式化。
  • Scrapy 容错率很高,当出现服务器错误、页面未找到等错误时,你可以通过内置的 tools 轻松返回上一步,跳过或重试该处错误。
  • 有的页面需要登录才能访问,Scrapy 内置了优雅的 login 工具,在 scrape 前就能处理好登录动作。
  • 有的网站经常改变其布局格式,而 Scrapy 支持 Sensible Spiders,即分离出了布局格式的逻辑,使得我们不需要经常维护修改 spider 来支持变幻无常的页面。
  • 有的网站限流,有时超出限定则会锁 ip。Scrapy 内置了控制流速的功能,能轻松调控爬取速度。
  • Scrapy 支持多线程,同时能发出多个 requests,提升了速度。

人生苦短不如 python,既然都选择 py 了,为什么不选择用更方便的 Scrapy 呢?

当然,Scrapy 如此方便当然也意味着你的自由度下降了,如果你并不需要以上说的那些特性,如果你希望写出更加自由的爬虫,如果你要深入了解爬虫的内部结构,当然还是推荐用 bs + requests + coroutine 之类的东西慢慢折腾啦。