人生苦短,我用 Python

前文传送门:

小白学 Python 爬虫(1):开篇

小白学 Python 爬虫(2):前置准备(一)基本类库的安装

小白学 Python 爬虫(3):前置准备(二)Linux基础入门

小白学 Python 爬虫(4):前置准备(三)Docker基础入门

小白学 Python 爬虫(5):前置准备(四)数据库基础

小白学 Python 爬虫(6):前置准备(五)爬虫框架的安装

小白学 Python 爬虫(7):HTTP 基础

小白学 Python 爬虫(8):网页基础

小白学 Python 爬虫(9):爬虫基础

小白学 Python 爬虫(10):Session 和 Cookies

小白学 Python 爬虫(11):urllib 基础使用(一)

小白学 Python 爬虫(12):urllib 基础使用(二)

小白学 Python 爬虫(13):urllib 基础使用(三)

小白学 Python 爬虫(14):urllib 基础使用(四)

小白学 Python 爬虫(15):urllib 基础使用(五)

小白学 Python 爬虫(16):urllib 实战之爬取妹子图

小白学 Python 爬虫(17):Requests 基础使用

小白学 Python 爬虫(18):Requests 进阶操作

小白学 Python 爬虫(19):Xpath 基操

小白学 Python 爬虫(20):Xpath 进阶

小白学 Python 爬虫(21):解析库 Beautiful Soup(上)

小白学 Python 爬虫(22):解析库 Beautiful Soup(下)

小白学 Python 爬虫(23):解析库 pyquery 入门

小白学 Python 爬虫(24):2019 豆瓣电影排行

小白学 Python 爬虫(25):爬取股票信息

小白学 Python 爬虫(26):为啥买不起上海二手房你都买不起

小白学 Python 爬虫(27):自动化测试框架 Selenium 从入门到放弃(上)

小白学 Python 爬虫(28):自动化测试框架 Selenium 从入门到放弃(下)

小白学 Python 爬虫(29):Selenium 获取某大型电商网站商品信息

小白学 Python 爬虫(30):代理基础

小白学 Python 爬虫(31):自己构建一个简单的代理池

小白学 Python 爬虫(32):异步请求库 AIOHTTP 基础入门

引言

首先恭喜看到这篇文章的各位同学,从这篇文章开始,整个小白学 Python 爬虫系列进入最后一部分,小编计划是介绍一些常用的爬虫框架。

说到爬虫框架,首先绕不过去的必然是 Scrapy 。

Scrapy 是一个基于 Twisted 的异步处理框架,是纯 Python 实现的爬虫框架,其架构清晰,模块之间的耦合程度低,可扩展性极强,可以灵活完成各种需求。

当然第一件事儿还是各种官方地址:

Scrapy 官网: https://scrapy.org/

Github:https://github.com/scrapy/scrapy

官方文档:https://scrapy.org/doc/

架构概述

首先看一下 Scrapy 框架的架构体系图:

从这张图中,可以看到 Scrapy 分成了很多个组件,每个组件的含义如下:

  • Engine 引擎:引擎负责控制系统所有组件之间的数据流,并在发生某些操作时触发事件。
  • Item 项目:它定义了爬取结果的数据结构,爬取的数据会被赋值成该对象。
  • Scheduler 调度器:用来接受引擎发过来的请求并加入队列中,并在引擎再次请求的时候提供给引擎。
  • Downloader 下载器:下载器负责获取网页并将其馈送到引擎,引擎又将其馈给蜘蛛。
  • Spiders 蜘蛛:其内定义了爬取的逻辑和网页的解析规则,它主要负责解析响应并生成提取结果和新的请求。
  • Item Pipeline 项目管道:负责处理由蜘蛛从网页中抽取的项目,它的主要任务是清洗、验证和存储数据。
  • Downloader Middlewares 下载器中间件:下载器中间件是位于引擎和Downloader之间的特定挂钩,它们在从引擎传递到Downloader时处理请求,以及从Downloader传递到Engine的响应。
  • Spider Middlewares 蜘蛛中间件:蜘蛛中间件是位于引擎和蜘蛛之间的特定挂钩,并且能够处理蜘蛛的输入(响应)和输出(项目和请求)。

上面这张图的数据流程如下:

  1. 该引擎获取从最初请求爬行 蜘蛛。
  2. 该引擎安排在请求 调度程序和要求下一个请求爬行。
  3. 该计划返回下一请求的引擎。
  4. 该引擎发送请求到 下载器,通过 下载器中间件。
  5. 页面下载完成后, Downloader会生成一个带有该页面的响应,并将其发送到Engine,并通过 Downloader Middlewares。
  6. 该引擎接收来自响应 下载器并将其发送到所述 蜘蛛进行处理,通过蜘蛛中间件。
  7. 该蜘蛛处理响应并返回刮下的项目和新的要求(跟随)的 引擎,通过 蜘蛛中间件。
  8. 该引擎发送处理的项目,以 项目管道,然后把处理的请求的调度,并要求今后可能请求爬行。
  9. 重复该过程(从步骤1开始),直到不再有Scheduler的请求为止 。

这张图的名词有些多,记不住实属正常,不过没关系,后续小编会配合着示例代码,和各位同学一起慢慢的学习。

基础示例

先来个最简单的示例项目,在创建项目之前,请确定自己的环境已经正确安装了 Scrapy ,如果没有安装的同学可以看下前面的文章,其中有介绍 Scrapy 的安装配置。

首先需要创建一个 Scrapy 的项目,创建项目需要使用命令行,在命令行中输入以下命令:

scrapy startproject first_scrapy

然后一个名为 first_scrapy 的项目就创建成功了,项目文件结构如下:

first_scrapy/
scrapy.cfg # deploy configuration file first_scrapy/ # project's Python module, you'll import your code from here
__init__.py items.py # project items definition file middlewares.py # project middlewares file pipelines.py # project pipelines file settings.py # project settings file spiders/ # a directory where you'll later put your spiders
__init__.py
  • scrapy.cfg:它是 Scrapy 项目的配置文件,其内定义了项目的配置文件路径、部署相关信息等内容。
  • items.py:它定义 Item 数据结构,所有的 Item 的定义都可以放这里。
  • pipelines.py:它定义 Item Pipeline 的实现,所有的 Item Pipeline 的实现都可以放这里。
  • settings.py:它定义项目的全局配置。
  • middlewares.py:它定义 Spider Middlewares 和 Downloader Middlewares 的实现。
  • spiders:其内包含一个个 Spider 的实现,每个 Spider 都有一个文件。

到此,我们已经成功创建了一个 Scrapy 项目,但是这个项目目前是空的,我们需要再手动添加一只 Spider 。

Scrapy 用它来从网页里抓取内容,并解析抓取的结果。不过这个类必须继承 Scrapy 提供的 Spider 类 scrapy.Spider,还要定义 Spider 的名称和起始请求,以及怎样处理爬取后的结果的方法。

创建 Spider 可以使用手动创建,也可以使用命令创建,小编这里演示一下如何使用命令来创建,如下:

scrapy genspider quotes quotes.toscrape.com

将会看到在 spider 目录下新增了一个 QuotesSpider.py 的文件,里面的内容如下:

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

可以看到,这个类里面有三个属性 nameallowed_domainsstart_urls 和一个 parse() 方法。

  • name,它是每个项目唯一的名字,用来区分不同的 Spider。
  • allowed_domains,它是允许爬取的域名,如果初始或后续的请求链接不是这个域名下的,则请求链接会被过滤掉。
  • start_urls,它包含了 Spider 在启动时爬取的 url 列表,初始请求是由它来定义的。
  • parse,它是 Spider 的一个方法。默认情况下,被调用时 start_urls 里面的链接构成的请求完成下载执行后,返回的响应就会作为唯一的参数传递给这个函数。该方法负责解析返回的响应、提取数据或者进一步生成要处理的请求。

到这里我们就清楚了, parse() 方法中的 response 是前面的 start_urls 中链接的爬取结果,所以在 parse() 方法中,我们可以直接对爬取的结果进行解析。

先看下网页的 DOM 结构:

接下来要做的事情就比较简单了,获取其中的数据,然后将其打印出来。

数据提取的方式可以是 CSS 选择器也可以是 XPath 选择器,小编这里使用的是 CSS 选择器,将我们刚才的 parse() 方法进行一些简单的改动,如下:

def parse(self, response):
quotes = response.css('.quote')
for quote in quotes:
text = quote.css('.text::text').extract_first()
author = quote.css('.author::text').extract_first()
tags = quote.css('.tags .tag::text').extract()
print("text:", text)
print("author:", author)
print("tags:", tags)

首先是获取到所有的 class 为 quote 的元素,然后将所有元素进行循环后取出其中的数据,最后对这些数据进行打印。

程序到这里就写完了,那么接下来的问题是,我们如何运行这只爬虫?

Scrapy 的运行方式同样适用适用命令行的,首先要到这个项目的根目录下,然后执行以下代码:

scrapy crawl quotes

结果如下:

可以看到,我们刚才 print() 的内容正常的打印在了命令行中。

除了我们 print() 中的内容的打印,还可以看到在 Scrapy 启动的过程中, Scrapy 输出了当前的版本号以及正在启动的项目名称,并且在爬取网页的过程中,首先访问了 http://quotes.toscrape.com/robots.txt 机器人协议,虽然这个协议在当前这个示例中响应了 404的状态码,但是 Scrapy 会根据机器人协议中的内容进行爬取。

示例代码

本系列的所有代码小编都会放在代码管理仓库 Github 和 Gitee 上,方便大家取用。

示例代码-Github

示例代码-Gitee

参考

https://docs.scrapy.org/en/latest/intro/tutorial.html

https://docs.scrapy.org/en/latest/topics/architecture.html

https://cuiqingcai.com/8337.html

小白学 Python 爬虫(33):爬虫框架 Scrapy 入门基础(一)的更多相关文章

  1. 小白学 Python 爬虫(34):爬虫框架 Scrapy 入门基础(二)

    人生苦短,我用 Python 前文传送门: 小白学 Python 爬虫(1):开篇 小白学 Python 爬虫(2):前置准备(一)基本类库的安装 小白学 Python 爬虫(3):前置准备(二)Li ...

  2. 小白学 Python 爬虫(35):爬虫框架 Scrapy 入门基础(三) Selector 选择器

    人生苦短,我用 Python 前文传送门: 小白学 Python 爬虫(1):开篇 小白学 Python 爬虫(2):前置准备(一)基本类库的安装 小白学 Python 爬虫(3):前置准备(二)Li ...

  3. 小白学 Python 爬虫(36):爬虫框架 Scrapy 入门基础(四) Downloader Middleware

    人生苦短,我用 Python 前文传送门: 小白学 Python 爬虫(1):开篇 小白学 Python 爬虫(2):前置准备(一)基本类库的安装 小白学 Python 爬虫(3):前置准备(二)Li ...

  4. 小白学 Python 爬虫(37):爬虫框架 Scrapy 入门基础(五) Spider Middleware

    人生苦短,我用 Python 前文传送门: 小白学 Python 爬虫(1):开篇 小白学 Python 爬虫(2):前置准备(一)基本类库的安装 小白学 Python 爬虫(3):前置准备(二)Li ...

  5. 小白学 Python 爬虫(38):爬虫框架 Scrapy 入门基础(六) Item Pipeline

    人生苦短,我用 Python 前文传送门: 小白学 Python 爬虫(1):开篇 小白学 Python 爬虫(2):前置准备(一)基本类库的安装 小白学 Python 爬虫(3):前置准备(二)Li ...

  6. 小白学 Python 爬虫(40):爬虫框架 Scrapy 入门基础(七)对接 Selenium 实战

    人生苦短,我用 Python 前文传送门: 小白学 Python 爬虫(1):开篇 小白学 Python 爬虫(2):前置准备(一)基本类库的安装 小白学 Python 爬虫(3):前置准备(二)Li ...

  7. 小白学 Python 爬虫(41):爬虫框架 Scrapy 入门基础(八)对接 Splash 实战

    人生苦短,我用 Python 前文传送门: 小白学 Python 爬虫(1):开篇 小白学 Python 爬虫(2):前置准备(一)基本类库的安装 小白学 Python 爬虫(3):前置准备(二)Li ...

  8. 小白学 Python 数据分析(1):数据分析基础

    各位同学好,小编接下来为大家分享一些有关 Python 数据分析方面的内容,希望大家能够喜欢. 人工植入广告: PS:小编最近两天偷了点懒,好久没有发原创了,最近是在 CSDN 开通了一个付费专栏,用 ...

  9. 小白学 Python 爬虫(39): JavaScript 渲染服务 scrapy-splash 入门

    人生苦短,我用 Python 前文传送门: 小白学 Python 爬虫(1):开篇 小白学 Python 爬虫(2):前置准备(一)基本类库的安装 小白学 Python 爬虫(3):前置准备(二)Li ...

随机推荐

  1. element表格多选实现单选

    9.element多选表格实现单选 userChoose(selection, row) { console.log(selection,'selection') console.log(row,'r ...

  2. xml path 列转行实例

    SQL Server2005提供了一个新查询语法——For XML PATH(''),这个语法有什么用呢?想象一下这样一个查询需求:有两个表,班级表A.学生表B,要查询一个班级里有哪些学生?针对这个需 ...

  3. oracle sum()聚合函数

    原文链接:https://blog.csdn.net/cizatu5130/article/details/100291347 oracle sum()聚合函数 2016-05-13 20:08:00 ...

  4. 我去!JS的原型是咋回事?

    我去!JS的原型是咋回事? 最近写公司的项目,写着写着发现自己的原型的理解还是不够透彻,又去网上查了一番资料,顺便总结一下,在顺便给到的朋友能提供一点帮助.如有遗漏,欢迎交流. 原型是啥?为什么要用原 ...

  5. h5 的canvas绘制基本图形

    文章地址:https://www.cnblogs.com/sandraryan/ canvas是一个标签,可用于绘制复杂图形,渲染效果比普通DOM快 某些低版本浏览器不支持 canvas 使用原生几乎 ...

  6. H3C LMI协议标准

  7. Scrap简介

    原文:https://blog.csdn.net/ssw_1990/article/details/51254227 提到Python与网络爬虫,可能会想到urllib,urllib2,Beautif ...

  8. H3C 多区域OSPF配置示例

  9. linux设备驱动文件结构

    struct file, 定义于 <linux/fs.h>, 是设备驱动中第二个最重要的数据结构. 注意 file 与用户空间程序的 FILE 指针没有任何关系. 一个 FILE 定义在 ...

  10. vue-axios当只调用vue.js又需要axios请求多时

    可以将axios方法封装一个函数 (function () { ASK = { get:function (url,data,succFun,errFun) { axios.get(url,{ par ...