源码自带项目说明

使用scrapy-redis的example来修改

先从github上拿到scrapy-redis的示例,然后将里面的example-project目录移到指定的地址:

# clone github scrapy-redis源码文件
git clone https://github.com/rolando/scrapy-redis.git# 直接拿官方的项目范例,改名为自己的项目用(针对懒癌患者)
mv scrapy-redis/example-project ~/scrapyredis-project

我们clone到的 scrapy-redis 源码中有自带一个example-project项目,这个项目包含3个spider,分别是dmoz, myspider_redis,mycrawler_redis。

一、dmoz (class DmozSpider(CrawlSpider))

这个爬虫继承的是CrawlSpider,它是用来说明Redis的持续性,当我们第一次运行dmoz爬虫,然后Ctrl + C停掉之后,再运行dmoz爬虫,之前的爬取记录是保留在Redis里的。

分析起来,其实这就是一个 scrapy-redis 版 CrawlSpider类,需要设置Rule规则,以及callback不能写parse()方法。

执行方式:scrapy crawl dmoz

rom scrapy.linkextractors import LinkExtractor
from scrapy.spiders import CrawlSpider, Ruleclass DmozSpider(CrawlSpider):"""Follow categories and extract links."""name = 'dmoz'allowed_domains = ['dmoz.org']start_urls = ['http://www.dmoz.org/']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(),}

二、myspider_redis (class MySpider(RedisSpider))

这个爬虫继承了RedisSpider, 它能够支持分布式的抓取,采用的是basic spider,需要写parse函数。

其次就是不再有start_urls了,取而代之的是redis_key,scrapy-redis将key从Redis里pop出来,成为请求的url地址。

from scrapy_redis.spiders import RedisSpiderclass MySpider(RedisSpider):"""Spider that reads urls from redis queue (myspider:start_urls)."""name = 'myspider_redis'# 注意redis-key的格式:redis_key = 'myspider:start_urls'# 可选:等效于allowd_domains(),__init__方法按规定格式写,使用时只需要修改super()里的类名参数即可def __init__(self, *args, **kwargs):# Dynamically define the allowed domains list.domain = kwargs.pop('domain', '')self.allowed_domains = filter(None, domain.split(','))# 修改这里的类名为当前类名super(MySpider, self).__init__(*args, **kwargs)def parse(self, response):return {'name': response.css('title::text').extract_first(),'url': response.url,}

注意:

RedisSpider类 不需要写allowd_domains和start_urls:

  1. scrapy-redis将从在构造方法__init__()里动态定义爬虫爬取域范围,也可以选择直接写allowd_domains。

  2. 必须指定redis_key,即启动爬虫的命令,参考格式:redis_key = ‘myspider:start_urls’

  3. 根据指定的格式,start_urls将在 Master端的 redis-cli 里 lpush 到 Redis数据库里,RedisSpider 将在数据库里获取start_urls。

执行方式:
1.通过runspider方法执行爬虫的py文件(也可以分次执行多条),爬虫(们)将处于等待准备状态:

scrapy runspider myspider_redis.py

2.在Master端的redis-cli输入push指令,参考格式:

$redis > lpush myspider:start_urls http://www.dmoz.org/

3.Slaver端爬虫获取到请求,开始爬取。

三、mycrawler_redis (class MyCrawler(RedisCrawlSpider))

这个RedisCrawlSpider类爬虫继承了RedisCrawlSpider,能够支持分布式的抓取。因为采用的是crawlSpider,所以需要遵守Rule规则,以及callback不能写parse()方法。

同样也不再有start_urls了,取而代之的是redis_key,scrapy-redis将key从Redis里pop出来,成为请求的url地址。

from scrapy.spiders import Rule
from scrapy.linkextractors import LinkExtractorfrom scrapy_redis.spiders import RedisCrawlSpiderclass MyCrawler(RedisCrawlSpider):"""Spider that reads urls from redis queue (myspider:start_urls)."""name = 'mycrawler_redis'redis_key = 'mycrawler:start_urls'rules = (# follow all linksRule(LinkExtractor(), callback='parse_page', follow=True),)# __init__方法必须按规定写,使用时只需要修改super()里的类名参数即可def __init__(self, *args, **kwargs):# Dynamically define the allowed domains list.domain = kwargs.pop('domain', '')self.allowed_domains = filter(None, domain.split(','))# 修改这里的类名为当前类名super(MyCrawler, self).__init__(*args, **kwargs)def parse_page(self, response):return {'name': response.css('title::text').extract_first(),'url': response.url,}

注意:

同样的,RedisCrawlSpider类不需要写allowd_domains和start_urls:

  1. scrapy-redis将从在构造方法__init__()里动态定义爬虫爬取域范围,也可以选择直接写allowd_domains。

  2. 必须指定redis_key,即启动爬虫的命令,参考格式:redis_key = 'myspider:start_urls'

  3. 根据指定的格式,start_urls将在 Master端的 redis-cli 里 lpush 到 Redis数据库里,RedisSpider 将在数据库里获取start_urls。

执行方式:

通过runspider方法执行爬虫的py文件(也可以分次执行多条),爬虫(们)将处于等待准备状态:

scrapy runspider mycrawler_redis.py

在Master端的redis-cli输入push指令,参考格式:

$redis > lpush mycrawler:start_urls http://www.dmoz.org/

爬虫获取url,开始执行。

总结:

  1. 如果只是用到Redis的去重和保存功能,就选第一种;

  2. 如果要写分布式,则根据情况,选择第二种、第三种;

  3. 通常情况下,会选择用第三种方式编写深度聚焦爬虫。

91 爬虫 - scrapy-redis实战(二)相关推荐

  1. Python面试必备—分布式爬虫scrapy+redis解析

    传智播客博学谷 微信号:boxuegu- get最新最全的IT技能 免费领取各种视频资料 注意:文末送书 很多小伙伴留言,最近准备跳槽,但是面试的机会比较少,好不容易得到面试机会,由于技术点的匮乏,面 ...

  2. C# Redis实战(二)

    二.Redis服务 在C# Redis实战(一)中我将所有文件拷贝到了D盘redis文件夹下,其中redis-server.exe即为其服务端程序,双击即开始运行,如图 可以将此服务设置为window ...

  3. scrapy extention实战-空闲时关闭爬虫

    scrapy extention实战 1.      空闲-关闭 使用扩展+spider_idle信号关闭爬虫. 启用扩展:settings.py EXTENSIONS = {     #'scrap ...

  4. Scrapy+redis+mongodb分布式爬虫抓取小说《冰与火之歌1-5》

    一年前写了python简单实战项目:<冰与火之歌1-5>角色关系图谱构建的数据库设计和数据可视化共现图谱的构建,中间唯独缺了数据的采集,因为想着只是个小爬虫,应该无关痛痒,后面也觉得这个系 ...

  5. 爬虫---scrapy爬虫框架(详细+实战)

    ​ 活动地址:CSDN21天学习挑战赛 爬虫---scrapy爬虫框架 爬虫---scrapy爬虫框架 一.简介 1.基本功能 2.架构 3.scrapy项目的结构 二.scrapy环境搭建 三.如何 ...

  6. pythonscrapy爬虫_Python 爬虫:Scrapy 实例(二)

    原标题:Python 爬虫:Scrapy 实例(二) 稍微增加点难度,做个所需项目多一点的,并将的结果以多种形式保存起来.我们就从网络天气预报开始. 首先要做的是确定网络天气数据的来源.打开百度,搜索 ...

  7. python 爬虫实例-Python 爬虫:Scrapy 实例(二)

    原标题:Python 爬虫:Scrapy 实例(二) 稍微增加点难度,做个所需项目多一点的,并将的结果以多种形式保存起来.我们就从网络天气预报开始. 首先要做的是确定网络天气数据的来源.打开百度,搜索 ...

  8. python3 scrapy框架,Python3爬虫(十八) Scrapy框架(二)

    对Scrapy框架(一)的补充 Infi-chu: Scrapy优点: 提供了内置的 HTTP 缓存 ,以加速本地开发 . 提供了自动节流调节机制,而且具有遵守 robots.txt 的设置的能力. ...

  9. java爬取网页数据_Python网络爬虫实战(二)数据解析

    Python网络爬虫实战 (二)数据解析 本系列从零开始阐述如何编写Python网络爬虫,以及网络爬虫中容易遇到的问题,比如具有反爬,加密的网站,还有爬虫拿不到数据,以及登录验证等问题,会伴随大量网站 ...

  10. redis(二)redis实战 使用redis进行文章的排序

    2019独角兽企业重金招聘Python工程师标准>>> http://www.beckbi.cn/?p=172 redis实战使用redis进行文章的排序 转载于:https://m ...

最新文章

  1. C++ 笔记(07)— 常量(字面常量、const定义常量、constexpr 定义常量、enum 定义常量、define 定义常量)
  2. 开发者在行动!中国防疫开源项目登上GitHub TOP榜
  3. WEB渗透之对于开了3389远程连接不上的总结
  4. ASP.NET-后台cookie与前台JQUERY解析cookie
  5. hibernate.properties与hibernate.cfg.xml 区别
  6. SAP UI5 binding, property binding and resourceBinding
  7. linux安装mysql5.7.18_Linux下安装mysql5.7.18版本步骤
  8. 【分享】哪些句子一眼就会让你爱上
  9. swagger : Could not resolve reference because of: Could not resolve pointer
  10. cf980E TheNumberGames (贪心+倍增)
  11. howler 音频插件使用
  12. 计算机网络技术 网络参数配置与常用网络命令使用和网络仿真工具的使用
  13. windows下的diskpart指令修复U盘分区
  14. bp神经网络算法的优缺点,基于bp的神经网络算法
  15. 一些CSS兼容性处理写法汇总。
  16. 使用powerpoint简单的处理图片(用作浏览器背景)
  17. ANSYS中按照X坐标提取节点应力值
  18. 知乎上40个有趣回复,很精辟
  19. 移动网络运营商显示无服务器,无线路由器忽然拨不上号,显示网络运营商远端无响应怎么处理...
  20. Piezo Mac 优秀的录音软件

热门文章

  1. rtmp服务器搭建-windows
  2. ubuntu服务器lxde桌面,UBUNTU最小化搭建LXDE桌面环境
  3. pst.setDate的使用和注意事项
  4. 燃气缴费显示服务器内部错误,请问中燃燃气热水器点火一秒钟就熄火,显示一个扳手和螺丝刀,是哪里出现故障了?- 一起装修网...
  5. Hystrix的使用
  6. 二进制转换成十进制算法
  7. 1. RxJava概述
  8. 【财务】FMS财务管理系统---应付结算
  9. Windows Server 2003防木马权限设置
  10. SpringMVC-配置视图解析器