一、介绍

Scrapy 是一个基于Twisted异步处理框架,是纯 Python 实现的爬虫框架,其架构清晰,模块之间耦合较低,扩展性和灵活强,是目前 Python 中使用最广泛的爬虫框架

  1. 架构示意图;

    它分为以下几个部分:

    • Engine:引擎,处理整个系统的数据流处理、触发事务,是整个框架的核心
    • Item:项目,它定义了爬取数据结果的数据结构,爬取的数据会被赋值成该 Item 对象。
    • Scheduler:调度器,接受引擎发送过来的请求并将其加入到队列中,在引擎再次请求的时候提供给引擎。
    • Downloader:下载器,下载网页内容并将其返回给Spiders

    • Spiders:蜘蛛,其内定义了爬取的逻辑网页的解析规则,它主要任务是负责解析响应并生成提取结果和新的请求。
    • Item Pipeline:项目管道,负责处理由 Spiders 从网页中抽取的项目,它的主要任务是清洗、验证和存储数据
    • Downloader Middlewares:下载中间件,位于引擎和下载器之间的钩子框架,主要处理引擎与下载器之间的请求及响应。
    • Spider Middlewares:蜘蛛中间件,位于引擎和蜘蛛之间的钩子框架,主要处理蜘蛛输入的响应和输出的结果及新的请求。

  2. 项目结构

    Scrapy 框架通过命令行来创建项目,IDE 编写代码,项目文件结构如下所示:

    scrapy.cfg # Scrapy 项目配置文件
    project/__init__.pyitems.py   # 它定义了 Item 数据结构pipelines.py # 它定义了 Item Pipeline 的实像settings.py # 它定义了项目的全局配置middlewares.py # 它定义了 Spider、Downloader 的中间件的实现spiders/ # 其内包含了一个个 spider 的实现__init__.pyspider1.pyspider2.py...
    

二、Scrapy 入门 Demo

目标:

  • 创建一个 Scrapy 项目。
  • 创建一个 Spider 来抓取站点和处理数据。
  • 通过命令行将抓取的内容导出。
  • 将抓取的内容保存到 MongoDB 数据库。
  1. 创建一个 Scrapy 项目:

    scrapy startproject tutorial

    文件夹结构如下:

  2. 创建 Spider

    自定义的 Spider 类必须继承scrapy.Spider 类。使用命令行自定义一个 Quotes Spider。

    cd tutorial  # 进入刚才创建的 tutorial,即进入项目的根路径
    scrapy genspider quotes quotes.toscrape.com # 执行 genspider 命令,第一个参数是 Spider 的名称,第二个参数是网站域名。

    然后 spiders 下就多了个 quotes.py 文件:

    # -*- coding: utf-8 -*-
    import scrapyclass QuotesSpider(scrapy.Spider):# 每个 spider 独特的名字以便区分name = 'quotes' # 要爬取的链接的域名,若链接不在这个域名下,会被过滤allowed_domains = ['quotes.toscrape.com']# 它包含了 Spider 在启动时爬取的 url 列表请求start_urls = ['http://quotes.toscrape.com/']# 当上述的请求在完成下载后,返回的响应作为参数,该方法负责解析返回的响应、提取数据或进一步生成要处理的请求def parse(self, response):pass
    
  3. 创建 Item

    Item 是用来保存爬取数据的容器(数据结构),使用方法类似与字典,不过多了额外的保护机制避免拼写错误。创建自定义的 Item 也需要继承 scrapy.Item 类并且定义类型为 scrapy.Filed的字段。修改 items.py如下:

    import scrapyclass QuoteItem(scrapy.Item):# define the fields for your item here like:# name = scrapy.Field()text = scrapy.Field()author = scrapy.Field()tags = scrapy.Field()pass
  4. 解析 Response

    首先打开自定义的 Spider 中的首个请求:http://quotes.toscrape.com/,查看网页结构,发现每一页都有多个 class 为 quote 的区块,每个区块内都含有 text、author、tags。

    所以,修改自定义 Spider 中的 parse 方法如下:

    # -*- coding: utf-8 -*-
    import scrapyclass QuotesSpider(scrapy.Spider):name = 'quotes'allowed_domains = ['quotes.toscrape.com']start_urls = ['http://quotes.toscrape.com/']def parse(self, response):# 使用 css 选择器,选出类为 quote 的元素quotes = response.css('.quote') for quote in quotes:# 获取 quote 下第一个.text 元素的的 texttext = quote.css('.text::text').extract_first()author = quote.css('.author::text').extract_first()# 获取多个标签的文本tags = quote.css('.tags .tag::text').extract()
  5. 使用 Item

    QuotesSpider 的改写如下:

    # -*- coding: utf-8 -*-
    import scrapy
    from tutorial.items import QuoteItemclass QuotesSpider(scrapy.Spider):name = 'quotes'allowed_domains = ['quotes.toscrape.com']start_urls = ['http://quotes.toscrape.com/']def parse(self, response):# 使用 css 选择器,选出类为 quote 的元素quotes = response.css('.quote') for quote in quotes:# 实例化 QuoteItemitem = QuoteItem()# 获取 quote 下第一个.text 元素的的 textitem['text'] = quote.css('.text::text').extract_first()item['author'] = quote.css('.author::text').extract_first()# 获取多个标签的文本item['tags'] = quote.css('.tags .tag::text').extract()yield item
    
  6. 后续 Requets

    这里后续的请求指的是请求下一页的数据,该怎么请求呢?就要观察网页了:

    QuotesSpider.py:

    # -*- coding: utf-8 -*-
    import scrapy
    from tutorial.items import QuoteItemclass QuotesSpider(scrapy.Spider):name = 'quotes'allowed_domains = ['quotes.toscrape.com']start_urls = ['http://quotes.toscrape.com/']def parse(self, response):# 使用 css 选择器,选出类为 quote 的元素quotes = response.css('.quote') for quote in quotes:# 实例化 QuoteItemitem = QuoteItem()# 获取 quote 下第一个.text 元素的的 textitem['text'] = quote.css('.text::text').extract_first()item['author'] = quote.css('.author::text').extract_first()# 获取多个标签的文本item['tags'] = quote.css('.tags .tag::text').extract()yield item# 获取下一页的相对 urlnext = response.css('.pager .next a::attr("href")').extract_first()# 获取下一页的绝对 urlurl = response.urljoin(next)# 构造新的请求,这个请求完成后,响应会重新经过 parse 方法处理,如此往复yield scrapy.Request(url=url, callback=self.parse)
  7. 运行 Spider

    scrapy crawl quotes

    下面是控制台的输出结果,输出了当前的版本号以及 Middlewares 和 Pipelines,各个页面的抓取结果等。

  8. 保存到文件中

    • scrapy crawl quotes -o quotes.json:将上面抓取数据的结果保存成 json 文件。
    • scrapy crawl quotes -o quotes.jsonlines:每一个 Item 输出一行 JSON。
    • scrapy crawl quotes -o quotes.cs:输出为 CSV 格式。
    • scrapy crawl quotes -o quotes.xml:输出为 XML 格式。
    • scrapy crawl quotes -o quotes.pickle:输出为 pickle 格式。
    • scrapy crawl quotes -o quotes.marshal:输出为 marshal 格式。
    • scrapy crawl quotes -o ftg://user:pass@ftp.example.com/path/to/quotes.csv:ftp 远程输出。
  9. 使用 Item Pineline 保存到数据库中

    如果想进行更复杂的操作,如将结果保存到 MongoDB 数据中或筛选出某些有用的 Item,则我们可以自定义 ItemPineline 来实现。修改 pinelines.py 文件:

    # -*- coding: utf-8 -*-# Define your item pipelines here
    #
    # Don't forget to add your pipeline to the ITEM_PIPELINES setting
    # See: https://doc.scrapy.org/en/latest/topics/item-pipeline.htmlfrom scrapy.exceptions import DropItem
    import pymongoclass TextPipeline(object):def __init__(self):self.limit = 50# 需要实现 process_item 方法,启用 Item Pineline 会自动调用这个方法def process_item(self, item, spider):'''如果字段无值,抛出 DropItem 异常,否则判断字段的长度是否大于规定的长度,若大于则截取到规定的长度并拼接上省略号,否则直接返回 item'''if item['text']:if len(item['text']) > self.limit:item['text'] = item['text'][0:self.limit].rstrip() + '...'return itemelse:return DropItem('Missing Text')class MongoPipeline(object):def __init__(self, mongo_uri, mongo_db):self.mongo_uri = mongo_uriself.mongo_db= mongo_db'''此方法用@classmethod 修饰表示时一个类方法,是一种依赖注入的方式,通过 crawler我们可以获取到全局配置(settings.py)的每个信息'''@classmethoddef from_crawler(cls, crawler):return cls(mongo_uri = crawler.settings.get('MONGO_URI'),mongo_db = crawler.settings.get('MONGO_DB'))def open_spider(self, spider):self.client = pymongo.MongoClient(self.mongo_uri)self.db = self.client[self.mongo_db]# 执行了数据库的插入操作def process_item(self, item, spider):name = item.__class__.__name__self.db[name].insert(dict(item))return itemdef close_spider(self, spider):self.client.close()
    

    settings.py 添加如下内容:

    # 赋值 ITEM_PIPELINES 字典,键名是 pipeline 类的名称,键值是优先级,
    #是一个数字,越小,越先被调用
    ITEM_PIPELINES = {'tutorial.pipelines.TextPipeline': 300,'tutorial.pipelines.MongoPipeline': 400
    }
    MONGO_URI = 'localhost'
    MONGO_DB = 'tutorial'
  10. 重新执行爬取

    scrapy crawl quotes

三、参考书籍

崔庆才.《Python3 网络爬虫开发实战》

转载于:https://www.cnblogs.com/yunche/p/10357232.html

Scrapy 框架入门相关推荐

  1. python 爬虫Scrapy框架入门

    简单介绍Scrapy框架 Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架,我们只需要实现少量的代码,就能够快速的抓取. Scrapy使用了Twisted异步网络框架,可以加快我们的 ...

  2. 爬虫入门(四)——Scrapy框架入门:使用Scrapy框架爬取全书网小说数据

    为了入门scrapy框架,昨天写了一个爬取静态小说网站的小程序 下面我们尝试爬取全书网中网游动漫类小说的书籍信息. 一.准备阶段 明确一下爬虫页面分析的思路: 对于书籍列表页:我们需要知道打开单本书籍 ...

  3. python 爬虫 学习笔记(一)Scrapy框架入门

    沉迷于通过高效算法及经典数据结构来优化程序的时候并不理解,为什么多线程可以优化爬虫运行速度?原来是程序特性所决定的:传统算法的程序复杂度主要来源于计算,但网络程序的计算时间可以忽略不计,网络程序所面临 ...

  4. [爬虫-python] scrapy框架入门实例-百度贴吧

    这里写目录标题 前言 0. 本章内容大概流程 1. 安装Scrapy 2. 工程建立 3. 实现过程 3.1在items.py中定义自己要抓取的数据: 3.2 然后在spiders目录下编辑myspi ...

  5. Python的Scrapy框架入门教程

    前言: Scrapy是一个基于Python的Web爬虫框架,可以快速方便地从互联网上获取数据并进行处理.它的设计思想是基于Twisted异步网络框架,可以同时处理多个请求,并且可以使用多种处理数据的方 ...

  6. Scrapy框架入门之爬取虎扑体育的新闻标题

    下图是2018年5月25日火箭和勇士西决G5时,火箭赢下天王山之战,虎扑NBA的首页. 我这次做的爬虫项目的目的就是:爬取图片中红色边框里的文字,然后txt文本的方式保存到本地. 接下来我介绍一下我完 ...

  7. Scrapy框架入门

    一.概述 Scrapy,Python开发的一个快速.高层次的屏幕抓取和web抓取框架,用于抓取web站点并从页面中提取结构化的数据. Scrapy用途广泛,可以用于数据挖掘.监测和自动化测试. 其最初 ...

  8. 通过爬取美剧天堂详细介绍Scrapy 框架入门

    通过爬取美剧天堂并详细介绍Scrapy 框架 前言(了解) 全文写了很多注释在标题处,时间充裕的可以详细看,需要找主要知识点的我已经标注明白了,直接翻到具体位置就行. Scrapy是用纯Python实 ...

  9. 【爬虫实践】记一次Scrapy框架入门使用爬取豆瓣电影数据

    本次的学习分享主要是使用一次Scrapy框架,毕竟在很多次的时候,自己在提取一些或是需要实验数据的时候,数据量要求不大,很快便能通过简单的request等库进行调用,然后获取数据. 这次,则是想要使用 ...

最新文章

  1. python使用numpy的np.fmod函数计算numpy数组除以某一特定数值剩余的余数(remainder)、np.mod函数和np.fmod函数对负值的处理方式有差异
  2. 爬虫-scrapy的中间件
  3. mysql-数据库模式定义语言(DDL)
  4. 启明云端基于sigmastarSSD201/202核心板\开发板资料分享地址,另外还可以加入技术沟通群聊,及时解决相关技术问题!
  5. QT中QTableWidget清空或删除内容功能
  6. 设置导航栏的相关属性
  7. gson 解析json_Gson示例教程解析JSON
  8. arcsde 10.2 for oracle 安装,ArcSDE 10.2 for Oracle 12C安装注意事项
  9. 4.23上海交大PMP试题每日一题
  10. 能源管理系统背景概述
  11. Quickadmin:基于ThinkPhp6+Vue+ElementUI后台管理框架
  12. python之turtle使用:画一颗美美哒的树
  13. 高老师架构设计思考短句集(2)
  14. [附源码]计算机毕业设计JAVA停车场管理系统
  15. linux系统周几的格式是,linux cal命令显示日历信息周几天数差
  16. 【ppp概念股龙头】PPP项目落地显著加速 四大板块牛股或受益
  17. vue 项目启动报错“Cannot GET /”
  18. linux backtrack函数,Linux调用backtrack函数打印程序崩溃时的调用堆栈
  19. 安徽c语言二级真题,安徽省计算机等级二级考试真题C语言
  20. PCB设计入门(Mutisim开发环境搭建)

热门文章

  1. 语言的顺序表的合拼_2020语文中考专题五:语言运用和综合性学习。掌握基础题五种题型...
  2. 计算机辅助药物设计局限,计算机辅助药物设计高效低耗
  3. keepalived(3)——解决无法用vip来访问的问题
  4. Mysql(9)——排序的方法order by与limit的用法
  5. 网络虚拟化技术(一): linux网络虚拟化,网络虚拟化技术(一): Linux网络虚拟化...
  6. mysql my.cnf 官网_MySQL my.cnf 的配置
  7. EditPlus3.21注册码
  8. 2259: matrix
  9. 正则表达式matches_正则表达式在VBA中间是如何应用?正则表达式的实现方式?...
  10. 用C++11 实现 thread pool