Python 은 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 로 신분 을 조절 하여 간단 한 분포 식 파충류 가 되도록 합 니 다.이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
로마 숫자를 정수로 또는 그 반대로 변환그 중 하나는 로마 숫자를 정수로 변환하는 함수를 만드는 것이었고 두 번째는 그 반대를 수행하는 함수를 만드는 것이었습니다. 문자만 포함합니다'I', 'V', 'X', 'L', 'C', 'D', 'M' ; 문자열이 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.