solved.ac 에서 문제 티어 크롤링하기

2023-02-14

PS 공부를 위해 문제 목록을 만들던 중, 문제 티어를 같이 표시해보고 싶어졌다.

import requests
import json

solved.ac에서 api로 티어 받아오기

def get_ranking(problemid):
  url = f"https://solved.ac/api/v3/problem/show?problemId={problemid}"
  headers = {'Content-Type': 'application/json'}
  result = requests.get(url, headers=headers).json()
  rank = result['level']
  title = result['titleKo']
  return f' <img src="https://d2gd6pc034wcta.cloudfront.net/tier/{rank}.svg" width=10>' \
          f'[{problemid}](https://boj.kr/{problemid}) {title}'
>>> get_ranking(1000)
'<img src="https://d2gd6pc034wcta.cloudfront.net/tier/1.svg" width=10>[1000](https://boj.kr/1000) A+B'

정규표현식으로 기존에 적어둔 리스트 업데이트

orig = """
### 정렬
- [015][[2750]](https://boj.kr/2750) 수 정렬하기
- [016][[1377]](https://boj.kr/1377) 버블 소트
- [017][[1427]](https://boj.kr/1427) 소트인사이드
- [018][[11399]](https://boj.kr/11399) ATM
- [019][[11004]](https://boj.kr/11004) K번째 수
"""
import re
for s in orig.split('\n'):
  # find [[number]](https://boj.kr/number) and get number by regex
  p = re.compile(r"\[\[(\d+)\]\]\(https://boj.kr/\d+\).*$")
  p_result = p.search(s)
  if p_result is not None:
    matchstr, p_num = p_result.group(0), p_result.group(1)
    print(p.sub(get_ranking(p_num), s))
  else:
    print(s)
### 정렬
- [015] <img src="https://d2gd6pc034wcta.cloudfront.net/tier/4.svg" width=10>[2750](https://boj.kr/2750) 수 정렬하기
- [016] <img src="https://d2gd6pc034wcta.cloudfront.net/tier/14.svg" width=10>[1377](https://boj.kr/1377) 버블 소트
- [017] <img src="https://d2gd6pc034wcta.cloudfront.net/tier/6.svg" width=10>[1427](https://boj.kr/1427) 소트인사이드
- [018] <img src="https://d2gd6pc034wcta.cloudfront.net/tier/7.svg" width=10>[11399](https://boj.kr/11399) ATM
- [019] <img src="https://d2gd6pc034wcta.cloudfront.net/tier/6.svg" width=10>[11004](https://boj.kr/11004) K번째 수

마크다운에 옮기니 이쁘게 잘 출력된 걸 볼 수 있다.

image