Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >scrapy进阶开发(一):scrapy架构源码分析

scrapy进阶开发(一):scrapy架构源码分析

作者头像
Meet相识
发布于 2018-09-12 08:35:47
发布于 2018-09-12 08:35:47
2.5K00
代码可运行
举报
文章被收录于专栏:技术专栏技术专栏
运行总次数:0
代码可运行

官网链接

Scrapy组件分析

image.png

  1. Spiders ->网页分析器
  2. Item Pipline -> 数据管道
  3. Scheduler -> 调度器
  4. Downloader -> 下载器
  5. Scraoy Engine -> 核心引擎

Scrapy执行过程分析

image.png

  1. Spider(我们编码的一个网站的爬虫) yield 一个 Request 出来,并发送给Engine(产生request,处理response)
  2. Engine拿到Request以后发送给Scheduler(调度器)
  3. Scheduler生成一个Requests交给Engine
  4. Engine拿到 Scheduler的request后(注意是Scheduler发来的而不是Spider发来的),经过设置好的DownloaderMiddleware,一步一步将Request送达Downloader
  5. Downloader下载网页后,再经过设置好的DownloaderMiddleware,一步一步将HttpResponse返回给Engine
  6. Downloader拿到Response以后发送给Spiders进行处理分析(比如正则表达式,CSS选择器的配合使用提取网页字段)
  7. Spider处理完的结果分为两类,一类是Item,一类是Request,这两类都会发给Engine,Engine拿到后判断如果是Items则会走8,如果是Requests则重复走2
  8. Engine将Spiders发送过来的item发送给Item Piplines,将结果一步一步的Piplines将数据持久化到不同存储体里,比如JSON,Mysql,ES等

源码分析

Scrapy 核心的代码都在scrapy类库的scrapy/core文件夹下

image.png

(downloader 支持多种类型下载)

spider,pipline,middleware 是自己编写的

image.png

  • Engine源码简析
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    ...
    ...
    
    # 此处为执行过程中1-2步,Engine拿到request后发送给Scheduler
    def schedule(self, request, spider):
        self.signals.send_catch_log(signal=signals.request_scheduled,
                request=request, spider=spider)
        # 调用scheduler的enqueue_request方法将request放到Scheduler中
        if not  self.slot.scheduler.enqueue_request(request):
            self.signals.send_catch_log(signal=signals.request_dropped,
                                        request=request, spider=spider)
    ...
    ...
    # 此处为执行过程中第三步,从Engine中拿request给Scheduler
    def _next_request_from_scheduler(self, spider):
        slot = self.slot
        request = slot.scheduler.next_request()
        # 爬虫首次启动的时候先执行这个_next_request_from_scheduler方法,
        # 但是scheduler里此时没有request,所以就会去从Spider中读取start_urls
        if not request:
            return
        d = self._download(request, spider)
        d.addBoth(self._handle_downloader_output, request, spider)
        d.addErrback(lambda f: logger.info('Error while handling downloader output',
                                           exc_info=failure_to_exc_info(f),
                                           extra={'spider': spider}))
        d.addBoth(lambda _: slot.remove_request(request))
        d.addErrback(lambda f: logger.info('Error while removing request from slot',
                                           exc_info=failure_to_exc_info(f),
                                           extra={'spider': spider}))
        d.addBoth(lambda _: slot.nextcall.schedule())
        d.addErrback(lambda f: logger.info('Error while scheduling new request',
                                           exc_info=failure_to_exc_info(f),
                                           extra={'spider': spider}))
        return d
    ...
    ...
  • Request类(由Spider产生)构造函数参数分析
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class Request(object_ref):
    # url: 请求参数
    # callback:请求回调函数
    # method: http请求类型
    # headers: 请求头
    # body:请求体
    # cookies:浏览器cookie,自动登录后,scrapy会自动把cookie加入request中
    # 该操作的实现是由scrapy.downloadermiddlewares.cookies.CookiesMiddleware的scrapy内置Middleware完成的
    # meta:元信息,(可以在Request中传递)
    # encoding:网页编码格式,默认UTF-8
    # priority:设置在scheduler的调度优先级
    # dont_filter:是否不过滤同时发出的相同request请求
    # errback:失败的回调函数
    # 
    def __init__(self, url, callback=None, method='GET', headers=None, body=None,
                     cookies=None, meta=None, encoding='utf-8', priority=0,
                     dont_filter=False, errback=None, flags=None):
  • Response类(由Downloader产生)构造函数参数分析
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class Response(object_ref):

    # url 网页的url
    # status 返回状态码,默认是200,代表成功
    # headers 服务器返回的响应头
    # body 返回的内容体
    # request 之前yield的Request,对应的请求
    def __init__(self, url, status=200, headers=None, body=b'', flags=None, request=None):
        self.headers = Headers(headers or {})
        self.status = int(status)
        self._set_body(body)
        self._set_url(url)
        self.request = request
        self.flags = [] if flags is None else list(flags)

其子类有HtmlResponse,TextResponse,XmlResponse

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from scrapy.http.response.text import TextResponse

class HtmlResponse(TextResponse):
    pass
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class TextResponse(Response):
    ...
    ...
    # Response内部已经引入了selector拱xpath,css方法调用
    @property
    def selector(self):
        from scrapy.selector import Selector
        if self._cached_selector is None:
            self._cached_selector = Selector(self)
        return self._cached_selector

    # xpath 选择器
    def xpath(self, query, **kwargs):
        return self.selector.xpath(query, **kwargs)

    # css 选择器
    def css(self, query):
        return self.selector.css(query)
    ...
    ...
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018.03.01 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Scrapy源码剖析(四)Scrapy如何完成抓取任务?
上一篇文章:Scrapy源码剖析(三)Scrapy有哪些核心组件?我们已经分析了 Scrapy 核心组件的主要职责,以及它们在初始化时都完成了哪些工作。
_Kaito
2021/03/23
1.2K0
Scrapy源码剖析(四)Scrapy如何完成抓取任务?
爬虫框架scrapy
Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架。 其可以应用在数据挖掘,信息处理或存储历史数据等一系列的程序中。 其最初是为了页面抓取 (更确切来说, 网络抓取 )所设计的, 也可以应用在获取API所返回的数据(例如 Amazon Associates Web Services ) 或者通用的网络爬虫。Scrapy用途广泛,可以用于数据挖掘、监测和自动化测试。
菲宇
2019/06/12
1.8K0
爬虫框架scrapy
Scrapy源码剖析(三)Scrapy有哪些核心组件?
在上一篇文章:Scrapy源码剖析(二)Scrapy是如何运行起来的?我们主要剖析了 Scrapy 是如何运行起来的核心逻辑,也就是在真正执行抓取任务之前,Scrapy 都做了哪些工作。
_Kaito
2021/03/23
5710
Scrapy源码剖析(三)Scrapy有哪些核心组件?
Scrapy爬虫框架
网络爬虫框架scrapy (配置型爬虫) 什么是爬虫框架? 爬虫框架是实现爬虫功能的一个软件结构和功能组件集合 爬虫框架是个半成品,帮助用户实现专业网络爬虫 scrapy框架结构(“5+2”结构) image.png spider: 解析downloader返回的响应(Response) 产生爬取项(scraped item) 产生额外的爬去请求(Request) 需要用户编写配置代码 engine(引擎): 控制所有模块之间的数据流 根据条件触发事件 不需要用户修改 scheduler(调度器): 对
Cloud-Cloudys
2020/07/07
9930
Python自动化开发学习-Scrapy
讲师博客:https://www.cnblogs.com/wupeiqi/p/6229292.html 中文资料(有示例参考):http://www.scrapyd.cn/doc/
py3study
2020/01/08
1.5K0
Python 爬虫(六):Scrapy 爬取景区信息
Scrapy 是一个使用 Python 语言开发,为了爬取网站数据,提取结构性数据而编写的应用框架,它用途广泛,比如:数据挖掘、监测和自动化测试。安装使用终端命令 pip install Scrapy 即可。
Python小二
2020/08/18
8290
Python 爬虫(六):Scrapy 爬取景区信息
python爬虫----(scrapy框架提高(1),自定义Request爬取)
最近看scrappy0.24官方文档看的正心烦的时候,意外发现中文翻译0.24文档,简直是福利呀~ http://scrapy-chs.readthedocs.org/zh_CN/0.24/
lpe234
2020/07/27
7910
爬虫之scrapy框架(二)
当我们启动spider.py文件时,会执行我们设置好的start_urls,但是源码真正是如何处理的呢?我们进入scrapy.Spider查看源码,Spider类下有如下代码:
GH
2020/03/19
9600
[爬虫]scrapy框架
Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架。 可以应用在包括数据挖掘,信息处理或存储历史数据等一系列的程序中。
周小董
2019/03/25
1.2K0
[爬虫]scrapy框架
Python scrapy 安装与开发
Scrapy是采用Python开发的一个快速、高层次的屏幕抓取和web抓取框架,用于抓取采集web站点信息并从页面中提取结构化的数据。
阳光岛主
2019/02/18
1.3K0
Python scrapy 安装与开发
Scrapy源码剖析(二)Scrapy是如何运行起来的?
在上篇文章:Scrapy源码剖析(一)架构概览,我们主要从整体上了解了 Scrapy 的架构和数据流转,并没有深入分析每个模块。从这篇文章开始,我将带你详细剖析 Scrapy 的运行原理。
_Kaito
2021/03/23
1.1K0
Scrapy源码剖析(二)Scrapy是如何运行起来的?
【源码解读】如何充分发挥 Scrapy 的异步能力
但是,在日常工作和面试过程中,经常发现有些同学会笃定地认为 Scrapy 采用的是多线程并发模型。实际上,虽然 Twisted 框架提供了线程池支持,但是其核心网络部分处理逻辑依赖的是「单线程 IO 多路复用」技术,在 Linux 平台上,是围绕 epoll() 系统调用实现的 Reactor 模式。
小歪
2019/05/13
3.6K0
【源码解读】如何充分发挥 Scrapy 的异步能力
爬虫之scrapy框架(一)
Scrapy一个开源和协作的框架,其最初是为了页面抓取 (更确切来说, 网络抓取 )所设计的,使用它可以以快速、简单、可扩展的方式从网站中提取所需的数据。但目前Scrapy的用途十分广泛,可用于如数据挖掘、监测和自动化测试等领域,也可以应用在获取API所返回的数据(例如 Amazon Associates Web Services ) 或者通用的网络爬虫。
GH
2020/03/19
8360
独家 | 手把手教你用scrapy制作一个小程序 !(附代码)
本文提供了scrapy和pycharm安装和配置时容易出现错误和解决办法,同时演绎了网络教程经典的“爬取豆瓣9分书单”的例子,每一步代码都给出了编者的理解,并对可能出现的错误给出了解决方案,操作性强。 一. 前言 Scrapy是用于Python开发的一个快速,高层次的屏幕抓取和web抓取框架,用于抓取web站点并从页面中提取结构化的数据。Scrapy用途广泛,可以用于数据挖掘、监测和自动化测试。 有爬虫爱好者认为scrapy的优点是自定义程度高,适合学习研究爬虫技术,要学习的相关知识也较多,故而完成一个
数据派THU
2018/01/30
2.1K0
独家 | 手把手教你用scrapy制作一个小程序 !(附代码)
Scrapy源码解读
Scrapy一个比较完整的爬虫框架,包含了爬取任务的调度、多个线程同时爬取(异步多线程,不用等一个请求完成后才开始另一个请求)、自动过滤重复的链接等功能。使用者通过定义比较简单的爬虫类(例如目标网址、爬取的具体页面元素、存储的格式字段、数据清理逻辑),剩余的就可以交给scrapy完成爬取工作。
大数据技术架构
2023/03/08
8490
Scrapy源码解读
scrapy框架的介绍
Scrapy Engine(引擎): 负责Spider、ItemPipeline、Downloader、Scheduler中间的通讯,信号、数据传递等。
用户2337871
2019/07/19
6300
scrapy框架的介绍
Scrapy 入门教程
爬虫就是Scrapy用来从网站抓取数据的类,它们都继承于scrapy.Spider类。
Stanley Sun
2019/09/23
8070
收藏| Scrapy框架各组件详细设置
大家好,关于Requests爬虫我们已经讲了很多。今天我们就说一下Scrapy框架各组件的详细设置方便之后更新Scrapy爬虫实战案例。
刘早起
2020/05/14
7380
18.scrapy_maitian
ershoufang.py # -*- coding: utf-8 -*- import scrapy class ErshoufangSpider(scrapy.Spider): name = 'ershoufang' allowed_domains = ['maitian.com'] start_urls = ['http://maitian.com/'] def parse(self, response): pass zufang_spider.py
hankleo
2020/09/17
2870
Python爬虫之scrapy框架
里面的parse方法,这个方法有两个作用 1.负责解析start_url下载的Response 对象,根据item提取数据(解析item数据的前提是parse里全部requests请求都被加入了爬取队列) 2.如果有新的url则加入爬取队列,负责进一步处理,URL的Request 对象 这两点简单来说就是编写爬虫的主要部分
yuanshuai
2022/08/22
3340
Python爬虫之scrapy框架
相关推荐
Scrapy源码剖析(四)Scrapy如何完成抓取任务?
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验