“我们有足够的数据”这句话,在数据科学领域并不存在。
我很少会听到有人拒绝为他们的机器学习或深度学习项目收集更多的数据,往往都是永远觉得自己拥有的数据不够多。
为了缓解这种“数据焦虑”,分析师或数据科学家们练就了必备的技能之一:网站抓取。
用Python执行网站抓取很方便,有大量的库可以使用,但头疼的地方也在于此,如何决定哪一个库适合自己的特定项目?哪个Python库最灵活?
先不直接给出答案,下文所列举的是我认为较为通用的5个Python库,将通过对它们的优劣评估来回答那些疑问。
1.Requests
Requests是一个Python库,用于发出各种类型的HTTP请求,例如GET,POST等。由于其简单易用,它被称为HTTP for Humans。
我想说这是Web抓取最基本但必不可少的库。但是,请求库不会解析检索到的HTML数据。如果要这样做,还需要结合lxml和Beautiful Soup之类的库一起使用(将在本文中进一步介绍它们)。
那Requests Python库有哪些优缺点?
优点:
- 简单
- 基本/摘要身份验证
- 国际域名和URL
- 分块请求
- HTTP(S)代理支持
缺点:
- 仅检索页面的静态内容
- 不能用于解析HTML
- 无法处理纯JavaScript制作的网站
2.lxml
lxml是一种高性能,快速,高质生产力的HTML和XML解析Python库。
它结合了ElementTree的速度和功能以及Python的简单性。当我们打算抓取大型数据集时,它能发挥很好的作用。
在Web抓取的时候,lxml经常和Requests进行组合来使用,此外,它还允许使用XPath和CSS选择器从HTML提取数据。
那lxml Python库的优缺点有哪些?
优点:
- 比大多数解析器快
- 轻巧
- 使用元素树
- Pythonic API
缺点:
- 不适用于设计不当的HTML
- 官方文档不太适合初学者
3.BeautifulSoup
BeautifulSoup也许是Web抓取中使用最广泛的Python库。它创建了一个解析树,用于解析HTML和XML文档。还会自动将传入文档转换为Unicode,将传出文档转换为UTF-8。
在行业中,将“BeautifulSoup”与“Requests”组合在一起使用非常普遍。
让BeautifulSoup备受欢迎的主要原因之一,就是它易于使用并且非常适合初学者。同时,还可以将Beautiful Soup与其他解析器(如lxml)结合使用。
但是相对应的,这种易用性也带来了不小的运行成本——它比lxml慢。即使使用lxml作为解析器,它也比纯lxml慢。
下面来综合看下BeautifulSoup库的优缺点都有哪些?
优点:
- 需要几行代码
- 优质的文档
- 易于初学者学习
- 强大
- 自动编码检测
缺点:
- 比lxml慢
4. Selenium
到目前为止,我们讨论的所有Python库都有一个局限性:不能轻易地从动态填充的网站上抓取数据。
发生这种情况的原因有时是因为页面上存在的数据是通过JavaScript加载的。简单概括就是,如果页面不是静态的,那么前面提到的Python库就很难从页面中抓取数据。
这种情况,就比较适合使用Selenium。
Selenium最初是用于自动测试Web应用程序的Python库,是用于渲染网页的Web驱动程序,也正因如此,在其他库无法运行JavaScript的地方,Selenium就可以发挥作用:在页面上单击,填写表格,滚动页面并执行更多操作。
这种在网页中运行JavaScript的能力,使Selenium能够抓取动态填充的网页。但是这里存在一个“缺陷”,它为每个页面加载并运行JavaScript,会使其运行速度变慢,不适合大型项目。
如果不关心时间和速度,那么Selenium绝对是个很好的选择。
优点:
- 初学者友好
- 自动网页抓取
- 可以抓取动态填充的网页
- 自动化网络浏览器
- 可以在网页上执行任何操作,类似于一个人
缺点:
- 非常慢
- 设置困难
- 高CPU和内存使用率
- 不适用于大型项目
5. Scrapy
现在是时候介绍Python Web抓取库的BOSS——Scrapy!
Scrapy不仅仅单纯是一个库,它是Scrapinghub的联合创始人Pablo Hoffman和Shane Evans创建的整个Web抓取框架,是一款功能完善的网页抓取解决方案,可以完成所有繁重的工作。
Scrapy提供的蜘蛛机器人可以抓取多个网站并提取数据。使用Scrapy,可以创建自己的蜘蛛机器人,将其托管在Scrapy Hub上,或作为API。在几分钟内就可以创建功能齐全的蜘蛛网,当然也可以使用Scrapy创建管道。
关于Scrapy最好的一点在于它是异步的,这意味着可以同时发出多个HTTP请求,能够为我们节省很多时间并提高效率(这不是我们正为之奋斗的吗?)。
我们还可以向Scrapy添加插件来增强其功能。尽管Scrapy无法像selenium一样处理JavaScript,但可以将其与名为Splash的库(轻量级Web浏览器)配对。借助Splash,Scrapy就能实现从动态网站提取数据。
优点:
- 异步
- 优秀的文档
- 各种插件
- 创建自定义管道和中间件
- CPU和内存使用率低
- 精心设计的架构
- 大量可用的在线资源
缺点:
- 学习门槛较高
- 过分的轻松工作
- 不适合初学者
这些是我个人觉得很有用的Python库,如果有其他你使用起来不错的库,欢迎留言评论~
原文链接: