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

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

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

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

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

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

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

#Candidate(수집대상)Sql 클래스 만들기
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함수를 사용합니다.

    def GetCandateID():
        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 GetCandite():
        id = CandidateSql.GetCandateID()
        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. 전체 코드

#Candidate(수집대상)Sql 클래스 만들기
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 GetCandateID():
        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
    @staticmethod
    def Remove(id):
        cursor = SqlCon.Cursor()
        query = str.format("delete from Candidate where id={0}",id)
        cursor.execute(query)
        SqlCon.Commit()
    @staticmethod
    def GetCandite():
        id = CandidateSql.GetCandateID()
        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