当前位置: 首页 > news >正文

专门做物业催收的网站做视频周边的网站

专门做物业催收的网站,做视频周边的网站,摄影网站设计论文,游戏怎么开发前言: 对于scrapy-redis有一个特殊的地方,就是队列的进出关系,因为我们的url请求会从各个任务统一归纳到redis里面,因此,如何解决下载请求这个问题,也是scrapy-redis的一个关键点!!! 正文: 先讲解代码,讲它自带的3个队列方式; 然后,再讲讲如何自定义队列... 原文翻译: 1.Bas…前言: 对于scrapy-redis有一个特殊的地方,就是队列的进出关系,因为我们的url请求会从各个任务统一归纳到redis里面,因此,如何解决下载请求这个问题,也是scrapy-redis的一个关键点!!! 正文: 先讲解代码,讲它自带的3个队列方式; 然后,再讲讲如何自定义队列... 原文翻译: 1.Base类 try:from scrapy.utils.request import request_from_dict except ImportError:from scrapy.utils.reqser import request_to_dict, request_from_dictfrom . import picklecompatclass Base(object):Per-spider base queue class# 每个爬虫的基本队列类def __init__(self, server, spider, key, serializerNone):Initialize per-spider redis queue.初始化每个爬虫的Redis队列。Parameters----------server : StrictRedisRedis client instance. Redis客户端实例。spider : SpiderScrapy spider instance. Scrapy爬虫实例。key: strRedis key where to put and get messages. 在Redis中用于放置和获取消息的键。serializer : objectSerializer object with loads and dumps methods. 具有“loads”和“dumps”方法的序列化对象。if serializer is None:# Backward compatibility.# TODO: deprecate pickle.serializer picklecompatif not hasattr(serializer, loads):raise TypeError(fserializer does not implement loads function: {serializer})if not hasattr(serializer, dumps):raise TypeError(fserializer does not implement dumps function: {serializer})self.server serverself.spider spiderself.key key % {spider: spider.name}self.serializer serializerdef _encode_request(self, request):Encode a request object将请求对象进行编码try:obj request.to_dict(spiderself.spider)except AttributeError:obj request_to_dict(request, self.spider)return self.serializer.dumps(obj)def _decode_request(self, encoded_request):Decode a request previously encoded解码先前编码的请求obj self.serializer.loads(encoded_request)return request_from_dict(obj, spiderself.spider)def __len__(self):Return the length of the queue返回队列的长度raise NotImplementedErrordef push(self, request):Push a request推送一个请求raise NotImplementedErrordef pop(self, timeout0):Pop a request弹出一个请求raise NotImplementedErrordef clear(self):Clear queue/stack清除队列/堆栈self.server.delete(self.key)2.三个自带的queue类 class FifoQueue(Base):Per-spider FIFO queue# 单个爬虫的先进先出队列def __len__(self):Return the length of the queuereturn self.server.llen(self.key) # 返回队列的长度def push(self, request):Push a requestself.server.lpush(self.key, self._encode_request(request)) # 推送一个请求到队列头部def pop(self, timeout0):Pop a requestif timeout 0:data self.server.brpop(self.key, timeout)if isinstance(data, tuple):data data[1]else:data self.server.rpop(self.key)if data:return self._decode_request(data) # 从队列尾部弹出一个请求并返回class PriorityQueue(Base):Per-spider priority queue abstraction using redis sorted set# 单个爬虫的优先级队列使用Redis的有序集合实现def __len__(self):Return the length of the queuereturn self.server.zcard(self.key) # 返回队列的长度def push(self, request):Push a requestdata self._encode_request(request)score -request.priorityself.server.execute_command(ZADD, self.key, score, data) # 根据请求的优先级将请求推送到队列中def pop(self, timeout0):Pop a requestpipe self.server.pipeline()pipe.multi()pipe.zrange(self.key, 0, 0).zremrangebyrank(self.key, 0, 0)results, count pipe.execute() # 使用管道操作实现原子的范围取值和移除操作if results:return self._decode_request(results[0]) # 从队列中弹出优先级最高的请求并返回class LifoQueue(Base):Per-spider LIFO queue.# 单个爬虫的后进先出队列def __len__(self):Return the length of the stackreturn self.server.llen(self.key) # 返回堆栈的长度def push(self, request):Push a requestself.server.lpush(self.key, self._encode_request(request)) # 推送一个请求到堆栈顶部def pop(self, timeout0):Pop a requestif timeout 0:data self.server.blpop(self.key, timeout)if isinstance(data, tuple):data data[1]else:data self.server.lpop(self.key)if data:return self._decode_request(data) # 从堆栈顶部弹出一个请求并返回# TODO: Deprecate the use of these names. SpiderQueue FifoQueue SpiderStack LifoQueue SpiderPriorityQueue PriorityQueue讲解: 在Scrapy Redis队列中包含了三个自定义队列类分别是FifoQueue、PriorityQueue和LifoQueue。 FifoQueue实现了单个爬虫的先进先出队列使用Redis的列表list数据结构来存储请求。PriorityQueue实现了单个爬虫的优先级队列使用Redis的有序集合sorted set数据结构来存储请求并按照请求的优先级进行排序。LifoQueue实现了单个爬虫的后进先出队列同样使用Redis的列表list数据结构来存储请求。 使用这些自定义队列类时首先需要根据自己的需求选择合适的队列类型。然后使用相应的类来实例化队列并可以通过调用其方法来实现数据的推送和获取如push方法用于推送请求pop方法用于弹出请求。 例如以下是使用FifoQueue的示例代码 from scrapy_redis.queue import SpiderQueueclass MySpider(scrapy.Spider):# ...custom_queue_key my_spider:fifo_queuedef __init__(self, nameNone, **kwargs):super().__init__(namename, **kwargs)self.queue SpiderQueue(self.server, self, self.custom_queue_key)def start_requests(self):# 推送请求到FifoQueueself.queue.push(scrapy.Request(urlhttp://example.com/page1))self.queue.push(scrapy.Request(urlhttp://example.com/page2))self.queue.push(scrapy.Request(urlhttp://example.com/page3))# 从FifoQueue中获取请求并通过yield返回while True:request self.queue.pop()if not request:breakyield request通过实例化自定义队列类例如SpiderQueue将其与爬虫关联。然后使用push方法将请求推送到队列中使用pop方法从队列中获取请求。 请根据实际需求选择适合的自定义队列类并实现相应的处理逻辑. 代码总结: 一个基类 (Base)定义了每个爬虫的 Redis 队列的基本行为。此基类用于派生子类实现不同类型的队列比如: 先进先出队列 (FifoQueue)、优先级队列 (PriorityQueue)、后进先出队列 (LifoQueue)。 每个子类继承 Base 类并根据不同的类型实现相应的方法包括 _encode_request 将请求对象编码成字符串_decode_request 将编码的请求字符串解码成请求对象__len__ 返回队列的长度push 将请求对象放入队列pop 从队列中取出一个请求。此外clear 方法用于清空队列。 在每个子类中队列的实现会根据具体的数据结构进行。在 FifoQueue 中使用列表实现先进先出队列PriorityQueue 使用 Redis 的有序集合实现优先级队列LifoQueue 使用列表实现后进先出队列。 这个队列用于将爬虫的请求放入队列中然后通过 Redis 进行存储和取出确保请求的顺序和优先级。 如何用: #setting里面设置这个,即可开启 SCHEDULER_QUEUE_CLASS scrapy_redis.queue.PriorityQueue 自定义queue: 假设我们需要根据请求的优先级进行存储和处理。 from scrapy_redis.queue import Baseclass PriorityQueue(Base):自定义优先级队列def __len__(self):return self.server.zcard(self.key)def push(self, request, priority0):按照优先级推送请求data self._encode_request(request)score -priority # 取负数以便按优先级降序排序self.server.zadd(self.key, {data: score})def pop(self):按照优先级弹出请求data self.server.zrange(self.key, 0, 0)if data:self.server.zrem(self.key, data[0])return self._decode_request(data[0])# 在Spider中使用自定义队列 class MySpider(scrapy.Spider):# ...custom_queue_key my_spider:priority_queuedef start_requests(self):# 创建自定义优先级队列queue PriorityQueue(self.server, self, self.custom_queue_key)# 推送请求到自定义队列queue.push(scrapy.Request(urlhttp://example.com/page1), priority2)queue.push(scrapy.Request(urlhttp://example.com/page2), priority1)queue.push(scrapy.Request(urlhttp://example.com/page3), priority3)# 从自定义队列中获取请求while True:request queue.pop()if not request:breakyield request讲解: 创建了一个名为PriorityQueue的自定义优先级队列类。该类继承了Base类根据优先级对请求进行存储和处理。通过重写push方法将请求按照指定的优先级进行推送通过重写pop方法按照优先级从队列中弹出请求。在Spider中使用自定义队列时先实例化PriorityQueue类然后推送请求到队列中并通过pop方法从队列中获取请求。读者可以根据自己的需求定义更多自定义队列类并根据不同的存储和处理逻辑进行扩展。 ps:记得在setting里面,导入这个类: 要将自定义队列类用于Scrapy的配置settings中需要在项目的settings.py文件中进行相应的设置。确保以下步骤 1.在settings.py文件中导入自定义队列类 from your_project.queue_file import PriorityQueue # 根据实际情况进行导入2.设置SCHEDULER属性为自定义的队列类 SCHEDULER scrapy_redis.scheduler.Scheduler3.设置SCHEDULER_QUEUE_CLASS属性为自定义队列类的路径 SCHEDULER_QUEUE_CLASS your_project.queue_file.PriorityQueue # 根据实际情况设置路径这样Scrapy将使用自定义队列类作为请求队列。确保将your_project替换为项目名称并根据项目结构和文件位置进行正确的设置。
http://www.zqtcl.cn/news/137880/

相关文章:

  • 郑州看妇科最好的医院是哪里南宁百度seo软件
  • 深圳市住房与建设局实名制网站手机网站打不开被拦截怎么办
  • 公司做网站的价格几千元wordpress 修改页脚
  • 专业网站建设公司在线咨询宁波网站推广公司价格
  • 网站搭建系统都有哪些丽水网站开发
  • 网站设计包含哪些技术外行怎么做网站
  • 网站建设运营知识推广软文平台
  • 营销型网站建设用途网站 文件夹结构
  • 制作网站建设策划方案cosy主题wordpress
  • 网站建设服务联享科技net和cn哪个做网站好
  • 深圳网站制作公司哪家好艺考培训学校
  • 潍坊网站的公司电话html网站开发基础
  • 网站模板样式做地图特效的网站
  • 商标查询官方网站有没有免费找客户的软件
  • 网站开发及服务合同行业网站名称
  • 网站建设费包括什么建筑设计领域
  • 网站建设 信科网络建行网站会员注册用户名
  • 网站建设的什么是开发实施注意什么网站开发实用技术pdf
  • 网站设计的资质叫什么贵阳网站建设咨询
  • 郑州哪家公司做网站怎么做自己的销售网站
  • 北大青鸟教网站开发吗中国电信 网站备案
  • 网站目录结构图wordpress ftp连接不上
  • 使用php做的网站有哪些网站备案密码重置申请表
  • php网站开发好找工作吗一叶子电子商务网站建设策划书
  • 运营好还是网站开发好购买域名后怎样建公司官网
  • 优秀设计网站推荐晋江市住房和城乡建设局网站
  • 杭州市区网站制作单位青海公路建设服务网站
  • 大型门户网站建设美丽杭州房价
  • 素材下载解析接口网站开发网站关键词热度
  • 山东seo推广网站建设新乡手机网站建设官网