1 简介
在本教程中,我们将会讨论Scrapy
和BeautifulSoup
,比较它们有何不同,从而帮助你们来做出选择,哪一个对于你们的实际项目中是最合适的.
2 关于BeautifulSoup
BeautifulSoup
是一个帮助程序员快速从网页中提取有效数据的工具,它的api对新手开发人员非常友好,而且它还可以很好地处理格式错误的标记。但是,在大多数情况下,单独依靠BeautifulSoup
本身无法完成任务,你需要使用另一个包(如urlib2
)或requests
来帮助你下载网页,然后就可以使用BeautifulSoup
来解析html源代码。BeautifulSoup
的文档非常全面,你可以在那里得到很多参考示例,并迅速学会如何使用它。
BeautifulSoup
在Python 2
和Python 3
上运行良好,因此兼容性不成问题,下面是BeautifulSoup
的一个代码示例,正如你所看到的,它非常适合初学者。
from bs4 import BeautifulSoup
soup = BeautifulSoup(html_doc, 'html.parser')
for link in soup.find_all('a'):
print(link.get('href'))
# http://example.com/elsie
# http://example.com/lacie
# http://example.com/tillie
3 关于Scrapy
Scrapy
是一个web爬行框架,开发人员可以编写代码来创建spider
,它定义了某个站点(或一组站点)将如何被爬行。最大的特点是它建立在Twisted
(一个异步网络库)上,所以Scrapy
是使用非阻塞(又称异步)代码来实现并发的,这使得sspider
的性能非常好。
对于那些不知道什么是异步的人,这里有一个简单的解释。
当你同时做某件事时,你要等到它完成后再去做另一件事,这是同步。当你异步执行某个任务时,可以在它完成之前转到另一个任务,这是异步。
Scrapy
在Python 2
和Python 3
上也能很好运行,因此兼容性也不成问题。它内置了使用xpath
表达式和css
表达式从html源提取数据的支持。
4 如何选择在BeautifulSoup和Scrapy之间选择?
存在这两个python web抓取工具的原因是为了执行不同需求下的任务。BeautifulSoup
只用于解析html和提取数据,Scrapy
用于下载html、处理数据和保存数据。
当你比较BeautifulSoup
和Scrapy,找出哪个是最适合你的项目,你应该考虑很多因素。
4.1 学习曲线
BeautifulSoup
非常容易学习,你可以快速使用它来提取你想要的数据,在大多数情况下,你还需要一个下载程序来帮助你获取html源代码,强烈建议使用requests
包而不是内置Python
库中的urllib2
来实现此功能。
由于Scrapy
不仅处理内容提取,还处理许多其他任务,如下载html,因此Scrapy
的学习曲线要陡峭得多,因此需要阅读一些Scrapy
教程或Scrapy
文档来了解它的工作原理,并努力成为一名Scrapy
高手。
如果你是一个新手,没有太多编程经验,想完成一个小项目,BeautifulSoup
应该是你较好的选择,因为它比较容易上手。
4.2 周边生态
以前很少有人在比较web抓取工具时讨论过这个问题。想想为什么人们喜欢使用Wordpress
来构建CMS
(开源内容管理系统)而不是其他框架,关键是生态系统。如此多的主题,插件可以帮助人们快速建立一个符合要求的CMS。
Scrapy
有很多相关的项目,插件开源在Github上,还有很多关于stackoverflow的讨论可以帮助你解决潜在的问题。例如,如果你想要在你的爬虫项目中使用代理,你可以找到项目scrapy-proxies
,利用代理帮助你从列表中使用随机代理发送HTTP请求,完成这些,你只需要改一些配置。这就是生态带来的好处,不用从头造轮子.
4.3 可扩展性
Scrapy
的体系结构设计良好,可以方便地开发自定义中间件或管道来添加自定义功能。因此scrapy创建的项目可以既健壮又灵活。在开发了几个棘手的项目之后,你将受益于架构和它的设计,因为很容易从现有的Scrapy
爬虫项目迁移到另一个。
所以,如果你的项目很小,逻辑不是很复杂,你想快速完成工作,你可以使用BeautifulSoup
简单的实现项目。如果你的项目需要更多的定制,比如代理、数据管道,那么你可以选择Scrapy
。
4.4 性能
有了Scrapy
,爬虫项目可以同时发出许多请求,所以你需要设置下载延迟(download_delay
),在大多数情况下,以避免被禁止爬取数据,从而网页可以被迅速抓取。然而,BeautifulSoup
并没有这个特点,所以很多人说BeautifulSoup
很慢。实际上,这是错误的,你可以导入multiprocessing
来加快整个进程,说道这里,许多使用BeautifulSoup
的人可能不知道如何使用multiprocessing
。
所以如果你想开发一个高效并发的爬虫项目,可以在短时间内抓取许多数据集,Scrapy
可以节省你很多时间。如果你不是有经验的python开发人员,那么在这里不应该选择BeautifulSoup
。
5 总结
哪一个更好?没有可靠的答案,答案很大程度上取决于实际情况。下面是一个快速参考表。
Scrapy vs BeautifulSoup
简而言之,如果你在编程方面没有太多经验,项目非常简单,那么BeautifulSoup
可以是你的选择。如果你想要一个更强大、更灵活的网络爬虫,或者你确实有编程经验,那么Scrapy
绝对是这里的赢家。
6 参考资料
- Scrapy vs BeautifulSoup
- Scrapy Doc
- Beautiful Soup Doc
- 其他文章
- BeautifulSoup4 vs Scrapy
- When should you use Scrapy over BeautifulSoup?