Windows 10家庭中文版,Python 3.6.4,Scrapy 1.5.0,

在创建了爬虫程序后,就可以运行爬虫程序了。Scrapy中介绍了几种运行爬虫程序的方式,列举如下:

-命令行工具之scrapy runspider(全局命令)

-命令行工具之scrapy crawl(项目级命令)

-scrapy.crawler.CrawlerProcess

-scrapy.crawler.CrawlerRunner

注意,当系统中同时存在Python 2、Python 3时,孤的电脑直接执行scrapy命令使用的是Python 2,此时,需要在scrapy命令前添加“python3 -m”才可以使用Python 3,因此,请使用virtualenv建立虚拟环境运行scrapy等各种程序。

方式一:scrapy runspider命令(全局)

语法:scrapy runspider <spider_file.py>

还有一些配置项,可以使用scrapy runspider -h查看。

示例程序:文件名为baidu_com.py

 1 # -*- coding: utf-8 -*-
 2 import scrapy
 3
 4 class BaiduComSpider(scrapy.Spider):
 5     name = 'baidu.com'
 6     allowed_domains = ['www.baidu.com']
 7     start_urls = ['https://www.baidu.com/']
 8
 9     def parse(self, response):
10         yield {
11             'title': response.xpath('//title/text()').extract_first()
12         }

parse函数使用response.xpath获取网页<title>的文本:

方式二:scrapy crawl(项目级)

crawl是项目级命令,因此只能在某个Scrapy项目中使用。那么,首先创建项目test070401:

使用tree命令查看创建的项目的结构:

刚刚创建的Scrapy项目的spiders目录中只有__init__.py文件,那么,将之前创建的baidu_com.py拷贝到此文件中:

现在,可以在项目test070401中使用crawl命令执行爬虫程序了。且慢,先看看crawl的语法:

scrapy crawl <spider>

注意,是<spider>而不是runspider命令的<spider_file.py>,准确的说<spider>是一个 爬虫程序的名称——爬虫类里面的name属性(必须required,且在项目中具有唯一性unique)。

baidu_com.py里面的爬虫类的名称是什么呢?baidu.com

疑问:一个爬虫文件里面是否可以建立多个爬虫类呢?

那么,执行下面的命令即可运行baidu_com.py里面的爬虫程序了:

scrapy crawl baidu.com

{

很尴尬,第一次执行居然失败了,没找到!

严重怀疑是拷贝的问题,拷贝过来后 还需要做一些配置吧?配置在……settings.py里面看看!

参考其它在项目里面建立的爬虫程序,发现settings.py中没有其配置;spiders包下面的__init__.py文件呢?也没发现其配置!

噩耗!怎么办?应该是可以执行的啊!

晕~字母拼写错误:baidu.com 拼写成 badu.com!严重警告一次!

}

重新执行正确的命令:仍然没有获取到需要的数据,因为,robots协议的存在,程序被拒绝了!

警示:所以,抓取数据不一定会成功,因为还会被网站拒绝!但是,开发爬虫程序时,必须要遵循相应的道德(规范)!

更多思考:

可是,为何之前使用runspider抓取数据成功了呢?

再次使用runspider命令执行baidu_com.py:结果, 成功!

为何如此 区别对待呢?

检查两者启动时的scrapy.crawler发现了不同:其中的crawl命令里面包含ROBOTSTXT_OBEY为True,表明其遵守站点的robots.txt协议!

那么,测试中的站点的robots.txt是怎样的呢?它几乎拒绝了所有的爬虫程序——Disallow!当然,baidu.com本来就是爬虫了,怎么会允许其它爬虫爬取它呢?爬虫爬取爬虫,好奇怪!

当然,Scrapy项目是否遵守robots.txt协议,是可以在settings.py中配置的,请参考官文Settings。

疑问:runspider、crawl命令是否可以执行多个爬虫程序呢?请测试!

------分割线------

学习Scrapy之初一直有一个困惑,爬虫程序只能使用命令行来执行吗?不能写程序来执行吗?当然可以!

直到看了官文 Common Practices,此文中还介绍了一点关于分布式爬取(Distributed crawls)的内容,但本篇博客不涉及。

方式三:CrawlerProcess

使用CrawlerProcess执行上面的baidu_com.py中的爬虫类,程序runcp.py如下:

1 import scrapy
2 from scrapy.crawler import CrawlerProcess
3 from baidu_com import BaiduComSpider
4
5 # 创建一个CrawlerProcess对象
6 process = CrawlerProcess() # 括号中可以添加参数
7
8 process.crawl(BaiduComSpider)
9 process.start()

执行程序runcp.py:成功,抓取到了需要的数据。

孤是在virtualenv中执行,所以,直接输入runrc.py就可以运行程序,否则,请使用python -m runrc.py

注意,上面的程序是在Scrapy项目外执行的,如果是在项目内执行,

-可以使用get_project_settings()函数获取项目的一个Settings实例作为CrawlerProcess的参数;

-传递给crawl(...)函数的可以是项目内爬虫程序的name属性的值;

疑问,在项目内执行时,是否可以 混合使用项目内外的爬虫程序执行呢?既使用项目内的,也可以通过导入使用项目外的。

疑问:

是否可以执行多个爬虫程序呢?按理说 可以;(实际上也是可以的,官文有介绍)

是否可以定时执行爬虫程序呢?按理说 可以;(本文未介绍)

关于第一个“执行多个”的问题,在官文 Common Practices中有介绍,示例如下(仍然是在Scrapy项目外):

 1 import scrapy
 2 from scrapy.crawler import CrawlerProcess
 3 from baidu_com import BaiduComSpider
 4 from msn_com import MsnComSpider
 5
 6 # 创建一个CrawlerProcess对象
 7 process = CrawlerProcess() # 括号中可以添加参数
 8
 9 process.crawl(BaiduComSpider)
10 process.crawl(MsnComSpider)
11 process.start()

执行结果:不过,注意日志显示的抓取顺序和代码中相反。

方式四:CrawlerRunner

官文对CrawlerRunner有更详细的介绍,还涉及到Twisted模块中的Reactor、Deferred等,而孤对Twisted模块的用法还不熟悉,只是昨天看了Deferred的参考文档。

但是,本文的目的是使用CrawlerRunner来编写脚本运行爬虫程序,那么,关于Twisted可以稍候详细了解,需要精通

本节包括下面的程序(均为Scrapy项目外):

-运行单个爬虫程序

-运行多个爬虫程序

-使用inlineCallbacks的方式运行爬虫程序(多个)

运行单个爬虫程序

 1 from twisted.internet import reactor
 2 import scrapy
 3 from scrapy.crawler import CrawlerRunner
 4 from scrapy.utils.log import configure_logging
 5 from baidu_com import BaiduComSpider
 6
 7 # 必须执行下面的,否则命令行中没有数据输出,555,
 8 configure_logging({'LOG_FORMAT': '%(levelname)s: %(message)s'})
 9
10 # 创建一个CrawlerRunner对象
11 runner = CrawlerRunner()
12
13 d = runner.crawl(BaiduComSpider) # 返回一个Twisted中的Deferred对象
14 d.addBoth(lambda _: reactor.stop()) # addBoth参考Derrerred的文档
15 reactor.run()

执行结果:获取数据成功,,不过,第一次执行什么也没有输出到命令行中,因为没有执行configure_logging,为何这样?

运行多个爬虫程序

 1 from twisted.internet import reactor
 2 import scrapy
 3 from scrapy.crawler import CrawlerRunner
 4 from scrapy.utils.log import configure_logging
 5 from baidu_com import BaiduComSpider
 6 from techmeme_com import TechmemeComSpider
 7
 8 configure_logging()
 9
10 # 创建一个CrawlerRunner对象
11 runner = CrawlerRunner()
12
13 runner.crawl(BaiduComSpider)
14 runner.crawl(TechmemeComSpider)
15 d = runner.join() # 在多线程编程中见到过此函数,这里是?
16 d.addBoth(lambda _: reactor.stop()) # addBoth参考Derrerred的文档
17 reactor.run()

执行结果:获取数据成功,不过,techmeme.com的抓取结果 没有“一瞬间”显示出来,而是延迟了2~3秒。

注意,其获取网页的顺序和程序中添加的一致,当然,也可能是因为延迟问题。

使用inlineCallbacks的方式运行爬虫程序(多个)

需要懂Twisted的Dererred才能理解的!孤目前懂了10%吧?程序如下:

 1 from twisted.internet import reactor, defer
 2
 3 from scrapy.crawler import CrawlerRunner
 4 from scrapy.utils.log import configure_logging
 5
 6 from baidu_com import BaiduComSpider
 7 from techmeme_com import TechmemeComSpider
 8
 9 configure_logging()
10
11 # 创建一个CrawlerRunner对象
12 runner = CrawlerRunner()
13
14 # 关键点来了!
15 @defer.inlineCallbacks
16 def crawl():
17     yield runner.crawl(BaiduComSpider)
18     yield runner.crawl(TechmemeComSpider)
19     reactor.stop()
20
21 # 调用crawl()
22 crawl()
23
24 reactor.run()

执行结果:执行成功(就不展示截图了,和前面一个程序的结果一样)!

总结

通过本文,孤对运行爬虫程序的方式有了更全面的了解了,读者您呢?

不过会有些不足,那就是对Twisted的reactor、Deferred不了解,并且自己对Python的装饰器使用没有达到精通级别,所以,看到装饰器会有些发怵!

本文没有 定时执行爬虫程序 的方法,因为水平不足,不过,既然都能在程序执行了,那么,离完成 定时执行爬虫程序 的目标还远吗?

没有写 分布式爬虫 的问题,孤自己懂了再写呗!

在看Twisted的文档时会遇到很多“新东西”,这就是困难了,心中对自己的期望应该是——读一遍就可以了,自己很聪明,可是呢?自己不过是个不如想象中聪明的普通人,一遍,是远远不够的,要很多遍!同时结合多练习,这也是孤最近学习东西时发现的一个问题——把自己的学习能力“想象”的太厉害了,而当显示出现差距时,自己就会感觉挫折,产生负面情绪。不过,现在认识到这一点了,能更好地理解自己了,所以,不会觉得学不会,只是觉得一遍学不会而已,不会再对自己这个人产生怀疑。

对了,下面是Twisted的一些链接(学习Twisted还需要懂的异步、同步、阻塞、非阻塞IO,更别说Python的装饰器、协程等基础知识和最新的async/awati关键字的使用了):

Twisted官网

Introduction to Deferred

Deferred Reference

Reactor Overview

P.S.又写了一篇,感觉自己棒棒哒!幸亏吃了那个小蛋糕!~今天的笔记本电量消耗好快啊(5个半小时),剩余36%了!而且没带充电器!~

转载于:https://www.cnblogs.com/luo630/p/9262486.html

Scrapy:运行爬虫程序的方式相关推荐

  1. python释放变量内存_python解释器安装,运行python程序的方式及程序运行的步骤,变量与自动的内存管理...

    一.python解释器安装 ps: 注意设置环境变量(文件是操作系统的概念,操作系统优先在当前文件夹找,找不到就到环境变量path找) python解释器不兼容 解释器下载官网:http://pyth ...

  2. python运行软件-Python中四种运行其他程序的方式

    在Python中,可以方便地使用os模块来运行其他脚本或者程序,这样就可以在脚本中直接使用其他脚本或程序提供的功能,而不必再次编写实现该功能的代码.为了更好地控制运行的进程,可以使用win32proc ...

  3. python运行程序-Python中四种运行其他程序的方式

    在Python中,可以方便地使用os模块来运行其他脚本或者程序,这样就可以在脚本中直接使用其他脚本或程序提供的功能,而不必再次编写实现该功能的代码.为了更好地控制运行的进程,可以使用win32proc ...

  4. python语言只有一种运行方式_Python中四种运行其他程序的方式

    在Python中,可以方便地使用os模块来运行其他脚本或者程序,这样就可以在脚本中直接使用其他脚本或程序提供的功能,而不必再次编写实现该功能的代码.为了更好地控制运行的进程,可以使用win32proc ...

  5. anaconda怎么运行python程序_Python中四种运行其他程序的方式,你知道吗?

    前言 在Python中,可以方便地使用os模块来运行其他脚本或者程序,这样就可以在脚本中直接使用其他脚本或程序提供的功能,而不必再次编写实现该功能的代码.为了更好地控制运行的进程,可以使用win32p ...

  6. 路由器逆向分析------在QEMU MIPS虚拟机上运行MIPS程序(ssh方式)

    本文博客地址:http://blog.csdn.net/qq1084283172/article/details/69652258 在QEMU MIPS虚拟机上运行MIPS程序--SSH方式 有关在u ...

  7. scrapy 中爬取时被重定向_一篇文章教会你理解Scrapy网络爬虫框架的工作原理和数据采集过程...

    今天小编给大家详细的讲解一下Scrapy爬虫框架,希望对大家的学习有帮助. 1.Scrapy爬虫框架 Scrapy是一个使用Python编程语言编写的爬虫框架,任何人都可以根据自己的需求进行修改,并且 ...

  8. Python入门(安装)——第一个爬虫程序(爬取山东各城市天气信息)

    Python爬虫原来可以这么简单,前两天有个朋友让我帮她看一下爬取天气的一段程序有什么问题,这段程序是用Python写的,只是以前听说Python爬虫很厉害,但是不知道自己怎么会没有时间开始.刚好我也 ...

  9. 带你快速了解爬虫的原理及过程,并编写一个简单爬虫程序

    目录 前言 你应该知道什么是爬虫? 一.Scrapy的基本执行过程 二.Scrapy的实现 2.1Scrapy框架安装 2.2创建项目 (1)爬虫框架组件介绍 (2)控制台运行创建框架命令(spide ...

最新文章

  1. 7.26-Codeforces Round #372 (Div. 2)
  2. Bob的烦恼II 逃离迷宫
  3. POJ1358 Agri-Net
  4. 安全手册(初稿)[转]
  5. 迷雾世界无限号服务器,迷雾世界部分服务器互通公告_迷雾世界部分服务器3月31日数据互通详情分析_手心游戏...
  6. python编的俄罗斯方块游戏_python编写俄罗斯方块
  7. Python开发第一篇 基础篇(下)
  8. LESS学习笔记(二)
  9. 喧嚣之后,BAT都在车联网领域落下了哪些棋子?
  10. 推荐:小众软件——各类软件的精品
  11. 复合型数据结构:C数组
  12. MC9S12XS128nbsp;16位PWMnbsp;电…
  13. 在Linux系统下制作U盘启动盘
  14. 解决软件安装的2203报错
  15. 重拾Java基础知识:网络编程
  16. 基于移动位置服务器,基于移动位置的服务系统及方法
  17. 重装Ubuntu(Linux)后快速搭建工作环境(深度学习环境)
  18. 微信公众号查询账户余额等
  19. swaks邮件伪造获取键盘记录
  20. IC卡参数、公钥之 RID、AID

热门文章

  1. html更改纵坐标数值,excel折线图纵坐标轴数值与实际值不一致该怎么办?折线图怎么修改纵坐标...
  2. 致我成为社畜的第一年
  3. 2023年考生必读!PMP最强自学教程
  4. 今天试着用原生axios以及jquery下的axios请求数据
  5. jsoup-1.11.2.jar,JsoupXpath-0.3.2.jar相关jar包及Jsoup开发说明文档
  6. 最新免费dede采集方法大全
  7. 云原生第4课:Kubernetes 集群管理
  8. 前端css外部样式引入html
  9. Java毕设项目自行车在线租赁管理系统2021(java+VUE+Mybatis+Maven+Mysql)
  10. 简易人流量统计c语言编程,人流量统计系统设计.doc