웹
책 한 권을 두고 탭 여섯 개를 열던 것을
한 화면으로
제목을 치면 도서관에 있는지부터 본다. 없으면 중고매장, 온라인 중고, 새 책, 이북 순으로 내려간다. 값과 재고가 한 줄에 나란히 서서 어디서 구할지가 바로 정해진다.

순서가 답이다
훑는 곳이 다섯인데 화면은 위에서 아래로 한 줄씩이다. 그 순서가 곧 「어디서 구할까」의 답이다.
도서관에 있다
그걸로 끝이다. 어느 관에 몇 권인지, 내 역에서 가까운 순으로 보여 주고 도서관 창을 바로 연다.
도서관에 없다
중고매장으로 내려간다. 지나는 길의 매장만 골라 두었기 때문에 목록에 뜨면 들르면 된다.
매장에도 없다
온라인 중고, 새 책, 이북 순으로 값이 선다. 정가에서 얼마나 빠지는지가 초록으로 붙는다.
중고는 「가서 확인」이 아니다

알라딘 중고매장 재고는 검색 결과 블록에 안 들어 있다. 중고매장 탭에서 상품 단위로 따로 읽어야 매장별 실제 값과 등급이 나온다. 그걸 읽고 나서야 「가서 확인」 문구를 지울 수 있었다.
자세한 동작
같은 책인데 판이 여럿이다
ISBN 으로만 찾으면 큰글씨책처럼 ISBN 이 다른 판을 놓친다. 서명과 저자로 한 번 더 찾아 합치고 등록번호로 중복을 지운다 — 「연금술사」가 7권 중 4권만 잡히던 것이 그래서였다.
교보에서 값이 안 보인다
파싱이 틀린 게 아니라 그 책이 품절인 것이다. 품절은 「품절 · 없음」으로 흐리게 두고 요약과 바로드림에서 뺀다. 상세 페이지 값을 끌어오면 살 수 있는 것처럼 보여서 되돌렸다.
검색 결과가 엉뚱하다
교보 순서는 판매량과 광고를 반영한다. 완전일치 1000점, 판형 차이 900, 접두 800, 포함 700, 세트와 합본 −300 으로 다시 세운다.
설정을 바꾸고 싶다
도서관과 중고매장은 브라우저에만 저장되고 요청마다 같이 간다. 서버는 아무것도 기억하지 않는다.
쓰는 법
python3 server.py 로 localhost:8913. 파이썬 표준 라이브러리만 쓰고 의존성이 없다.
Vercel 에도 같은 파일이 서버리스 함수로 올라간다.
만들면서 밟은 함정 — 같은 책에 다른 답을 주던 공개 API, 지하철 노선 하나로만 잰 거리,
OSError 를 안 거치던 응답 끊김 — 은 저장소의 HISTORY.md 에 적어 뒀다.