华南俳烁实业有限公司

python

當前位置:中華考試網 >> python >> python爬蟲 >> 文章內容

python分布式進程爬蟲如何模擬?

來源:中華考試網  [2020年11月28日]  【

  就比如我們需要抓取某個圖片網站的所有圖片,如果用我們的分布式進程的思想,我們會創(chuàng)建一個進程負責抓取圖片的鏈接地址,然后將這些鏈接地址存放到Queue中,另外的進程負責從Queue中讀取鏈接進行圖片的下載或者進行其他操作(存在本地)

  其實我們的Queue是暴露在網絡中的,通過分布式就是將其進行了封裝,其實也就是所謂的本地隊列的網絡化。

  接下來,我們來分析一下如何去創(chuàng)建一個分布式的服務進程,總體可以分為六步:

  1、首先我們需要建立一個隊列queue,這個主要用作進程之間的通信。總體來說就是兩種進程,一種是服務進程,一種是任務進程。服務進程創(chuàng)建任務隊列task_queue,用作傳遞任務給任務進程的通道。服務進程又創(chuàng)建result_queue,作為任務進程完成任務后回復服務進程的通道。在分布式進程的環(huán)境下,我們需要通過Queuemanager 獲得的Queue接口來添加任務。

  2、把我們在第 一步中隊列在網絡上進行注冊,暴露給其他的進程或者主機,注冊后獲得網絡隊列,相當于本地隊列的映像。

  3、建立Queuemanager的對象,并且實例化,綁定端口和口令

  4、啟動第三步中建立的實例,即啟動管理manager,監(jiān)管信息通道

  5、通過管理實例的方法獲取到通過網絡訪問的queue對象,也就是把網絡對象實體化成本地的一個隊列。

  6、創(chuàng)建任務到“本地”隊列中,自動上傳任務到網絡隊列中,分配給任務進程進行處理。

  我們來寫一下服務進程的代碼 taskManager.py:

  import queue

  from multiprocessing.managers import BaseManager

  from multiprocessing import freeze_support

  # 任務個數

  task_num = 500

  # 定義收發(fā)隊列

  task_queue = queue.Queue(task_num)

  result_queue = queue.Queue(task_num)

  def get_task():

  return task_queue

  def get_result():

  return result_queue

  # 創(chuàng)建類似的QueueManager

  class QueueManager(BaseManager):

python課程免費試聽預約

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

  pass

  def run():

  # Windows下綁定調用接口不能使用lambda,所以只能先定義函數再綁定

  QueueManager.register('get_task_queue', callable = get_task)

  QueueManager.register('get_result_queue', callable=get_result)

  #綁定端口并設置驗證口令,windows下需要填寫ip地址,Linux中不填默認為本地

  manager = QueueManager(address=('127.0.0.1', 8001), authkey='jap'.encode('utf-8'))

  # 啟動

  manager.start()

  try:

  # 通過網絡獲取任務隊列和結果隊列

  task = manager.get_task_queue()

  result = manager.get_result_queue()

  # 添加任務

  for url in ["JAP君url:"+str(i) for i in range(500)]:

  print("添加任務 %s" %url)

  task.put(url)

  print("正在獲取結果...")

  for i in range(500):

  print("result is %s" %result.get(timeout=10))

  except:

  print('Manager error')

  finally:

  # 一定要關閉,否則會報管道未關閉的錯

  manager.shutdown()

  if __name__ == '__main__':

  # windows下多進程可能會出現問題,添加這句話可以解決

  freeze_support()

  run()

  看到這里相信多多少少對分布式進程爬蟲也有了一些新的理解和感悟,本篇文章主要是針對于大家思路的打開,寫代碼只是驗證思路的一個實驗~

責編:fushihao

上一篇:celery如何在python爬蟲中進行定時操作?

下一篇: 沒有了

  • 會計考試
  • 建筑工程
  • 職業(yè)資格
  • 醫(yī)藥考試
  • 外語考試
  • 學歷考試
临高县| 墨脱县| 涪陵区| 靖边县| 普宁市| 昌都县| 临桂县| 石台县| 巴楚县| 左贡县| 长春市| 中超| 寿宁县| 通化市| 谷城县| 怀柔区| 七台河市| 昌都县| 元氏县| 瑞安市| 饶河县| 百色市| 叙永县| 威宁| 峨眉山市| 临夏市| 文山县| 凌云县| 松阳县| 木兰县| 内丘县| 综艺| 温州市| 乌拉特后旗| 郴州市| 广德县| 丰原市| 东源县| 安宁市| 喀什市| 甘肃省|