用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()主要做了一下几个工作:

  1. 处理参数信息为空的情况;
  2. 处理配置信息(包含向后兼容的代码),这样新的scrapy可以处理以前老版本下生成的项目;
  3. 判断目前执行scrapy命令的当前目录是否包含一个scrapy project,因为在scrapy project中可以执行更多的command选择;
  4. 判断传入的command是否正确,不正确的话给出提示信息;
  5. 如果命令正确,则根据传入的options和args用一个parser来解析成command可以用的方式,记录在cmd中;
  6. _run_print_help()函数调用cmd.process_options()来执行cmd的选项设置;

    process_options()函数在command.py的ScrapyCommand类中定义,该类是其他所有scrapy command(如crawl命令)的父类。
  7. 有了5,6处理得到的信息,然后加上setting信息,创建抓取器;
  8. _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源码学习(一)的更多相关文章

  1. Scrapy源码学习(二)

    上次说到scrapy_home/scrapy/commands包下每个模块对应了scrapy命令行中的一个命令,他们都继承自command.py模块中ScrapyCommand这个类,这次就来简单看一 ...

  2. Java集合专题总结(1):HashMap 和 HashTable 源码学习和面试总结

    2017年的秋招彻底结束了,感觉Java上面的最常见的集合相关的问题就是hash--系列和一些常用并发集合和队列,堆等结合算法一起考察,不完全统计,本人经历:先后百度.唯品会.58同城.新浪微博.趣分 ...

  3. jQuery源码学习感想

    还记得去年(2015)九月份的时候,作为一个大四的学生去参加美团霸面,结果被美团技术总监教育了一番,那次问了我很多jQuery源码的知识点,以前虽然喜欢研究框架,但水平还不足够来研究jQuery源码, ...

  4. MVC系列——MVC源码学习:打造自己的MVC框架(四:了解神奇的视图引擎)

    前言:通过之前的三篇介绍,我们基本上完成了从请求发出到路由匹配.再到控制器的激活,再到Action的执行这些个过程.今天还是趁热打铁,将我们的View也来完善下,也让整个系列相对完整,博主不希望烂尾. ...

  5. MVC系列——MVC源码学习:打造自己的MVC框架(三:自定义路由规则)

    前言:上篇介绍了下自己的MVC框架前两个版本,经过两天的整理,版本三基本已经完成,今天还是发出来供大家参考和学习.虽然微软的Routing功能已经非常强大,完全没有必要再“重复造轮子”了,但博主还是觉 ...

  6. MVC系列——MVC源码学习:打造自己的MVC框架(二:附源码)

    前言:上篇介绍了下 MVC5 的核心原理,整篇文章比较偏理论,所以相对比较枯燥.今天就来根据上篇的理论一步一步进行实践,通过自己写的一个简易MVC框架逐步理解,相信通过这一篇的实践,你会对MVC有一个 ...

  7. MVC系列——MVC源码学习:打造自己的MVC框架(一:核心原理)

    前言:最近一段时间在学习MVC源码,说实话,研读源码真是一个痛苦的过程,好多晦涩的语法搞得人晕晕乎乎.这两天算是理解了一小部分,这里先记录下来,也给需要的园友一个参考,奈何博主技术有限,如有理解不妥之 ...

  8. 我的angularjs源码学习之旅2——依赖注入

    依赖注入起源于实现控制反转的典型框架Spring框架,用来削减计算机程序的耦合问题.简单来说,在定义方法的时候,方法所依赖的对象就被隐性的注入到该方法中,在方法中可以直接使用,而不需要在执行该函数的时 ...

  9. ddms(基于 Express 的表单管理系统)源码学习

    ddms是基于express的一个表单管理系统,今天抽时间看了下它的代码,其实算不上源码学习,只是对它其中一些小的开发技巧做一些记录,希望以后在项目开发中能够实践下. 数据层封装 模块只对外暴露mod ...

随机推荐

  1. IIS 之 HTTP错误 404.17 - Not Found(请求的内容似乎是脚本,因而将无法由静态文件处理程序来处理。)

    问题描述:HTTP 404.17 - Not Found" IIS 7.5 请求的内容似乎是脚本,因而将无法由静态文件处理程序来处理 .   出现这种情况的原因通常是因为先安装了Framew ...

  2. postgres函数

    1.数据修复最先考虑通过db内做修复,实在不行,在考虑外部应用程序通过jdbc修复. 比如一个场景:profile_image_url与enlarge_image_url都是微博用户信息返回的字段. ...

  3. Play on Words 欧拉通路(回路)判断

    Play on Words note:  判断一下连通性. #include <iostream> #include <cstdio> #include <cstring ...

  4. Git_Windows 系统下Git安装图解

    Windows 系统下Git安装图解  心得  :很成功~ 简单来说Git是一个免费的.开源的版本控制软件,从功能上讲,跟我们比较熟悉的Subversion(SVN)这类版本控制软件没什么两样.由于工 ...

  5. ResultSet几种类型的区别

    TYPE_FORWARD_ONLY: 默认方式,结果集不能滚动,游标只能向前移动,从第一行移动到最后一行.结果集中的内容与底层数据库生成的结果有关,即生成的结果与查询有关. TYPE_SCROLL_I ...

  6. JavaScript break和continue 跳出循环

    在JavaScript中,使用 break 和 continue 语句跳出循环: break语句的作用是立即跳出循环,即不再执行后面的所有循环: continue语句的作用是停止正在执行的循环,直接进 ...

  7. [转]oracle 11g 忘记 默认用户密码

    本文转自:http://blog.csdn.net/huangbiao86/article/details/6595052 首先启动sqlplus 输入用户名:sqlplus / as sysdba ...

  8. hdu 4411 最小费用流

    思路:主要就是要把一个每个城市拆为两个点,建一条容量为1,费用为-inf的边,保证每个城市都会被遍历. /*最小费用最大流*/ #include<iostream> #include< ...

  9. sysobjects.xtype介绍

    SQL Server数据库的一切信息都保存在它的系统表格里. 在大多数情况下,对你最有用的两个列是Sysobjects.name和Sysobjects.xtype.前面一个用来列出待考察对象的名字,而 ...

  10. sql将表中的某个字段进行排序

    . update tempTable set field1 = rownum from( select field1, ROW_NUMBER() over(order by fieldId) rown ...