일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- XCTest
- 파이썬 깃허브 푸시
- 스위프트
- Crawling
- Apple HIG
- 백준 문제
- 프로젝트
- 리액트 배포
- 사용자 정의 연산자
- SWiFT
- wordle 사이트
- 파이썬
- 전위 연산자
- 워들
- HIG 한글
- Python
- 중위 연산자
- Github
- 스위프트 기초
- github push
- 깃허브 푸시
- HIG 한글 번역
- 리액트
- 후위 연산자
- 깃허브 페이지
- react
- 깃허브 페이지 배포
- 데이터타입
- 크롤링
- 워들 사이트
- Today
- Total
Jeonhui {ios}
Baekjoon Projects - 2. get Problem [웹 크롤링] 본문
안녕하세요 Jeonhui입니다.
이번 시간에는 웹크롤링을 이용한 baekjoon 문제 불러오는 프로그램을 설명드리겠습니다.
이전 프로젝트를 보고 싶은 분들은 이전 글을 확인해주세요.
2022.02.21 - [projects] - Baekjoon Projects - 1. github auto push baekjoon (1)
이 프로젝트는 웹 크롤링을 이용해 백준 문제들을 가져오는 프로그램입니다.
이 역시 bs4와 requests 패키지를 이용하여 웹 크롤링을 하게됩니다.
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
백준에서는 웹 스크래핑을 금지하고 있기 때문에 이 소스코드는 참고만 해주시기 바랍니다.
'projects' 카테고리의 다른 글
Baekjoon Projects - 3. test Sample Inputs [웹 크롤링] (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 |