Scrapy 分布式爬虫:基本概念及框架

文章目录

    • 网络爬虫基本概念
      • 基本概念
      • 基本类型
    • 网络爬虫的基本架构
      • 基本架构
      • 架构流程运行流程
    • 各组件详解
      • URL管理器
      • 网页下载器
      • 网页解析器

网络爬虫基本概念

基本概念

网络爬虫的 wiki 定义如下:

网络爬虫(英语:web crawler),也叫网络蜘蛛(spider),是一种用来自动浏览万维网的网络机器人,用来获取万维网上可用的数据。

对于爬虫本身是做什么的,我们都很熟悉,因此这个定义也不言自明。

基本类型

网络爬虫的经历了五个发展历程

  1. 建立索引
    1989年互联网诞生之初没有搜索功能。
    1993年6月产生了第一个万维网漫游器,可以抓取互联网上的所有网页,测量网页大小,同年12月首个基于爬虫的搜索引擎诞生

  2. 2000年网页API和API爬虫
    Salesforce 和 eBay 首先推出自己的API供程序员下载数据使用
    发送一组HTTP请求,然后接收JSON或XML的回馈,为开发人员提供了一种更友好的网络爬虫方式

  3. 2004 年Python Beautiful Soup
    Beautiful Soup可以理解站点的结构,并帮助从HTML容器中解析内容。它被认为是用于网络爬虫的最复杂和最先进的库,也是当今常见和流行的方法之一。

  4. 网络抓取软件的可视化
    为了降低网络爬虫的编码门槛,使更多有数据爬取需求的人能够使用网络爬虫,可视化的网络爬虫软件,它允许用户轻松简单的选择网页内容,并将这些数据构造成可用的excel文件或数据库。

    但是可视化软件的功能始终是有限的,当遇到高定制化、个性化的需求的时候,依然需要专门的爬虫工程师来完成。

网络爬虫的基本架构

基本架构

一个小型的网络爬虫,比如只爬取数个特定页面的爬虫,或许只要一个 py 文件就足以胜任,但是要爬取上百万页面的大型网络爬虫,就需要一定的架构才能更好的完成任务,这样的爬虫基本上框架如下:
Scrapy 分布式爬虫:基本概念及框架_第1张图片

  • 爬虫调度端:来启动爬虫、停止爬虫、监视爬虫的运行情况
  • URL管理器:对将要爬取的和已经爬取的URL进行管理
  • 网页下载器:
    • 从URL管理器中获取一个将要爬取的URL,传给网页下载器
    • 下载器将URL指向的网页下载并存储为一个字符串
  • 网页解析器:
    • 将网页下载器下载下来的字符串进行解析
    • 一方面获取价值数据,另一方面每个URL中往往还有指向其他页面的URL,需要补充到URL管理器中

这四个部分最终组成一个应用程序。

架构流程运行流程

整个爬虫的架构流程如下所示
Scrapy 分布式爬虫:基本概念及框架_第2张图片

  • 调度器询问URL管理器是否有待爬取的URL?
  • URL管理器返回是/否
  • 如果是,调度器会从URL管理器中获取一个待爬取的URL
  • URL管理器将URL返回给调度器
  • 调度器将URL传给下载器对网页内容进行下载
  • 下载好后下载器将URL内容返回给调度器
  • 调度器将URL内容传递给解析器进行网页的解析
  • 解析之后将价值数据和新的URL列表传给调度器
  • 一方面调度器会将价值数据传递给应用进行数据的收集
  • 另一方面将新的URL列表补充进URL管理器
  • 如果URL管理器中还有未爬取的URL,那么将会一直执行上面的循环,直到爬取完所有URL
  • 最后调度器会调用应用的方法将价值数据进行输出,将价值数据输出到需要的格式

各组件详解

URL管理器

  • URL管理器用来管理待抓取URL集合和已抓取URL集合
  • 防止重复抓取和循环抓取
    • 因为每个网页都有很多指向其他网页的URL
    • 其他网页也有指向本网页的URL,就可能存在URL循环指向的问题
  • URL管理器需要支持的最小功能范围
    • 添加新的URL到待爬取集合中
    • 判断待添加的URL是否已经存在容器中
    • 从容器中获取一个待爬取的URL
    • 判断容器中还有没有待爬取的URL
    • 将URL从待爬取集合移动到已爬取集合

URL管理器实现方式介绍:

  1. 将已爬取和未爬取的URL集合都存储在内存中:使用Python的set类型,因为Python的set类型可以自动去除集合中重复的数据元素
  2. 使用关系数据库:比如在MySQL中建立一张表
  3. 缓存数据库,比如使用redis,redis本身就支持set数据结构。目前大型的网络公司因为redis的性能比较高,一般都使用redis。

网页下载器

  • 使用Python自带的urllib2模块或其他下载库

  • 将互联网上URL对应的网页下载到本地的工具,因为将网页下载到本地才能进行后续的分析和处理

  • 类似于网页浏览器,将URL对应的网页下载到本地存储为本地文件或者内存字符串,然后才能进行分析

  • urllib2模块:

    • 支持直接的URL网页下载
    • 或者向网页发送一些需要用户输入的数据
    • 甚至支持需要登录网页的cookie处理、需要代理访问的代理处理
  • requests:第三方插件,功能更强大

网页解析器

可以使用正则表达式、html.parser、BeautifulSoup、lxml 等实现方式。

本人一般使用 xpath 的方式。

你可能感兴趣的:(Python学习,网络爬虫,爬虫,python)