ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Encoding에 관한 고찰
    Web 2020. 4. 9. 20:19

     

     

    과에서 듣는 강의 중 웹 크롤러를 제작하는 과제가 주어졌었다. 기존에 혼자서 진행한 프로젝트에서 이미 웹 크롤러를  제작해 보았기 때문에 그 방식을 그대로 따라하기로 했다. 

     

    진행한 프로젝트 : 중앙대학교 빈 강의실

    https://campus.cau.ac.kr/usk/html/UskLec10.html (이 사이트에서 검색 조건을 전송하면, 나오는 페이지를 크롤링하기로 결정했다.)

     

    하지만 이 강의에서 모든 과제는 파이썬으로 제작해야 하기 때문에 node.js로 만든 크롤러를, python으로 문법을 변환시키는 과정이 필요했다.

     

    python에서도 request 모듈이 존재하기 때문에, 쉽게 데이터를 얻어낼 수 있을 거라고 생각했었다. 하지만 그건 아니었다. 처음엔 어떤 데이터를 요청해도 해당하는 조건을 찾을 수 없다고 하기에, 왜 그럴까 고민을 많이 해봤지만, 도저히 답을 내릴 수가 없었다. 파이썬의 문법과 node.js의 문법이 다른데서 오는 거라면, 파이썬의 문법에 맞게 post request를 하는 방법을 찾아냈어야만 했다.

     

    찾아본 결과, python의 request에는 인자로 data와 json 이 두 가지 중 하나를 건내줄 수 있는데, 내가 무작정 json이라 생각하고 보낸 것이 문제였다. json은 해당 웹 서버에서 content-type이 application/json으로 설정된 경우에 데이터를 보낼 때 사용하는 인자였다. 인자를 data로 설정하고, 임의의 데이터를 전송하니, 원하는 데이터를 얻을 수 있었다. 

     

    이제 다시 임의의 데이터가 아닌, 내가 원하는 데이터(과목명 : 사이버)를 보내보았다. 그런데 이게 무슨일인가.. 또 해당하는 조건을 찾을 수가 없다고 나온다.

     

    문제의 원인을 분석하기 위해, 실제 웹 페이지에서 데이터(과목명 : 사이버)를 보내보았다. 그리고 개발자 도구를 열어 네트워크 탭에 들어가 확인해보니 아래 이미지와 같이 인코딩되어 문자열이 전송되었다. 무언가 감이 온다.

    영어는 그대로 전송되는데, 한글을 데이터로 보내니 인코딩이 되어 보내져야 하는 듯 하다. 

     

    사이버를 검색했을 때, 전송되는 데이터

     

    그렇다면 어떤 타입으로 인코딩을 해야할까? utf-8? 

    정확히 하기위해 다시 한 번 네트워크 탭을 열어 찾아보니 euc-kr 타입으로 문자셋이 정해져있다.

    데이터를 encode("euc-kr")하여 전송하니, 원하는 조건을 얻을 수 있었다.

     

    charset = euc-kr로 설정된 응답 헤더

     

    근데 궁금증이 생겼다. node.js로 할 땐, 내가 따로 인코딩한 적이 없는데 올바른 데이터를 얻어냈지만, 왜 파이썬에서는 얻지 못한 것일까?? 그러한 궁금증을 가지고 검색을 해보니 아래 사이트에서 원하는 답을 얻을 수 있었다.

     

    정리하자면, node.js의 request에선 charset을 인코딩하는 과정이 post에 이미 내재하기 때문에, 별도로 인코딩할 필요가 없었던 것이다. 이게 또 스노우볼처럼 굴려져서, 파이썬에선 빈 문자열을 데이터로 전송하면, 모든 결과를 얻어내지만, node.js에선 일치하는 조건이 없어서 어떠한 결과도 얻어낼 수가 없게되는 것이다. 

     

    이번 과제는 정말 간단한 과제였지만, 깨달은 건 상당했다.

    • 웹 서버에선 기본적으로 content-type을 applcation/x-www-form-urlencoded로 설정하기 때문에, 최근의 웹서버가 아닌 이상, 한글 데이터를 전송할거면 해당 charset에 맞게 인코딩을 해줘야한다는 것
    • node.js에선 인코딩이 post 메서드 내재하기 때문에 별도로 구현할 필요는 없지만, 혹시나 문제가 생기면 이 부분을 건드려 줘야 한다는 것

    을 알게 됐다. 한 번 시간이 나면 이 사이트에 들러 글을 읽어보면 content-type과 form data의 관계에 대해 얻어갈 게 있을 것이라 확신한다.

     

    아래는 이번에 만든 웹 크롤러의 소스코드이다.

     

    https://github.com/Catnap421/cps-sec

     

    Catnap421/cps-sec

    2020년 1학기 cps 실습 수업. Contribute to Catnap421/cps-sec development by creating an account on GitHub.

    github.com

     

     

     

    'Web' 카테고리의 다른 글

    [HTML/DOM] Event(이벤트)  (0) 2020.02.11

    댓글

Designed by Tistory.