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会 ...
- J2SE J2EE J2ME的区别
J2SE J2EE J2ME的区别 J2SE J2EE J2ME的区别多数编程语言都有预选编译好的类库以支持各种特定的功能,在Java中,类库以包(package)的形式提供,不同版本的Java提供不 ...
- iOS 下拉刷新 上拉加载实现原理
1.下拉刷新 实现原理 if (scrollView.contentOffset.y < -100) { [UIView animateWithDuration:1.0 animations:^ ...
- 02. SQL表达式的灵活使用
什么是SQL表达式?在SQL语句中,表达式可以是函数,也可以是列和列之间的混合运算.很多时候,对于表达式的使用,可以比单独操作表上的列,带来更多方便. 一. 在HAVING中使用表达式 --drop ...
- maven 添加中央仓库中没有的jar
jar文件需要放到当前目录下,执行以下命令,设置 groupId,artifactId,version信息,方便项目pom引用 mvn install:install-file -Dfile=xxx. ...
- js实现shell排序
//shell排序配插入排序function shell_insert_sort(arr){ var gap = arr.length; do{ gap = parseInt(gap/3) + 1; ...
- 第五节 关于SpringMVC中Ajax的配置和应用[下午]
成熟,不是学会表达,而是学会咽下,当你一点一点学会克制住很多东西,才能驾驭好人生. 还有一周,祥云19就算结算了,一个半月的相处希望,胖先生算一个合格的老师 小白,小蔡,2婷婷,小猴,小恒,小崔,小龙 ...
- hdu 2121 , hdu 4009 无定根最小树形图
hdu 2121 题目:给出m条有向路,根不确定,求一棵最小的有向生成树. 分析:增加一个虚拟节点,连向n个节点,费用为inf(至少比sigma(cost_edge)大).以该虚拟节点为根求一遍最小树 ...
- 如果AlertView输入框为空,则禁止点击确定按钮
//UIAlertView的代理方法(创建UIAlertView之后,copy此代理方法即可) - (BOOL)alertViewShouldEnableFirstOtherButton:(UIAle ...
- WebAPI GET和POST请求的几种方(转发)
WebAPI GET和POST请求的几种方式 GET请求 1.无参数get请求 一般get请求有两种写法,一种是$.get() 一种是$.ajax({type:"get"}), ...