안녕하세요. 언제나휴일입니다.
이번에는 수집해야 할 웹 페이지 주소를 관리하는 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