文档章节

python开源爬虫框架scrapy源码解析(一)

JieSong0
 JieSong0
发布于 2016/03/30 20:51
字数 844
阅读 961
收藏 5

    前年实习的时候因为一个偶然的机会开始接触爬虫,因为我是做JAVA开发的,当然优先JAVA开源的爬虫框架,对比Heritrix、Nutch等爬虫框架后选择Heritrix,经过近一个月的折腾最后完成任务.因为一些个人的原因离开实习公司后来校招进入现在的坑,刚好有机会接触Python, 知道有一个目前用的比较多的爬虫框架Scrapy,正好有点兴趣就玩了下,顺便就当是学习python.

    前面说了很多废话接下来开始本文的主题,由于第一次写这种文章以及个人资历尚浅, 文中难免会有错误还请见谅,请大家指出~ 谢谢.

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

Scrapy的安装可以参考官方文档。官网地址:http://www.scrapy.org/

Scrapy的源码可以在github下载.。源码地址:https://github.com/scrapy/scrapy


本系列文章按照scrapy使用步骤对源码进行介绍,主要分为下面几个方面:

             1、 安装Scrapy

             2、 新建一个Scrapy工程。

             3、 运行Scrapy工程。

   scrapy提供两种安装方式,第一种是采用linux命令安装如apt-get,另外也可以下载源码然后通过运行 python install set.py来进行安装.

 下面是对安装文件set.py的介绍,set.py中必须了解的是console_scripts,scrapy的命令行就是通过console_scripts配置的模板实现的.

with open(join(dirname(__file__), 'scrapy/VERSION'), 'rb') as f:
    version = f.read().decode('ascii').strip()    #获取scrapy版本信息
 
setup(
    ……………………………………………………………….
    packages=find_packages(exclude=('tests', 'tests.*')), #发现scrapy模块包
    include_package_data=True,
    zip_safe=False,
    entry_points={
        'console_scripts': ['scrapy =  scrapy.cmdline:execute']
                            #命令执行模块  scrapy.cmdline
    },
    ………………………………………………………
    install_requires=[     #安装需要的依赖模块
        'Twisted>=10.0.0',
        'w3lib>=1.8.0',
        'queuelib',
         ………………………………………………………………….
        'service_identity',
    ],
)

set.py中可以了解到scrapy的命令行模式都是通过调用cmdline.pyexecute方法实现的例如,执行scrapy crawl examples实际是调用scrapy.commands包中crawl.pyrun方法.下面的是cmdline.py代码片段.

def execute(argv=None, settings=None):
    if argv is None:
        argv = sys.argv
 
    # --- backwards compatibility for scrapy.conf.settings singleton ---
    if settings is None and 'scrapy.conf' in sys.modules:
        from scrapy import conf
        if hasattr(conf, 'settings'):
            settings = conf.settings
    # ------------------------------------------------------------------
 
    if settings is None:
        settings = get_project_settings()   #获取settings配置    
    check_deprecated_settings(settings)   #检查配置是否合法
 
    # --- backwards compatibility for scrapy.conf.settings singleton ---
    import warnings
    from scrapy.exceptions import ScrapyDeprecationWarning
    with warnings.catch_warnings():
        warnings.simplefilter("ignore", ScrapyDeprecationWarning)
        from scrapy import conf
        conf.settings = settings
    # ------------------------------------------------------------------
 
    inproject = inside_project()    #返回bool值
    cmds = _get_commands_dict(settings, inproject)  #获取scrapy 命令模板,如startproject crawl 等
    cmdname = _pop_command_name(argv)  #获取当前执行的命令
    parser = optparse.OptionParser(formatter=optparse.TitledHelpFormatter(), \
        conflict_handler='resolve')   #命令选项
    if not cmdname:
        _print_commands(settings, inproject)
        sys.exit(0)
    elif cmdname not in cmds:
        _print_unknown_command(settings, cmdname, inproject)
        sys.exit(2)
 
    cmd = cmds[cmdname]  #取出当前命令class
    parser.usage = "scrapy %s %s" % (cmdname, cmd.syntax())
    parser.description = cmd.long_desc()
    settings.setdict(cmd.default_settings, priority='command') #设置默认配置
    cmd.settings = settings
    cmd.add_options(parser)
    opts, args = parser.parse_args(args=argv[1:])
    _run_print_help(parser, cmd.process_options, args, opts)
 
    cmd.crawler_process = CrawlerProcess(settings)  #获取爬虫流程控制class
    _run_print_help(parser, _run_command, cmd, args, opts)  #调用_run_command方法
    sys.exit(cmd.exitcode)

def _run_command(cmd, args, opts):
    if opts.profile:    
        _run_command_profiled(cmd, args, opts)   #存在命令行选项调用该方法
    else:
        cmd.run(args, opts)  #调用ScrapyCommand子类的run方法

 


© 著作权归作者所有

JieSong0
粉丝 4
博文 7
码字总数 5389
作品 0
成都
后端工程师
私信 提问
Python3爬虫视频学习教程

大家好哈,现在呢静觅博客已经两年多啦,可能大家过来更多看到的是爬虫方面的博文,首先非常感谢大家的支持,希望我的博文对大家有帮助! 最近,主要的任务就是开发性感美女图片大全,使用p...

yangjiyue0520
2017/11/18
0
0
python网络爬虫框架Scrapy

参考文档:官方文档 爬虫介绍: 所谓网络爬虫,就是一个在网上到处或定向抓取数据的程序,当然,这种说法不够专业,更专业的描述就是,抓取特定网站网页的HTML数据。不过由于一个网站的网页很...

艾柯
2014/03/04
1K
1
Python开源爬虫框架:Scrapy架构分析

所谓网络爬虫,就是一个在网上到处或定向抓取数据的程序,当然,这种说法不够专业,更专业的描述就是,抓取特定网站网页的HTML数据。不过由于一个网站的网页很多,而我们又不可能事先知道所有...

renew
2015/01/19
376
0
使用scrapy的定制爬虫-第一章-前言

这个系列文章还在逐步完成中,可能会多次编辑 这是一个系列文章,关于定制爬虫,使用scrapy. 这是前言. 爬虫,最广为所知用途是搜索引擎的网页抓取.也有很多其他的用途. 诸如各类比价网站(etao,惠...

斑ban
2013/04/02
1K
1
一个月入门Python爬虫,快速获取大规模数据

数据是创造和决策的原材料,高质量的数据都价值不菲。而利用爬虫,我们可以获取大量的价值数据,经分析可以发挥巨大的价值,比如: 豆瓣、知乎:爬取优质答案,筛选出各话题下热门内容,探索...

Python开发者
2018/04/25
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Mybatis Plus删除

/** @author beth @data 2019-10-17 00:30 */ @RunWith(SpringRunner.class) @SpringBootTest public class DeleteTest { @Autowired private UserInfoMapper userInfoMapper; /** 根据id删除......

一个yuanbeth
57分钟前
4
0
总结

一、设计模式 简单工厂:一个简单而且比较杂的工厂,可以创建任何对象给你 复杂工厂:先创建一种基础类型的工厂接口,然后各自集成实现这个接口,但是每个工厂都是这个基础类的扩展分类,spr...

BobwithB
今天
4
0
java内存模型

前言 Java作为一种面向对象的,跨平台语言,其对象、内存等一直是比较难的知识点。而且很多概念的名称看起来又那么相似,很多人会傻傻分不清楚。比如本文我们要讨论的JVM内存结构、Java内存模...

ls_cherish
今天
4
0
友元函数强制转换

友元函数强制转换 p522

天王盖地虎626
昨天
5
0
js中实现页面跳转(返回前一页、后一页)

本文转载于:专业的前端网站➸js中实现页面跳转(返回前一页、后一页) 一:JS 重载页面,本地刷新,返回上一页 复制代码代码如下: <a href="javascript:history.go(-1)">返回上一页</a> <a h...

前端老手
昨天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部