在数据科学领域,对于机器学习或深度学习项目来说,数据的收集是至关重要的。有时,手头的数据量不足以支撑项目,这时网络爬虫技术就显得尤为重要。网络爬虫是一种通过程序从网络上提取结构化或非结构化数据并导出到有用格式的技术。对于任何分析师或数据科学家来说,掌握网络爬虫技术是必备的技能,这将在行业中为带来优势(当然也包括面试时!)。
网络爬虫是利用程序从网络上提取数据的过程。如果想了解更多关于网络爬虫的信息,以下是一些资源:
让从最基本的Python网络爬虫库开始。Requests库允许向网站的服务器发送HTML请求以检索页面上的数据。获取网页的HTML内容是网络爬虫的第一步。Requests是一个用于发起各种HTTP请求(如GET、POST等)的Python库,因其简单易用而被称为“人类的HTTP”。
Requests库是最基础但也是必不可少的网络爬虫库。然而,Requests库不解析检索到的HTML数据。如果想要解析HTML,需要像lxml和BeautifulSoup这样的库(将在本文后面介绍它们)。
以下是Requests Python库的优点和缺点:
缺点:
知道Requests库不能解析从网页检索到的HTML。因此,需要lxml,这是一个高性能、极快、生产质量的HTML和XML解析Python库。它结合了Element trees的速度和力量以及Python的简单性。当目标是抓取大型数据集时,它工作得很好。
requests和lxml的组合在网络爬虫中非常常见。它还允许使用XPath和CSS选择器从HTML中提取数据。以下是lxmlPython库的优点和缺点:
缺点:
BeautifulSoup可能是最广泛使用的Python网络爬虫库。它创建了一个解析树来解析HTML和XML文档。BeautifulSoup自动将传入的文档转换为Unicode,将传出的文档转换为UTF-8。
BeautifulSoup库之所以如此受欢迎,主要是因为它易于使用,非常适合初学者。还可以将BeautifulSoup与其他解析器如lxml结合使用。但所有这些易用性都是有代价的——它比lxml慢。即使使用lxml作为解析器,它也比纯lxml慢。
BeautifulSoup库的一个主要优点是它能够很好地处理设计不良的HTML,并且具有很多功能。BeautifulSoup和Requests的组合在行业中相当常见。以下是BeautifulSoup库的优点和缺点:
缺点:
讨论的所有Python库都有一个限制——不能轻易地从动态生成的网站上抓取数据。这是因为有时页面上的数据是通过JavaScript加载的。简单地说,如果页面不是静态的,那么前面提到的Python库在抓取数据时就会遇到困难。
这就是Selenium发挥作用的地方。Selenium是一个最初为自动化测试Web应用程序而创建的Python库。尽管它最初并不是为网络爬虫而设计的,但数据科学社区很快就扭转了这一局面!
它是一个用于渲染网页的Web驱动程序,但这个功能使它非常特别。其他库无法运行JavaScript,而Selenium却能。它可以在页面上点击、填写表单、滚动页面等等。
这种在网页上运行JavaScript的能力使Selenium能够抓取动态生成的网页。但这里有权衡。它为每个页面加载和运行JavaScript,这使得它变慢,不适合大型项目。
如果时间和速度不是关心的问题,那么绝对可以使用Selenium。以下是Selenium的优点和缺点:
缺点:
Scrapy提供了可以爬取多个网站并提取数据的蜘蛛机器人。使用Scrapy,可以创建蜘蛛机器人,将它们托管在Scrapy Hub上,或者作为一个API。它允许在几分钟内创建完全功能的蜘蛛。
还可以在使用Scrapy时创建管道。Scrapy最好的事情是它是异步的。它可以同时进行多个HTTP请求。这为节省了很多时间,提高了效率(难道不都追求这个吗?)。
还可以向Scrapy添加插件以增强其功能。尽管Scrapy不能像selenium那样处理JavaScript,但可以将它与一个名为Splash的轻量级Web浏览器库配对。有了Splash,Scrapy甚至可以从动态网站中提取数据。