일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- 사용자 정의 연산자
- 깃허브 페이지 배포
- HIG 한글
- 워들 사이트
- Python
- 프로젝트
- 깃허브 페이지
- XCTest
- Github
- HIG 한글 번역
- SWiFT
- github push
- 데이터타입
- 백준 문제
- react
- 파이썬
- 워들
- Apple HIG
- 스위프트 기초
- wordle 사이트
- 크롤링
- 후위 연산자
- 리액트 배포
- 리액트
- 깃허브 푸시
- 스위프트
- Crawling
- 전위 연산자
- 중위 연산자
- 파이썬 깃허브 푸시
- Today
- Total
Jeonhui {ios}
Baekjoon Projects - 3. test Sample Inputs [웹 크롤링] 본문
안녕하세요 Jeonhui입니다.
이번 시간에는 웹크롤링을 이용한 baekjoon 예제들을 테스트하는 프로그램을 설명드리겠습니다.
이 프로그램은 이전 글의 프로그램을 활용한 프로그램이기 때문에 참고하시기 바랍니다.
2022.02.23 - [projects] - Baekjoon Projects - 2. get Problem [웹 크롤링]
이전 글에서는 백준 문제들을 불러오는 프로그램을 작성하였습니다. 이를 이용해 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
백준에서는 웹 스크래핑을 금지하고 있기 때문에 이 소스코드는 참고만 해주시기 바랍니다.
'projects' 카테고리의 다른 글
Baekjoon Projects - 2. get Problem [웹 크롤링] (0) | 2022.02.23 |
---|---|
Baekjoon Projects - 1. github auto push baekjoon (2) [웹 크롤링] (0) | 2022.02.23 |
Baekjoon Projects - 1. github auto push baekjoon (1) [웹 크롤링] (0) | 2022.02.21 |