华南俳烁实业有限公司

python

當(dāng)前位置:中華考試網(wǎng) >> python >> python爬蟲(chóng) >> 文章內(nèi)容

RabbitMQ如何在python分布式爬蟲(chóng)中構(gòu)建?

來(lái)源:中華考試網(wǎng)  [2020年11月26日]  【

  基于這種確認(rèn)機(jī)制,可以在高可靠性和高數(shù)據(jù)要求情景中,避免數(shù)據(jù)抓取的遺漏和丟失。

  其設(shè)計(jì)思路應(yīng)該是基于mq設(shè)計(jì)兩個(gè)接口,一個(gè)用于URL的存放,一個(gè)用戶URL的獲取,同時(shí)基于Redis的URL去重,通過(guò)類似scrapy-redis 的調(diào)度使爬蟲(chóng)運(yùn)行。

  主程序示例:

  import pika

  class RabbitMQBASE:

  def __new__(cls, *args, **kw):

  if not hasattr(cls, '_instance'):

  org = super(RabbitMQBASE, cls)

  cls._instance = org.__new__(cls)

  return cls._instance

  def __init__(self, use='root', pwd='111'):

  user_pwd = pika.PlainCredentials(use, pwd)

  self.s_conn = pika.BlockingConnection(

  pika.ConnectionParameters(host='1.1.1.1', heartbeat_interval=3600, credentials=user_pwd))

  def channel(self):

  return self.s_conn.channel()

  def close(self):

  """關(guān)閉連接"""

  self.s_conn.close()

  @staticmethod

  def callback(ch, method, properties, body):

  print(" [消費(fèi)者] %r" % body)

  class RabbitMQ(RabbitMQBASE):

  """

  type_:交換機(jī)類型fanout、direct、topic

python課程免費(fèi)試聽(tīng)預(yù)約

  • 地區(qū):
  • 姓名:
  • 手機(jī):

  exchange:交換機(jī)名字

  queue_name:隊(duì)列名字,為空則隨機(jī)命名

  exclusive:隊(duì)列是否持久化False持久,True不持久

  key_list:消費(fèi)者的交換機(jī)、隊(duì)列綁定的關(guān)鍵詞列表

  key:生產(chǎn)者路由的關(guān)鍵詞

  no_ack:是否確認(rèn)消息True不確定,False確定

  """

  def __init__(self, use='root', pwd='Kw7pGR4xDD1CsP*U', type_='direct', exchange='test',

  queue_name=None, exclusive=True, key_list=['test'], key='test', no_ack=True):

  RabbitMQBASE.__init__(self, use=use, pwd=pwd)

  self.type_ = type_

  self.exchange = exchange

  self.queue_name = queue_name

  self.exclusive = exclusive

  self.key = key

  self.key_list = key_list

  self.no_ack = no_ack

  def rabbit_get(self):

  """消費(fèi)者"""

  channel = self.channel()

  channel.exchange_declare(exchange=self.exchange, exchange_type=self.type_)

  if self.queue_name == None:

  result = channel.queue_declare(exclusive=self.exclusive)

  self.queue_name = result.method.queue

  if self.type_ != 'fanout':

  for key in self.key_list:

  channel.queue_bind(exchange=self.exchange, # 將交換機(jī)、隊(duì)列、關(guān)鍵字綁定

  queue=self.queue_name, routing_key=key)

  channel.basic_consume(RabbitMQBASE.callback, queue=self.queue_name, no_ack=self.no_ack)

  channel.start_consuming()

  def rabbit_put(self, message='hello word'):

  """生產(chǎn)者"""

  channel = self.channel()

  channel.exchange_declare(exchange=self.exchange, exchange_type=self.type_)

  if self.type_ == 'fanout':

  self.key = ""

  channel.basic_publish(exchange=self.exchange, routing_key=self.key, body=message)

  channel.close()

  小伙伴們可以嘗試著運(yùn)行上面的代碼,雖然我們不一定能全部弄明白其中的原理,但是我們需要進(jìn)行RabbitMQ基礎(chǔ)的搭建操作。

責(zé)編:fushihao

上一篇:python爬蟲(chóng)如何配置requests日志輸出?

下一篇: 沒(méi)有了

  • 會(huì)計(jì)考試
  • 建筑工程
  • 職業(yè)資格
  • 醫(yī)藥考試
  • 外語(yǔ)考試
  • 學(xué)歷考試
山东省| 大同市| 竹山县| 建瓯市| 延安市| 哈尔滨市| 富源县| 泗洪县| 郸城县| 滨海县| 东城区| 吴旗县| 泽普县| 公安县| 楚雄市| 齐齐哈尔市| 济南市| 新津县| 永胜县| 乡城县| 英山县| 海南省| 南丹县| 宁安市| 健康| 饶平县| 水城县| 池州市| 靖宇县| 红原县| 息烽县| 托里县| 平利县| 崇阳县| 庐江县| 灌南县| 镇赉县| 沭阳县| 孝昌县| 微山县| 修水县|