pyspider 소스 분석

3274 단어

pyspider 코드 구조


주로 아래의 몇 개 모듈에서pyspider 원본 코드를 본다
  • libs의 도구 클래스입니다.예를 들어 가장 자주 사용하는 베이스handler 등등.
  • process,scheduler,resultdb.그중 가장 보기 쉬운 것은resultdb
  • 입니다.
  • 웹ui 부분, 웹에서 데이터베이스 스크립트를 어떻게 호출하는지 등
  • debug의 기교


    pyspider는run에 있습니다.py가 여러 개의 라인을 시작했는데 여러 개의 라인의 debug는 사실 매우 번거롭다. 우리는 이전 항목의 코드 구조에 따라 하나하나 보아야 한다.
    예를 들어 가장 간단한resultdb 모듈은 하나의resultworker.py파일, 이 파일을 알아보면 사실 이 모듈을 알아볼 수 있습니다.
    class ResultWorker(object):
    
        """
        do with result
        override this if needed.
        """
    
        def __init__(self, resultdb, inqueue):
            self.resultdb = resultdb
            self.inqueue = inqueue
            self._quit = False
    
        def on_result(self, task, result):
            '''Called every result'''
            if not result:
                return
            if 'taskid' in task and 'project' in task and 'url' in task:
                logger.info('result %s:%s %s -> %.30r' % (
                    task['project'], task['taskid'], task['url'], result))
                return self.resultdb.save(
                    project=task['project'],
                    taskid=task['taskid'],
                    url=task['url'],
                    result=result
                )
            else:
                logger.warning('result UNKNOW -> %.30r' % result)
                return
    
        def quit(self):
            self._quit = True
    
        def run(self):
            '''Run loop'''
            logger.info("result_worker starting...")
    
            while not self._quit:
                try:
                    task, result = self.inqueue.get(timeout=1)
                    self.on_result(task, result)
                except Queue.Empty as e:
                    continue
                except KeyboardInterrupt:
                    break
                except AssertionError as e:
                    logger.error(e)
                    continue
                except Exception as e:
                    logger.exception(e)
                    continue
    
            logger.info("result_worker exiting...")
    
    
    class OneResultWorker(ResultWorker):
        '''Result Worker for one mode, write results to stdout'''
        def on_result(self, task, result):
            '''Called every result'''
            if not result:
                return
            if 'taskid' in task and 'project' in task and 'url' in task:
                logger.info('result %s:%s %s -> %.30r' % (
                    task['project'], task['taskid'], task['url'], result))
                print(json.dumps({
                    'taskid': task['taskid'],
                    'project': task['project'],
                    'url': task['url'],
                    'result': result,
                    'updatetime': time.time()
                }))
            else:
                logger.warning('result UNKNOW -> %.30r' % result)
                return
    

    ResultWorker는 볼 필요가 없습니다. 기능상 이 모듈은 위에서 이루어진 것과 같은 기능으로 단독으로 시작할 때 호출되는 코드입니다.같은 이치로 많은 원 시작 코드가 스쳐 지나갈 수 있다.
    pyspider의 각 모듈의 데이터는 대기열을 통해 얻을 수 있습니다.

    카탈로그

  • pyspider 소스 코드resultdb
  • 좋은 웹페이지 즐겨찾기