빅데이터/빅데이터 with python

[빅데이터 python] 웹 수집 로봇 만들기 - 5. CandidateSql 클래스 정의

언제나휴일 2020. 11. 16. 14:56
반응형

안녕하세요. 언제나휴일입니다.

 

2020/11/16 - [빅데이터/빅데이터 with python] - [빅데이터 python] 웹 수집 로봇 만들기 - 1. 테이블 정의

2020/11/16 - [빅데이터/빅데이터 with python] - [빅데이터 python] 웹 수집 로봇 만들기 - 2. EHHelper 클래스 정의

2020/11/16 - [빅데이터/빅데이터 with python] - [빅데이터 python] 웹 수집 로봇 만들기 - 3. WebPage 클래스 정의

2020/11/16 - [빅데이터/빅데이터 with python] - [빅데이터 python] 웹 수집 로봇 만들기 - 4. WebPageSql 클래스 정의

 

이번에는 수집해야 할 웹 페이지 주소를 관리하는 Candidate테이블과 연동하는 클래스를 정의합시다.

1. 포함해야 할 라이브러리

파이썬과 MSSQL을 연동하기 위해 pymssql을 사용합니다.

데이터베이스와 연결을 담당하기 위해 작성한 SqlCon 클래스를 사용합니다.

수집한 웹 페이지는 수집 대상이 될 수 없습니다. 이를 위해 수집한 웹 페이지와 연동하는 WebPageSql을 사용합니다.

import pymssql
from SqlCon import SqlCon
from WebPageSql import WebPageSql

2. AddCandidate - 수집 후보 추가

이미 수집한 웹 페이지에 있는 주소인지 확인합니다.

이미 있다면 수집 후보가 될 수 없습니다.

그렇지 않다면 Candidate에 추가합니다.

class CandidateSql:    
    @staticmethod
    def AddCandidate(url,depth):
        cursor = SqlCon.Cursor()
        if WebPageSql.FindWid(url)!=0:
            return False
        query = str.format("Insert into Candidate(url,depth) values('{0}',{1})",url,depth)
        try:
            cursor.execute(query)
            SqlCon.Commit()
            return True
        except:
            return False

2. GetCandidateID - 수집 후보 웹 페이지 주소 구하기

Candidate 테이블에서 일련 번호가 제일 작은 값을 반환합니다.

SQL에서 최소값을 찾을 때 MIN함수를 사용합니다.

    @staticmethod
    def GetCandidateID():
        cursor = SqlCon.Cursor()
        query = str.format("select MIN(id) from Candidate")
        cursor.execute(query)
        row = cursor.fetchone()
        if row:
            return row[0]
        else:
            return 0

3. Remove - 수집 후보 삭제

웹 수집 로봇에서 수집 후보 주소를 얻어가면 다시 수집하지 않기 위해 테이블에서 삭제를 합니다.

    @staticmethod
    def Remove(id):
        cursor = SqlCon.Cursor()
        query = str.format("delete from Candidate where id={0}",id)
        cursor.execute(query)
        SqlCon.Commit()

4. GetCandidate - 수집 후보 웹 페이지 구하기(수집 후보 삭제 포함)

Candidate 테이블에서 수집 후보 웹 페이지를 구하고 삭제하는 작업을 진행하는 메서드를 구현합시다.

앞에서 작성한 GetCandidateID 메서드를 호출합니다.

정상적으로 얻어왔다면(None도 아니고 0도 아님) 웹 페이지 주소(url)과 상대적 깊이(depth)를 구합니다.

검색이 성공하면 Candidate 테이블에서는 삭제합니다.

    @staticmethod
    def GetCandidate():
        id = CandidateSql.GetCandidateID()
        if id==None or id==0:
            return "" ,-1     
        cursor = SqlCon.Cursor()
        query = str.format("select url,depth from Candidate where id={0}",id)
        cursor.execute(query)
        row = cursor.fetchone()
        if row:
            CandidateSql.Remove(id)
            return row[0],row[1]
        else:
            return "",-1

5. 전체 코드

#CandidateSql.py
import pymssql
from SqlCon import SqlCon
from WebPageSql import WebPageSql
class CandidateSql:    
    @staticmethod
    def AddCandidate(url,depth):
        cursor = SqlCon.Cursor()
        if WebPageSql.FindWid(url)!=0:
            return False
        query = str.format("Insert into Candidate(url,depth) values('{0}',{1})",url,depth)
        try:
            cursor.execute(query)
            SqlCon.Commit()
            return True
        except:
            return False
    @staticmethod
    def GetCandidate():
        id = CandidateSql.GetCandidateID()
        if id==None or id==0:
            return "" ,-1     
        cursor = SqlCon.Cursor()
        query = str.format("select url,depth from Candidate where id={0}",id)
        cursor.execute(query)
        row = cursor.fetchone()
        if row:
            CandidateSql.Remove(id)
            return row[0],row[1]
        else:
            return "",-1
    @staticmethod
    def Remove(id):
        cursor = SqlCon.Cursor()
        query = str.format("delete from Candidate where id={0}",id)
        cursor.execute(query)
        SqlCon.Commit()

    @staticmethod
    def GetCandidateID():
        cursor = SqlCon.Cursor()
        query = str.format("select MIN(id) from Candidate")
        cursor.execute(query)
        row = cursor.fetchone()
        if row:
            return row[0]
        else:
            return 0
반응형