※ 이 글은 의뢰자의 허락을 맡고 올리는 개인 포트폴리오용 글입니다.
※ 프로그램의 목적, 정보를 담지 않고, 알고리즘, 작성 방식만을 담은 글입니다.
※ 추후 심심하면 이 글의 내용을 종류별 분리해서 따로 글을 작성할 수도 있습니다.
Requests
http request를 보낼 수 있는 라이브러리.
requests.post(url, cookies, headers, data) 를 통해 올바르게 값을 전달할 경우
(기본적으로) html 형식으로 response를 받게 된다.
parameter로 들어가는 값들은 사이트에 맞게 넣어줘야 하는데,
그것은 아래의 방법을 이용해 알아낼 수 있다.
Requests에 넣을 값을 찾는 방법
더럽게 더럽게 보고왔네
위의 캡처는 F12를 눌러 오른쪽에 저거를 띄우고 구글에 '나무위키'를 친 결과다.
그러면
이 아이콘을 가진 파일을 뒤져보면 (여러 개 있을 수 있음),
이런 식으로 html에 나오는 텍스트, 일부에 대해 우리가 원하는 정보를 가지고 있는 경우가 있다.
우리가 원하는 정보를 가진 파일을 오른쪽 클릭하면
이런 식으로 무언가를 copy할 수 있다.
이것은 간단하게 말하자면, 이 파일을 얻기 위해 전송된 http request를 보여준다고 생각하면 된다.
근데, 이걸 그대로 쓰기에는 언어에 맞지 않는 코드일 가능성이 높다.
그래서 이것을 언어에 맞게 사용할 수 있도록 변환해줄 것인데,
일단은 "Copy as cURL (bash)"를 눌러주자.
그리고 아래의 사이트를 들어가자.
이 사이트는 curl(cURL) 이라는 url 기반 데이터 전송 유틸리티 프로그램? 명령어를
각 언어에 맞게 변환해주는 사이트다.
아까 구글에 나무위키 친거를 그대로 복사해서 넣어서 Python용으로 바꾸었다.
이런 식으로 사용 언어에 맞게 명령어를 변환해서 http request를 보낼 수 있다.
일부 잘려 있지만, cookies, headers, data에 들어가는 값들 중에 반복문 등을 통해 이용 가능한 값이 있을 수 있다.
이를 분석하면, 여러 페이지의 사이트를 자동으로 request를 보내서 데이터를 얻을 수 있다.
물론, request가 올바르게 들어가 데이터가 잘 받아지는 직접 확인해야 한다.
이 request는 데이터 전송 시간이 있기 때문에 자동화해도 생각보다 오래 걸린다.
그렇기 때문에, 수 천 번의 request는 프로그램의 동작 시간을 매우 오래 걸리게 할 수 있으니 주의가 필요하다.
데이터 정제는 find(), find_all() 이나 .stripped_strings, .text 등을 이용해서 해주는 것이 깔끔할 것이다. (설명 생략)
API 이용하기
만약 사이트에서, 특히 수 천 번의 request가 필요할 것으로 예상되는 사이트에서
API를 제공해주는 경우, 이를 이용하는 것이 훨씬 빠른 방법이 된다.
사이트마다 API를 제공하는 방식에 로그인이 필요하거나, 아예 승인이 필요한 경우가 발생할 수 있다.
하지만 프로그램 동작 시간에 유의미한 영향을 주니, 수 천 번 이상의 request가 필요한 사이트에서는
가급적이면 이용해주자.
사이트에 따라 정제된 값을 줄 수도 있고, xml 등의 형태로 반환이 되는 경우도 있다.
이 형태는 모두 다르므로, 그리고 API 이용 방법도 다르므로
사이트에서 제공하는 Information을, 있는 경우 reference 사이트를 열심히 이용해주자.
제작하면서 중요하게 느낀 것 1. 중간 저장을 잘 하자
특히 파일 입출력에서 많은 양의 데이터를 저장할 때
중간에 프로그램이 픽하고 쓰러지는 경우에 파일이 날라가는 사태가 생기지 않도록
중간에 저장을 할 수 있도록 코드를 짜는 것이 생각보다 중요했다.
제작하면서 중요하게 느낀 것 2. 에러 캐칭을 잘 하자
중간에 프로그램이 강제로 알 수 없는 이유로 종료가 되면
일반적으로 크리티컬한 에러가 발생하는 경우다.
이를 최대한 테스팅 과정에서 캐칭을 해주고,
해당 에러에 대한 대비를 경우에 맞게 잘 해주는 것이 중요했다.
시연 및 피드백 과정에서 예상 못한 에러로 인해 강제 종료하는 경우가 발생했고
이를 찾아 캐칭해주는 것이 중요하게 작용했다.
여담
사실 이 request를 보내는 것, API를 이용하는 것 외에
파일에 값을 저장하고 불러오는 것,
입력값에 대해 assertion을 잘 해주는 것,
검색이나 크롤링 조건에 부합하도록 체크하는 알고리즘 등 많기는 하지만
이에 대해 굳이 여기서 작성할 필요는 없기 때문에 생략한다.
이러한 것들에 대해서는 그 자체를 따로 설명하는 글을
심심하면 작성할지도 모른다.