git clone https://github.com/rolando/scrapy-redis.git
cd到示例项目中:
安装缺少的scrapy-redis模块: pip install scrapy-redis
启动爬虫:
把启动的爬虫中止,在RDM中查看爬虫的结果:
此时发现数据队列中有174条数据,接下来继续启动爬虫,观察数据的变化:
以上就实现断点续爬。
mv scrapy-redis/example-project ~/scrapyredis-project
在domz爬虫文件中,实现方式就是crawlspider
类型的爬虫。
dmoz.py文件
from scrapy.linkextractors import LinkExtractor
from scrapy.spiders import CrawlSpider, Rule
class DmozSpider(CrawlSpider):
"""Follow categories and extract links."""
name = 'dmoz'
allowed_domains = ['dmoz-odp.org']
start_urls = ['http://www.dmoz-odp.org/']
# 定义数据提取规则,使用了css选择器
rules = [
Rule(LinkExtractor(
restrict_css=('.top-cat', '.sub-cat', '.cat-item')
), callback='parse_directory', follow=True),
]
def parse_directory(self, response):
for div in response.css('.title-and-desc'):
yield {
'name': div.css('.site-title::text').extract_first(),
'description': div.css('.site-descr::text').extract_first().strip(),
'link': div.css('a::attr(href)').extract_first(),
}
在settings.py中多了以下内容,这几行表示scrapy_redis
中重新实现的了去重的类,以及调度器,并且使用RedisPipeline
管道类
# 设置重复过滤器的模块
DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter"
# 设置调取器, scrapy_redis中的调度器具备与数据库交互的功能
SCHEDULER = "scrapy_redis.scheduler.Scheduler"
# 设置当爬虫结束的时候是否保持redis数据库中的去重集合与任务队列
SCHEDULER_PERSIST = True
ITEM_PIPELINES = {
'example.pipelines.ExamplePipeline': 300,
# 当开启该管道,该管道将会把数据库存到redis数据库中
'scrapy_redis.pipelines.RedisPipeline': 400,
}
# 设置redis数据库
REDIS_URL = "redis://127.0.0.1:6379"
REDIS_URL = "redis://127.0.0.1:6379"
#或者使用下面的方式
# REDIS_HOST = "127.0.0.1"
# REDIS_PORT = 6379
继续执行程序,会发现程序在前一次的基础之上继续往后执行,所以domz爬虫是一个基于url地址的增量式的爬虫
从settings.py中的三个配置来进行分析 分别是:
RedisPipeline中观察process_item,进行数据的保存,存入了redis中
RFPDupeFilter 实现了对request对象的加密
scrapy_redis调度器的实现了决定什么时候把request对象加入带抓取的队列,同时把请求过的request对象过滤掉
打开example-project项目中的myspider_redis.py文件
通过观察代码:
__init__
方法,该方法不是必须的,可以手动指定allow_domainsscrapy crawl 爬虫名
,使该节点的scrapy_redis爬虫程序就位lpush redis_key 'start_url'
,使全部节点真正的开始运行DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter"
SCHEDULER = "scrapy_redis.scheduler.Scheduler"
SCHEDULER_PERSIST = True
ITEM_PIPELINES = {
'example.pipelines.ExamplePipeline': 300,
'scrapy_redis.pipelines.RedisPipeline': 400,
}
REDIS_URL = "redis://127.0.0.1:6379"
以书山有路网为例:详情查看博客:Scrapy_redis框架分布式爬虫的实现案例-书山有路网_IT之一小佬的博客-程序员宅基地
注意:启动方式可以用别的方式:scrapy runspider book.py 可以用相对路径,也可以用绝对路径
分布式爬虫的编写流程:
1.编写普通爬虫
2.改造成分布式爬虫
2.1改造爬虫
2.2改造配置文件
分布式爬虫使用场景:
分布式的实现:
文章浏览阅读1.4k次。Python基础之time模块1.引入time模块import time2.获取时间戳(1)time.time()获取当前时间戳time1 = time.time()# 1532352941.8780842(2)time.localtime([sec]) 将时间戳格式化为本地时间,sec为指定时间戳,默认为当前时间time1 = time.loca..._python timeer
文章浏览阅读3.6k次,点赞2次,收藏13次。`netstat` 这个命令一直以为是 net status 的缩写,今天一查发现并没有找到官方的这种说法,然后参考了 man 手册,发现这个词更像是 net statistics 的缩写,命令的作用是显示网络连接、路由表、接口连接、无效连接和多播成员关系的..._linux netstat -ano
文章浏览阅读3.1k次,点赞2次,收藏26次。目录SqlmapSqlmap的简单用法探测指定URL是否存在SQL注入漏洞查看数据库的所有用户(--users)查看数据库所有用户名的密码(--passwords)查看数据库当前用户(--current-user)判断当前用户是否有管理权限(--is-dba列出数据库管理员角色(--roles)查看所有的数据库(--dbs)查看当前的数据库(--current-db)爆出指定数据库中的所有的表爆..._--tamper=space2comment
文章浏览阅读4.3k次。burst的音标英 [bɜːst]美 [bɜːrst]burst的用法v. (使)爆裂,胀开;猛冲;突然出现;爆满;涨满n. 突发;猝发;迸发;爆破;爆裂;裂口;一阵短促的射击第三人称单数: bursts 现在分词: bursting 过去式: burst 过去分词: burstburst的例句1.The driver lost control when a tyre burst一个车胎爆了,司机..._burst
文章浏览阅读1.1k次。4.1 理解IP地址MAC地址和IP地址数据包的目标IP地址决定了数据包最终到达哪一个计算机,而目标MAC地址决定了该数据包下一跳由哪一个设备接收,不一定是终点MAC地址决定下一跳给哪个设备IP地址决定数据包最终给哪个计算机IP地址的组成计算机的IP地址由两部分组成,一部分为网络标识,一部分为主机标识,同一网段的计算机网络部分相同,路由器连接不同网段,负责不同网段之间的数据转发,交换..._判断属于哪个、子网
文章浏览阅读2.4k次。文章目录 1、功能展示 2、购买API 3、 API 文档 4、SpringBoot集成身份认证 4.1、IdProperties 4.2、IdAutoConfiguration 4.3、完成身份认证 4.3.1抽取 GeetestForm: 4.3.2、UserAuthForm 4.3.3、UserController: 4.3.4、UserService: 4.3.5、UserServiceImpl 4.3.6_springboot 身份证
文章浏览阅读83次。B、中程调度的主要功能是当内存紧张是挂起部分暂时不运行的进程,并在内存有空闲时激活部分被挂起的进程,以提高内存利用与和系统吞吐量。[P1638] 在对记录型信号量的wait操作的定义中,当信号量的值( )时,执行wait操作的进程变为阻塞状态。[P1648] 作业的操作分为若干作业步,一个典型作业操作通常分为三个作业步,下列错误的是( )[P1637] 已知记录型信号量S,当前S.value的值为-5,下列选项错误的是( )A.用户数越少 B.用户数越多 C.内存越小 D.内存越大。_操作系统考研真题网盘
文章浏览阅读335次。1:报错如下java.io.IOException: (null) entry in command string: null chmod 0644复制代码解决方案1.下载winutils的windows版本在hadoop2.7.x版本里,请使用:https://github.com/SweetInk/hadoop-common-2.7.1-bin随便解压到一个目录,将加压出来的bin..._hadoop 正尝试在 windows 操作系统上使用 posix 文件权限相关的 api,导致该异常的
文章浏览阅读5.9k次,点赞7次,收藏45次。图自https://blog.csdn.net/abc13526222160/article/details/86497684_torch与conda对应
文章浏览阅读2.2k次。准备工作国际化的准备工作如下:向容器中注入@Bean public ResourceBundleMessageSource messageSource() { ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource(); messageSource.setBasename("i18n"); // 资源文件 messageSource.setDefaultEncoding("U_i18n accept-language
文章浏览阅读1.3w次。本文章主要讲解bpmn事件,系列文章包含工作流、工作流系统、工作流引擎的相关讲解,涉及的到Camunda BPM、BPMN规范、activit的基础性知识,对于流程自动化、业务流程等进行了深入研究探讨。_bpmn 事件
文章浏览阅读4.2k次,点赞3次,收藏5次。秀才推荐这是一篇曾经非常火的文章特别是以下这几句: 现随着普通劳动者的工资越来越高,读书无用论的说法也越来越甚。我觉得首先这是对以前大学生高高在上的一种不正常的风气的反弹,那时大学生稀缺,身价虚高,仿佛读了大学就高人一等,毫不费力得拿高工资,凭什么? 同样付出劳动,同样创造价值,就应该得到合理的收获;终于人们发现不是所有的大学生就一定比农民工干得好,有时不是抛出名校研究生卖猪肉之类的新闻,让长..._时间腾挪出空间