热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Scrapy1.强大与全面的Python爬虫开源框架

本文地址:https:www.jianshu.comp4cccd00072f8图标.png简介Scrapy是一个开源的爬虫框架,目前在Python爬虫领域基本处于一家独大的地位,只

本文地址:https://www.jianshu.com/p/4cccd00072f8

《Scrapy-1.强大与全面的Python爬虫开源框架》 图标.png

简介

Scrapy是一个开源的爬虫框架,目前在Python爬虫领域基本处于一家独大的地位,只要说起Python的开源爬虫框架,那基本指的都是Scrapy

Scrapy的官网上,则宣称的是Scrapy是一个快速、简单、容易扩展的爬虫框架。Scrapy确实是容易扩展的,通过各种管道(Pipeline)和中间件(Middleware),能够非常方便的扩展Scrapy的功能。但其实相对来说,做一些简单的、抓取量小的任务时,Scrapy是比较笨重的,这种任务更适合使用Requests去做。

而如果你抓取的数据量较大的话,使用Scrapy是非常合适的,因为底层是基于Twisted,所以Scrapy是天生异步的,就基本不用再去额外的考虑并发的问题了。同时它提供了对于爬虫来说非常全面的功能,而且扩展功能跟二次定制也很方便。配合类似于Scrapy-redis之类的库也可以很简单的实现分布式的爬虫。

安装

在Linux以及Mac系统上,安装Scrapy非常方便,使用pip安装即可:

pip install Scrapy

但是如果在windows系统上安装的话,会遇到一个非常麻烦的问题,Scrapy的依赖库Twisted安装不上,会导致安装失败。这个问题可以用以下办法解决。

  1. 到下面这个网址去下载Twisted已经编译好的wheel文件安装,安装好后再使用pip安装Scrapy

    https://www.lfd.uci.edu/~gohlke/pythonlibs/

    wheel文件的安装方法请自行百度。

架构

Scrapy的整体运行流程如下图所示:

《Scrapy-1.强大与全面的Python爬虫开源框架》 架构图.png

组件

Scrapy的很大一个优点就是其组织架构清晰,整体结构由一个个组件构成,每个组件负责各自的功能。

其主要的运行流程中有如下几个最主要的组件:

  • Engine

    引擎,整个爬虫系统的数据流程处理,都由Engine来进行触发 ,是Scrapy的核心。

  • Scheduler

    调度器,负责维护Request的队列,将Engine传递过来的Request放入队列之中,并在Engine请求时将一个Request交给Engine

  • Downloader

    下载器,根据接收到的Request,去下载相应的网页内容,并生成Response返回给Spider

  • Spider

    爬虫,这个部分常常由我们自己编写,在Spider中需要定义网页抓取和解析的所有流程和规则。

  • Item

    数据,也就是在Spider中抓取网页并解析后,我们最终要获得的数据结果,在Scrapy中专门定义了这样一个数据结构用于保存抓取到的数据。格式和使用方式与字典类似。

  • Item Pipeline

    数据管道,负责处理在Spider中得到的Item。这个Pipeline主要用处就是清洗数据,处理数据,存储数据。

  • Downloader Middleware

    下载器中间件,处于DownloaderEngine之间。

  • Spider Middleware

    爬虫中间件,处于SpiderEngine之间。

数据流

Scrapy中,数据流基本由Engine控制,Engine就好像一颗心脏,不断地推动整个数据流的流动。以下是数据流的基本流程:

  1. Engine首先会打开一个起始url,并找到相对应的Spider来处理这个url访问返回的响应结果。

  2. Spider的处理过程中,会将接下来要访问的url包装成Request,Engine会将Request从Spider取出,交给Scheduler进行调度。

  3. EngineScheduler获取一个Request。

  4. Engine将获取到的Request经由下载器中间件(Downloader Middleware)发送给Downloader进行下载并生成相应的Response。

  5. EngineDownloader获取一个Response。

  6. Engine将获取的Response经由爬虫中间件(Spider Middleware)发送给相对应的Spider,由Spider来对Response进行解析。

    在解析过程中,可能会产生两种产物,一种是Item,一种是Request。产生的Request会再次沿着步骤1的流程运行下去,而产生的Item则会进入下一步。

  7. EngineSpider获取一个Item

  8. Engine将获取的Item发送给Item Pipeline进行相对应的存储、清洗等处理。

    Item Pipeline处理的过程中,同样可能会生成新的Request,这时候生成的Request会直接放入Scheduler中,从步骤3再次执行下去。

使用方式

Scrapy的主要使用方式是命令行,例如,开始一个Scrapy爬虫的第一步是创建一个Scrapy项目,而这一步需要使用命令行来完成,在命令行中输入以下命令:

scrapy startproject projectname

projectname则是你创建的项目的名称,命令执行之后会在当前目录下生成一个如下结构的目录:

projectname/
scrapy.cfg # 部署的配置文件
projectname/ # 项目的Python模块,导入自己代码的话需要从这里导入
spiders/ # 一个将会存放你的爬虫的目录
__init__.py
__init__.py
items.py # 配置Item的文件
middlewares.py # 配置中间件的文件
pipelines.py # 配置管道的文件
settings.py # 项目的配置文件

这个目录相当于是一个Scrapy给你定制好的模板,节省了我们许多的时间,我们只需要按照Scrapy的规则在相应的文件中编写代码,就可以很快速的完成一个爬虫项目。

在创建好了项目后,就要开始编写爬虫了,同样的,Scrapy提供了一个命令,能让我们快速的生成一个Spider模板放到spiders目录中,cd到项目目录中,输入以下命令:

scrapy genspider spidername mydomain.com

spidername指的是你创建的Spider名称,mydomain.com则是你这个爬虫抓取目标的域名。

命令执行后会在spiders目录下生成一个如下的spidername.py文件:

# -*- coding: utf-8 -*-
import scrapy
class SpidernameSpider(scrapy.Spider):
name = 'spidername'
allowed_domains = ['mydomain.com']
start_urls = ['http://mydomain.com/']
def parse(self, response):
pass

这就是一个标准的Spider模板了,具体如何在这个模版中编写Spider,在之后的文章中会详细讲到。

在写好Spider之后,就可以使用命令来运行这个Spider了:

scrapy crawl spidername

从这里开始,你的爬虫就可以欢快的开始运行了。

系列文章:

  • Scrapy-1.强大与全面的Python爬虫框架
  • Scrapy-2.Spiders
  • Scrapy-3.Selector和Request
  • Scrapy-4.Middleware
  • Scrapy-5.Items
  • Scrapy-6.Settings
  • Scrapy-7.Scrapy-redis
  • Scrapy-8.Scrapyd
  • Scrapy-9.常见问题

推荐阅读
  • 云原生边缘计算之KubeEdge简介及功能特点
    本文介绍了云原生边缘计算中的KubeEdge系统,该系统是一个开源系统,用于将容器化应用程序编排功能扩展到Edge的主机。它基于Kubernetes构建,并为网络应用程序提供基础架构支持。同时,KubeEdge具有离线模式、基于Kubernetes的节点、群集、应用程序和设备管理、资源优化等特点。此外,KubeEdge还支持跨平台工作,在私有、公共和混合云中都可以运行。同时,KubeEdge还提供数据管理和数据分析管道引擎的支持。最后,本文还介绍了KubeEdge系统生成证书的方法。 ... [详细]
  • 2021最新总结网易/腾讯/CVTE/字节面经分享(附答案解析)
    本文分享作者在2021年面试网易、腾讯、CVTE和字节等大型互联网企业的经历和问题,包括稳定性设计、数据库优化、分布式锁的设计等内容。同时提供了大厂最新面试真题笔记,并附带答案解析。 ... [详细]
  • 云原生应用最佳开发实践之十二原则(12factor)
    目录简介一、基准代码二、依赖三、配置四、后端配置五、构建、发布、运行六、进程七、端口绑定八、并发九、易处理十、开发与线上环境等价十一、日志十二、进程管理当 ... [详细]
  • 2018年人工智能大数据的爆发,学Java还是Python?
    本文介绍了2018年人工智能大数据的爆发以及学习Java和Python的相关知识。在人工智能和大数据时代,Java和Python这两门编程语言都很优秀且火爆。选择学习哪门语言要根据个人兴趣爱好来决定。Python是一门拥有简洁语法的高级编程语言,容易上手。其特色之一是强制使用空白符作为语句缩进,使得新手可以快速上手。目前,Python在人工智能领域有着广泛的应用。如果对Java、Python或大数据感兴趣,欢迎加入qq群458345782。 ... [详细]
  • 阿里Treebased Deep Match(TDM) 学习笔记及技术发展回顾
    本文介绍了阿里Treebased Deep Match(TDM)的学习笔记,同时回顾了工业界技术发展的几代演进。从基于统计的启发式规则方法到基于内积模型的向量检索方法,再到引入复杂深度学习模型的下一代匹配技术。文章详细解释了基于统计的启发式规则方法和基于内积模型的向量检索方法的原理和应用,并介绍了TDM的背景和优势。最后,文章提到了向量距离和基于向量聚类的索引结构对于加速匹配效率的作用。本文对于理解TDM的学习过程和了解匹配技术的发展具有重要意义。 ... [详细]
  • Final关键字的含义及用法详解
    本文详细介绍了Java中final关键字的含义和用法。final关键字可以修饰非抽象类、非抽象类成员方法和变量。final类不能被继承,final类中的方法默认是final的。final方法不能被子类的方法覆盖,但可以被继承。final成员变量表示常量,只能被赋值一次,赋值后值不再改变。文章还讨论了final类和final方法的应用场景,以及使用final方法的两个原因:锁定方法防止修改和提高执行效率。 ... [详细]
  • 如何用UE4制作2D游戏文档——计算篇
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了如何用UE4制作2D游戏文档——计算篇相关的知识,希望对你有一定的参考价值。 ... [详细]
  • JavaScript设计模式之策略模式(Strategy Pattern)的优势及应用
    本文介绍了JavaScript设计模式之策略模式(Strategy Pattern)的定义和优势,策略模式可以避免代码中的多重判断条件,体现了开放-封闭原则。同时,策略模式的应用可以使系统的算法重复利用,避免复制粘贴。然而,策略模式也会增加策略类的数量,违反最少知识原则,需要了解各种策略类才能更好地应用于业务中。本文还以员工年终奖的计算为例,说明了策略模式的应用场景和实现方式。 ... [详细]
  • 浏览器中的异常检测算法及其在深度学习中的应用
    本文介绍了在浏览器中进行异常检测的算法,包括统计学方法和机器学习方法,并探讨了异常检测在深度学习中的应用。异常检测在金融领域的信用卡欺诈、企业安全领域的非法入侵、IT运维中的设备维护时间点预测等方面具有广泛的应用。通过使用TensorFlow.js进行异常检测,可以实现对单变量和多变量异常的检测。统计学方法通过估计数据的分布概率来计算数据点的异常概率,而机器学习方法则通过训练数据来建立异常检测模型。 ... [详细]
  • Oracle优化新常态的五大禁止及其性能隐患
    本文介绍了Oracle优化新常态中的五大禁止措施,包括禁止外键、禁止视图、禁止触发器、禁止存储过程和禁止JOB,并分析了这些禁止措施可能带来的性能隐患。文章还讨论了这些禁止措施在C/S架构和B/S架构中的不同应用情况,并提出了解决方案。 ... [详细]
  • SpringBoot整合SpringSecurity+JWT实现单点登录
    SpringBoot整合SpringSecurity+JWT实现单点登录,Go语言社区,Golang程序员人脉社 ... [详细]
  • Java和JavaScript是什么关系?java跟javaScript都是编程语言,只是java跟javaScript没有什么太大关系,一个是脚本语言(前端语言),一个是面向对象 ... [详细]
  • 篇首语:本文由编程笔记#小编为大家整理,主要介绍了软件测试知识点之数据库压力测试方法小结相关的知识,希望对你有一定的参考价值。 ... [详细]
  • ElasticSerach初探第一篇认识ES+环境搭建+简单MySQL数据同步+SpringBoot整合ES
    一、认识ElasticSearch是一个基于Lucene的开源搜索引擎,通过简单的RESTfulAPI来隐藏Lucene的复杂性。全文搜索,分析系统&# ... [详细]
  • ejava,刘聪dejava
    本文目录一览:1、什么是Java?2、java ... [详细]
author-avatar
x75066882
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有