빅데이터/빅데이터 with python

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

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

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

 

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

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

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

 

이번에는 수집한 웹 페이지를 데이터베이스와 연동하는 클래스를 정의합시다.

1. SqlCon 클래스 정의

SqlCon 클래스는 Database에 연결을 담당하는 클래스입니다.

DBMS는 MSSQL이며 로컬 호스트("127.0.0.1")에 1433 포트로 tcp 서비스를 제공하고 있습니다.

계정은 "sa", 비밀번호는 "1234", 데이터베이스는 "WebSearchEngine"입니다.

이 부분은 여러분의 환경에 맞게 수정하세요.

제공하는 메서드는 커서, 닫기, 커밋입니다. 별다른 내용이 없어서 설명은 생략할게요.

#SqlCon.py
import pymssql
class SqlCon:
    conn = pymssql.connect("127.0.0.1:1433", "sa","1234","WebSearchEngine")
    @staticmethod
    def Cursor():
        return SqlCon.conn.cursor()
    @staticmethod
    def Close():
        SqlCon.conn.close()
    @staticmethod
    def Commit():
        SqlCon.conn.commit()

2. 사용할 라이브러리

DBMS에 연결하기 위해 앞에서 만든 SqlCon 클래스를 사용할 거예요.

그리고 수집한 웹 페이지를 프로그램에서 표현할 WebPage 클래스도 사용합니다.

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

from SqlCon import SqlCon
from WebPage import WebPage 
import pymssql

3. AddPage - 테이블에 수집한 웹 페이지 추가

페이지를 수집하면 WebPae 테이블에 추가하는 AddPage 메서드를 구현합시다.

insert 쿼리문을 만들 때 values 항목에서 문자열은 단일 따옴표로 감싸주어야 합니다.

class WebPageSql:
    @staticmethod
    def AddPage(wpage):
        cursor = SqlCon.Cursor()
        try:
            query = str.format("insert into WebPage (title,url, description,mcnt) values('{0}','{1}','{2}',{3})",  wpage.title, wpage.url, wpage.description,wpage.mcnt)
            cursor.execute(query)
            SqlCon.Commit()
        except:
            return False
        else:
            return True

4. UpdateMCnt - 페이지 내 포함 단어 항목 갱신

웹 수집 로봇을 만들고 난 후에는 웹 검색 서비스에 필요한 작업들을 추가할 것입니다. 이 때 웹 페이지에 포함하는 단어를 분석하는 작업도 진행합니다. 수집한 웹 페이지에 포함한 단어 개수를 갱신하는 UpdateMCnt 메서드를 구현합시다.

    @staticmethod
    def UpdateMCnt(url,mcnt):
        cursor = SqlCon.Cursor() 
        query = str.format("update WebPage set mcnt={0} where (url='{1}')",mcnt,url)
        cursor.execute(query)
        SqlCon.Commit()

5. FindWid - 웹 페이지 주소로 일련 번호 구하기

수집한 웹 페이지는 자동으로 증가하는 일련 번호를 주요 키로 설정하였습니다.

웹 페이지 주소도 Unique한 값으로 설정하고 있습니다.

웹 페이지 주소를 알고 있을 때 일련 번호를 구하는 메서드 FindWid를 구현합시다.

    def FindWid(url):
        cursor = SqlCon.Cursor()      
        query = str.format("select wid from WebPage where (url='{0}')",url)
        cursor.execute(query)
        row = cursor.fetchone()
        if row:
            return row[0]
        return 0

6. FindPageByWid - 일련 번호로 웹 페이지 찾기

일련 번호로 수집한 웹 페이지 정보를 검색하는 기능도 구현합시다.

    def FindPageByWid(wid):
        cursor = SqlCon.Cursor()    
        query = str.format("select title,url,description,mcnt from WebPage where (wid={0})",wid)
        cursor.execute(query)
        row = cursor.fetchone()
        return row

7. TotalDocumentCount - 수집한 전체 문서 개수 구하기

검색 순위를 부여할 때 특정 단어를 포함하는 문서 수와 전체 문서 수를 비교할 수 있습니다. 이를 위해 전체 문서 개수를 반환하는 메서드를 구현합시다.

    @staticmethod
    def TotalDocumentCount():
        cursor = SqlCon.Cursor()   
        query = "select count(*) from WebPage"
        cursor.execute(query)
        row = cursor.fetchone()
        return row[0]

 8. 전체 코드

#WebPageSql.py
from SqlCon import SqlCon
from WebPage import WebPage 
import pymssql
class WebPageSql:
    @staticmethod
    def AddPage(wpage):
        cursor = SqlCon.Cursor()
        try:
            query = str.format("insert into WebPage (title,url, description,mcnt) values('{0}','{1}','{2}',{3})",  wpage.title, wpage.url, wpage.description,wpage.mcnt)
            cursor.execute(query)
            SqlCon.Commit()
        except:
            return False
        else:
            return True
    @staticmethod
    def UpdateMCnt(url,mcnt):
        cursor = SqlCon.Cursor() 
        query = str.format("update WebPage set mcnt={0} where (url='{1}')",mcnt,url)
        cursor.execute(query)
        SqlCon.Commit()
    @staticmethod
    def FindWid(url):
        cursor = SqlCon.Cursor()      
        query = str.format("select wid from WebPage where (url='{0}')",url)
        cursor.execute(query)
        row = cursor.fetchone()
        if row:
            return row[0]
        return 0
    @staticmethod
    def FindPageByWid(wid):
        cursor = SqlCon.Cursor()    
        query = str.format("select title,url,description,mcnt from WebPage where (wid={0})",wid)
        cursor.execute(query)
        row = cursor.fetchone()
        return row
    @staticmethod
    def TotalDocumentCount():
        cursor = SqlCon.Cursor()   
        query = "select count(*) from WebPage"
        cursor.execute(query)
        row = cursor.fetchone()
        return row[0]
반응형