Python 은 Redis 로 분포 식 파충 류 를 간단하게 실현 하 는 방법

Redis 는 보통 지속 적 인 메모리 키워드-값 형 저장 으로 여 겨 져 몇 대의 컴퓨터 간 데이터 공유 플랫폼 에 사용 할 수 있다.
데이터베이스 연결
주의:현재 같은 랜 에 있 는 몇 대의 기계 가 각각 Master 와 몇 개의 Slaver 라 고 가정 합 니 다.
Master 연결 시 host 는 localhost 즉 이 컴퓨터 의 ip 입 니 다.

_db = redis.Reds(host='localhost', port=6379, db=0)
Slaver 연결 시의 host 도 Master 의 ip 이 고 포트 port 와 데이터베이스 db 를 쓰 지 않 을 때 기본 값 6379,0 입 니 다.

_db = redis.Redis(host='192.168.235.80')
Redis 는 목록,집합,문자열 등 몇 가지 데이터 구 조 를 포함 하고 구체 적 으로 몇 가지 데이터 구조의 조작 명령 은 Redis 홈 페이지http://redis.io/commands를 볼 수 있 습 니 다.다음은 집합 을 조작 하 는 명령 입 니 다.

_db.sadd(key, *values) #     values                
_db.spop(self.key) #                              
_db.smembers(self.key) #          
_db.delete(key) #       ,     1,     0
_db.srandmember(self.key) #                 
_db.sismember(self.key, value) #     value       ,    1,    0
예 를 들 어 Master 는 redis 를 이용 하여 url 을 데이터베이스 에 업로드 할 수 있다.

for i in range(20): #           20  url   urls  
  url = 'http://www.qiushibaike.com/hot/page/%d/' % (i + 1)
  _db.sadd('urls', url) #  url     urls   , url        
더 나 아가 Master 와 Slaver 는 데이터베이스 에서 url 을 가 져 올 수 있 습 니 다.

url = _db.spop('urls') #    urls       url       
마찬가지 로 Master 는 위의 방법 을 이용 하여 다른 공용 자원 을 데이터베이스 에 업로드 할 수 있 고 Slaver 는 데이터베이스 에서 필요 한 것 을 다운로드 할 수 있 습 니 다.다음은 완전한 예 이다.

# coding=utf-8
import urllib2
import re
import time
import redis

headers = {'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Ubuntu Chromium/49.0.2623.108 Chrome/49.0.2623.108 Safari/537.36'}
job_redis = redis.Redis(host='192.168.235.80') # host    IP,port db    


class Clawer(object):

  identity = 'master' #  slaver

  def __init__(self):
    if self.identity == 'master':
      for i in range(20): #           20  url   urls  
        url = 'http://www.qiushibaike.com/hot/page/%d/' % (i + 1)
        job_redis.sadd('urls', url)
    self.main()

  def get_content(self):
    """
              
    :return:     
    """
    stories = []
    content_pattern = re.compile('<div class="content">([\w\W]*?)</div>([\w\W]*?)class="stats"') #       (   )       (   )   
    pattern = re.compile('<.*?>') #                  
    url = job_redis.spop('urls')
    while url: #          url,       
      try:
        request = urllib2.Request(url, headers=headers)
        response = urllib2.urlopen(request)
        text = response.read()
      except urllib2.URLError, e: #               
        if hasattr(e, "reason"):
          print e.reason
      content = re.findall(content_pattern, text) #           
      for x in content:
        if "img" not in x[1]: #         
          x = re.sub(pattern, '', x[0])
          x = re.sub('
', '', x) stories.append(x) url = job_redis.spop('urls') time.sleep(3) return stories def main(self): self.get_content() if __name__ == '__main__': Clawer()
이 코드 를 몇 대의 기계 에서 동시에 실행 하여 master 또는 slaver 로 신분 을 조절 하여 간단 한 분포 식 파충류 가 되도록 합 니 다.
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기