Jeonhui {ios}

Baekjoon Projects - 3. test Sample Inputs [웹 크롤링] 본문

projects

Baekjoon Projects - 3. test Sample Inputs [웹 크롤링]

jeonhui 2022. 2. 23. 18:42

안녕하세요 Jeonhui입니다.

이번 시간에는 웹크롤링을 이용한 baekjoon 예제들을 테스트하는 프로그램을 설명드리겠습니다.

 

이 프로그램은 이전 글의 프로그램을 활용한 프로그램이기 때문에 참고하시기 바랍니다.

2022.02.23 - [projects] - Baekjoon Projects - 2. get Problem [웹 크롤링]

 

Baekjoon Projects - 2. get Problem [웹 크롤링]

안녕하세요 Jeonhui입니다. 이번 시간에는 웹크롤링을 이용한 baekjoon 문제 불러오는 프로그램을 설명드리겠습니다. 이전 프로젝트를 보고 싶은 분들은 이전 글을 확인해주세요. 2022.02.21 - [projects]

jeonhui.tistory.com

 

이전 글에서는 백준 문제들을 불러오는 프로그램을 작성하였습니다. 이를 이용해 test()함수를 작성해보았습니다.

def test():

sample_input_list = []
sample_output_list = []

for i in range(1, 20):
    try:
        sample_input_list.append(soup.find('pre', {'id': 'sample-input-' + str(i)}).text.strip())
        sample_output_list.append(soup.find('pre', {'id': 'sample-output-' + str(i)}).text.strip())
    except:
        break

위 코드의 sample_input_list와 sample_output_list를 이용하여 다음과 같이 출력을 해주었습니다.

print(title)
for i in range(len(sample_input_list)):
    print("______________________")
    print("예제 입력 " + str(i + 1))
    print(sample_input_list[i])
    print("예제 출력 " + str(i + 1))
    print(sample_output_list[i])
    print("실행 결과")

    # run_test함수 호출
    result = run_test(problem_number, sample_input_list[i])

    if sample_output_list[i].rstrip() == result.rstrip():
        print(result)
    else:
        print(result)
        print("틀렸습니다.")
        return

여기서 중요한 함수는 run_test함수입니다.

 

def run_test(problem_number, sample_input):

run_test함수는 문제 번호와 input예제를 인자로 받습니다.

import os
import subprocess

# 사용자 경로를 지정하지 않았으면 기본 경로로 설정
# 마지막에 /가 없다면 추가
file_path = (os.getcwd() + '/solved/') if user_file_path != "_" else user_file_path
if file_path[-1] != "/":
    file_path = file_path + "/"

사용자 경로를 지정하지 않았으면 기본 경로로 저장합니다.

 

try:
    # 파일 경로의 파이썬 파일을 subprocess로 open
    file = subprocess.Popen(
        ['python', file_path + problem_number + ".py"],
        stdin=subprocess.PIPE,
        stdout=subprocess.PIPE
    )
except Exception as e:
    print("파일이 존재하지 않습니다.", e)
    return

위 코드가 이 함수에서 가장 핵심적인 부분입니다.

subprocess의 popen함수를 이용해 파이썬 파일을 subprocess로 실행시켜줍니다.

이 코드의 Popen()은 터미널 코드를 공백 기준으로 나누어서 배열에 저장해서 실행시켜주는 것입니다.

stdin=subprocess.PIPE, stdout=subprocess.PIPE는 입출력을 이 파일에서 접근하겠다는 의미입니다.

 

이 함수에서 subprocess에 접근하는 방법은

# subprocess 실행된 파일에 sample_input 전달
file.communicate(input=bytes(sample_input.rstrip(), encoding="utf-8"))
# subprocess 실행된 파일의 출력을 가져옴
out, err = file.communicate()

위와 같이 coummunicate()함수를 이용해 subprocess에 접근하고, 출력을 받아올 수 있습니다.

이를 반환하여 이전 test()함수에서 비교하여 출력을 해주면 프로그램이 종료됩니다.

 

읽어주셔서 감사합니다. 잘못된 부분이 있을 경우 댓글을 남겨주세요. :)

 


전체 소스코드는 https://github.com/Jeonhui/baekjoon/blob/main/baekjoon_testWithSampleInputs.py 에 저장되어있습니다.

웹 스크래핑 (Web Scraping)

백준 온라인 저지는 웹 스크래핑을 금지하고 있습니다.

지나치게 많은 트래픽을 발생시키는 경우에는 사이트 이용이 정지됩니다.

스타트링크는 웹 스크래핑의 수요와 이유를 충분히 이해하고 있기 때문에, API를 제공할 계획이 있습니다.
https://help.acmicpc.net/rule

 

이용 규칙

블로그블로그에는 지속적으로 의미를 가질 수 있는 다음과 같은 글을 올릴 수 있습니다. 아래는 예시이며 아래 적히지 않은 내용도 가능합니다.알고리즘/자료구조 튜토리얼문제에 종속적이지

help.acmicpc.net

백준에서는 웹 스크래핑을 금지하고 있기 때문에 이 소스코드는 참고만 해주시기 바랍니다.