[PYTHON] 4. Web Crawler (3)

Fly High!·2020년 9월 2일
0

Python

목록 보기
4/7
post-thumbnail

목표

  1. 특정 사이트, 특정 글 스크랩
  2. 스크랩한 자료 DB에 저장
  3. 매주 추가되는 당첨번호 자동으로 스크랩하기

3. 매주 추가되는 당첨번호 자동으로 스크랩하기

1) sleep module

from time import sleep

def periodic_insert(self):
    while True:
        self.single_num()
        sleep(self.sec)
        self.page += 1
# 주기적으로 업데이트되는 정보를 가져오기 위해 해당 주기만큼의 시간을 설정
# 무한 루프문을 사용하여 지속적으로 업로드가 가능함
# 로컬을 끄게 되면 작동이 멈추기 때문에 외부 서버 사용이 요구됨

2) Code

from bs4 import BeautifulSoup
import requests
import pymysql
from time import sleep

# DB connection
db = pymysql.connect(host     = 'localhost',
                     user     = 'root',
                     password = '950912',
                     db       = 'lotto')

# complete message
msg = 'Insert completed'

class Lotto:
    def __init__(self, page, max_pages, sec):
        self.page = page
        self.max_pages = max_pages
        self.sec = sec

    def periodic_insert(self): # sleep모듈을 사용해 설정한 시간만큼 자동으로 크롤
        while True:
            self.single_num()
            sleep(self.sec) # 설정한 시간만큼 기다림
            self.page += 1 # 다음 주기의 늘어난 html로 변경
            
    def single_num(self): # 1회차만 입력
        url = 'https://dhlottery.co.kr/gameResult.do?method=byWin&drwNo=' + \
            str(self.page)
        req = requests.get(url)
        html = req.text
        bsObject = BeautifulSoup(html, "html.parser")
        arr = list()
        arr.append(self.page)
        for numbers in bsObject.select('div > div > div > div > p > span'):
            number = int(numbers.string)
            arr.append(number)
        return self.insert_num(arr)

    def get_whole_num(self): # 원하는 구간의 회차 입력
        while self.page < self.max_pages:
            url = 'https://dhlottery.co.kr/gameResult.do?method=byWin&drwNo=' + \
                str(self.page)
            req = requests.get(url)
            html = req.text
            bsObject = BeautifulSoup(html, "html.parser")
            arr = list()
            arr.append(self.page) # 회차의 정보 입력
            for numbers in bsObject.select('div > div > div > div > p > span'):
                number = int(numbers.string)
                arr.append(number)
            self.insert_num(arr)
            self.page += 1

    def insert_num(self, arr):
        curs = db.cursor()
        sql = "INSERT INTO lotto_numbers(lotto, num_1, num_2, num_3, num_4, num_5, num_6, num_bonus) VALUES (%s ,%s, %s, %s, %s, %s, %s, %s)"
        curs.execute(sql, arr)
        db.commit()
        return msg
        db.close()
profile
Back-end, Python, Data

0개의 댓글