Scrapy源码学习(一)
用Scrapy已经有一段时间了,觉得该是看一下源码的时候了。最开始用的时候还是0.16的版本,现在稳定版已经到了0.18。结合使用Scrapy的过程,先从Scrapy的命令行看起。
一、准备
下载源代码,scrapy托管在github上,可以直接去项目主页(https://github.com/scrapy/scrapy)通过各种方式(ssh、svn、git、下载压缩包等)下载源码。
IDE我用的是pyCharm,这个工具很强大,但并不是免费的(有免费的社区版),方便看代码和debug。
scrapy版本:0.18.2,为了方便,这里用scrapy_home带至scrapy源码所在目录路径。
二、从cmdline.py说起
scrapy通过自带的命令行方式可以实现快速构建、执行等。而这一切的功能都是从cmdline.py这个模块开始的。当我们敲下scrapy <command> [options] [args]的命令时,都是通过该模块来解析,然后执行具体的任务的。这个可以从scrapy_home/bin/scrapy这个文件下看到,这个文件的内容也很短,就几行而已:

显然,调用的是cmdline.py这个模块的execute()函数。接下来就简单看一夏cmdline.py这个模块的具体代码。
三、cmdline.py的实现
scrapy命令的执行方式如下:
scrapy <command> [options] [args]
通过代码可以看到cmdline.py中execute()主要做了一下几个工作:
- 处理参数信息为空的情况;
- 处理配置信息(包含向后兼容的代码),这样新的scrapy可以处理以前老版本下生成的项目;
- 判断目前执行scrapy命令的当前目录是否包含一个scrapy project,因为在scrapy project中可以执行更多的command选择;

- 判断传入的command是否正确,不正确的话给出提示信息;

- 如果命令正确,则根据传入的options和args用一个parser来解析成command可以用的方式,记录在cmd中;
- _run_print_help()函数调用cmd.process_options()来执行cmd的选项设置;
process_options()函数在command.py的ScrapyCommand类中定义,该类是其他所有scrapy command(如crawl命令)的父类。 - 有了5,6处理得到的信息,然后加上setting信息,创建抓取器;

- _run_print_help()调用_run_command()函数来执行cmd;
这里要看的是_run_command()这个函数,由此函数开始,不同的命令调用不同的run函数执行。
四、总结
scrapy的执行从scrapy_home/bin/scrapy这个脚本开始,调用cmdline这个模块。cmdline模块完成命令的解析,配置的读取和设置等等一系列工作,更具不同的命令将调用对应的模块来继续完成该命令的工作。每个具体的命令对应于一个scrapy_home/scrapy/commands包下具体的模块的一个模块。而这些命令都是ScrapyCommand这个类的子类,均override了run()这个函数,各命令的run()来完成自己不同的工作。
Scrapy源码学习(一)的更多相关文章
- Scrapy源码学习(二)
上次说到scrapy_home/scrapy/commands包下每个模块对应了scrapy命令行中的一个命令,他们都继承自command.py模块中ScrapyCommand这个类,这次就来简单看一 ...
- Java集合专题总结(1):HashMap 和 HashTable 源码学习和面试总结
2017年的秋招彻底结束了,感觉Java上面的最常见的集合相关的问题就是hash--系列和一些常用并发集合和队列,堆等结合算法一起考察,不完全统计,本人经历:先后百度.唯品会.58同城.新浪微博.趣分 ...
- jQuery源码学习感想
还记得去年(2015)九月份的时候,作为一个大四的学生去参加美团霸面,结果被美团技术总监教育了一番,那次问了我很多jQuery源码的知识点,以前虽然喜欢研究框架,但水平还不足够来研究jQuery源码, ...
- MVC系列——MVC源码学习:打造自己的MVC框架(四:了解神奇的视图引擎)
前言:通过之前的三篇介绍,我们基本上完成了从请求发出到路由匹配.再到控制器的激活,再到Action的执行这些个过程.今天还是趁热打铁,将我们的View也来完善下,也让整个系列相对完整,博主不希望烂尾. ...
- MVC系列——MVC源码学习:打造自己的MVC框架(三:自定义路由规则)
前言:上篇介绍了下自己的MVC框架前两个版本,经过两天的整理,版本三基本已经完成,今天还是发出来供大家参考和学习.虽然微软的Routing功能已经非常强大,完全没有必要再“重复造轮子”了,但博主还是觉 ...
- MVC系列——MVC源码学习:打造自己的MVC框架(二:附源码)
前言:上篇介绍了下 MVC5 的核心原理,整篇文章比较偏理论,所以相对比较枯燥.今天就来根据上篇的理论一步一步进行实践,通过自己写的一个简易MVC框架逐步理解,相信通过这一篇的实践,你会对MVC有一个 ...
- MVC系列——MVC源码学习:打造自己的MVC框架(一:核心原理)
前言:最近一段时间在学习MVC源码,说实话,研读源码真是一个痛苦的过程,好多晦涩的语法搞得人晕晕乎乎.这两天算是理解了一小部分,这里先记录下来,也给需要的园友一个参考,奈何博主技术有限,如有理解不妥之 ...
- 我的angularjs源码学习之旅2——依赖注入
依赖注入起源于实现控制反转的典型框架Spring框架,用来削减计算机程序的耦合问题.简单来说,在定义方法的时候,方法所依赖的对象就被隐性的注入到该方法中,在方法中可以直接使用,而不需要在执行该函数的时 ...
- ddms(基于 Express 的表单管理系统)源码学习
ddms是基于express的一个表单管理系统,今天抽时间看了下它的代码,其实算不上源码学习,只是对它其中一些小的开发技巧做一些记录,希望以后在项目开发中能够实践下. 数据层封装 模块只对外暴露mod ...
随机推荐
- WinServer 之 访问同网段服务器 或 同一服务器多虚拟机间的访问
今天在发布网站时遇到不能访问同网段数据库服务器.具体情况为:web服务端部署在192.168.10.1下,而数据库服务端部署在192.168.10.2下,数据库连接直接配置为192.168.10.2会 ...
- Data Structure 之 算法设计策略
1. 穷举法 基本思想:列举问题的所有可能解,并用约束条件逐一进行判定,找出符合约束条件的解. 穷举法的关键在于问题的可能解的列举和可能解的判别. 例如:凑数问题 2. 递归技术 定义:直接或间接调用 ...
- A - 敌兵布阵
Description C国的死对头A国这段时间正在进行军事演习,所以C国间谍头子Derek和他手下Tidy又开始忙乎了.A国在海岸线沿直线布置了N个工兵营地,Derek和Tidy的任务就是要监视这些 ...
- 跨平台网络库(采用C++ 11)
I:跨平台设计基础 在windows下使用0字节的WSARecv/WSASend(读写)作为读写检测,将IOCP作为一个通知模型,而"抛弃"它的异步模型. 即:把它当作epoll来 ...
- [Javascript] Try...Catch和异常处理
在JavaScript可以使用try...catch来进行异常处理.例如: try { foo.bar(); } catch (e) { alert(e.name ...
- 用bootstrapValidator来验证UEditor
我们的项目使用了bootstrapValidator来作为前端校验,但是表单里面有一个UEditor,它用bootstrapValidator是没有效果的,为了页面风格统一,只好修修改改咯 首先来看一 ...
- 【Android 界面效果45】ViewPager源码分析
ViewPager概述: Layout manager that allows the user to flip left and right through pages of data. You s ...
- 【开源项目12】Retrofit – Java(Android) 的REST 接口封装类库
Retrofit官网:http://square.github.io/retrofit/ Retrofit 和Java领域的ORM概念类似, ORM把结构化数据转换为Java对象,而Retrofit ...
- Android学习笔记④——页面的布局方式
FrameLayout(帧布局) 这个布局的特点是简单的默认把每一个视图组件都放在边框内且放在左上角,即使添加多个视图组件,他们也都是重叠在左上角,新的视图会遮挡住旧的视图.可以根据gravity来改 ...
- iOS - 第三方框架 - AFN
#5.AFNetworking 2.6使用方法 >2.6版本 支持 iOS7以上,而且支持NSURLConnectionOperation >3.0版本 支持 iOS7以上 NSURLCo ...