网络爬虫是什么,Scrapy又是什么?

在介绍数据可视化分析时,最后一个示例示范了展示从网络上获取的天气信息。从广义上说,那个例子也属于网络爬虫,程序可以自动获取多个页面中的所有天气信息。如果使用某种技术(如正则表达式、XPath 等)来提取页面中所有的链接(<a.../> 元素),然后顺着这些链接递归打开对应的页面,最后提取页面中的信息,这就是网络爬虫。

既然前面己经介绍了网络爬虫的知识,那么本章还有存在的意义吗?在回答这个问题之前,我们来分析网络爬虫具体要做哪些核心工作:
  • 通过网络向指定的 URL 发送请求,获取服务器响应内容。
  • 使用某种技术(如正则表达式、XPath 等)提取页面中我们感兴趣的信息。
  • 高效地识别响应页面中的链接信息,顺着这些链接递归执行此处介绍的第 1、2、3 步;
  • 使用多线程有效地管理网络通信交互。

如果直接使用 Python 内置的 urllib 和 re 模块是否能写出自己的网络爬虫呢?答案是肯定的,只是比较复杂。就像我们要从广州去韶关,走路可以去吗?答案是肯定的,只是比较麻烦。

下面继续分析网络爬虫的核心工作:
  • 向 URL 发送请求,获取服务器响应内容。这个核心工作其实是所有网络爬虫都需要做的通用工作。一般来说,通用工作应该由爬虫框架来实现,这样可以提供更稳定的性能,开发效率更高。
  • 提取页面中我们感兴趣的信息。这个核心工作不是通用的!每个项目感兴趣的信息都可能有所不同,但使用正则表达式提取信息是非常低效的,原因是正则表达式的设计初衷主要是处理文本信息,而 HTML 文档不仅是文本文档,而且是结构化文档,因此使用正则表达式来处理 HTML 文档并不合适。使用 XPath 提取信息的效率要高得多。
  • 识别响应页面中的链接信息。使用正则表达式可以实现这个核心工作,但是效率太低,使用 XPath 会更高效。
  • 多线程管理:这个核心工作是通用的,应该由框架来完成。

现在来回答上面提出的问题,本章有存在的意义吗?当然有,本章并不介绍使用 urllib、re 模块这种简陋的工具来实现正则表达式,而是通过专业的爬虫框架 Scrapy 来实现爬虫。

Scrapy 是一个专业的、高效的爬虫框架,它使用专业的 Twisted 包(基于事件驱动的网络引擎包)高效地处理网络通信,使用 lxml(专业的 XML 处理包)、cssselect 高效地提取 HTML 页面的有效信息,同时它也提供了有效的线程管理。

一言以蔽之,上面列出的网络爬虫的核心工作,Scrapy 全部提供了实现,开发者只要使用 XPath 或 css 选择器定义自己感兴趣的信息即可。