Jeonhui {ios}

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

projects

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

jeonhui 2022. 2. 23. 18:28

안녕하세요 Jeonhui입니다.

이번 시간에는 웹크롤링을 이용한 baekjoon 문제 불러오는 프로그램을 설명드리겠습니다.

이전 프로젝트를 보고 싶은 분들은 이전 글을 확인해주세요.

2022.02.21 - [projects] - Baekjoon Projects - 1. github auto push baekjoon (1)

 

Baekjoon Projects - 1. github auto push baekjoon (1)

안녕하세요 Jeonhui 입니다. 이번에 baekjoon online judge 사이트를 이용해 세 가지 개인 프로젝트를 진행해보았습니다. 첫 번째 프로젝트는 baekjoon의 문제 풀이 결과를 가져와 맞았을 경우 깃허브에 자

jeonhui.tistory.com


이 프로젝트는 웹 크롤링을 이용해 백준 문제들을 가져오는 프로그램입니다.

이 역시 bs4requests 패키지를 이용하여 웹 크롤링을 하게됩니다.

 

def get_baekjoonproblem():

 

먼저, 사용자에게 문제 번호 입력을 받아 problem_number변수에 저장됩니다.

try:
    response = requests.get('https://www.acmicpc.net/problem/' + problem_number)
    soup = Soup(response.text, 'html.parser')
    # 문제 주소의 html 파일을 text로 불러옴
    title = problem_number + ": " + soup.find('span', {'id': 'problem_title'}).text
    # id가 problem_title인 span태그를 찾음
    print(title)

except Exception as e:
    # 잘못된 입력이 들어왔을 시에 problem_tilte을 찾지 못함 -> 종료
    print("잘못된 문제 번호입니다.", e)
    return

위 코드는 requests를 이용해 해당 문제 번호의 웹사이트를 가져오게 되고, bs4패키지를 이용해 해당 html파일을 Soup객체로 변환시켜줍니다. 

이 Soup객체에서 문제 번호를 찾아 출력해줍니다.

이때 예외가 발생하면 잘못된 문제 번호라고 사용자에게 알려주고, 종료됩니다.

 

description = soup.find('div', {'id': 'problem_description'}).text.strip()
input_explantion = soup.find('div', {'id': 'problem_input'}).text.strip()
output_explantion = soup.find('div', {'id': 'problem_output'}).text.strip()
# 각각 id가 problem_description, problem_input, problem_out인 div 태그를 찾음

위 배열들은 각각 설명, input 설명, output 설명을 저장하게 됩니다.

 

# 최대 20번까지 반복하고 더이상 없으면 for문을 빠져나옴
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에 저장해줍니다.

 

for i in range(len(sample_input_list)):
    print("예제 입력 " + str(i + 1))
    print(sample_input_list[i])
    print("예제 출력 " + str(i + 1))
    print(sample_output_list[i])
    print()

이제 이를 출력해주면 결과가 나오게 됩니다.

 

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

다음 시간에는 세 번째 프로젝트 Baekjoon Projects - 3. test Sample Inputs에 대해 작성하도록 하겠습니다.

 


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

웹 스크래핑 (Web Scraping)

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

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

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

 

이용 규칙

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

help.acmicpc.net

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