시작은 미미하나 끝은 쥬쥬하리라.

Programming/QT

[QT] Qt4 - Naver 검색 API 사용해서 데이터 파싱하기

코딩뚜벅이 2024. 1. 16. 22:22

Qt4 Naver 검색 API 사용해서 데이터 파싱하기

  • 오픈 API 요청 코드 작성
  • 데이터 파싱 결과

오픈 API 요청 코드 작성

네이버 오픈 API에서 제공하는 검색 API를 이용해서 블로그 데이터를 크롤링하는 코드를 작성해보겠습니다. 앞서서 네이버 오픈 API 사용을 위한 애플리케이션 등록은 선행되었다고 가정하고 진행하겠습니다.

 

 

 

[API] 네이버 오픈 API 사용하는 방법

네이버 오픈 API 사용하는 방법 1. 네이버 오픈 API 사이트 접속 2. 사용할 네이버 오픈 API 결정 3. 애플리케이션 등록 4. 애플리케이션 정보 확인 5. 신청한 서비스 API 요청 및 응답 예시 확인 1. 네이

tiptapcoding.tistory.com

 

 

네이버 오픈 API에 데이터의 요청부터 QT에 데이터의 파싱까지 간단하게 구현을 한 예제 코드입니다. 제목과 같이 QT 버전은 Qt4를 사용하였습니다.

 

 

1. API URL

저는 API에 블로그를 대상으로 "Baseball"이라는 단어를 검색하는 코드를 작성했는데, 블로그가 아닌 다른 카테고리를 대상으로 검색을 희망하거나 검색어 외의 추가적인 파라미터를 추가하고 싶다면 네이버 오픈 API 사이트에서 제공하는 API 문서를 참고해서 그에 맞게 URL과 쿼리에 들어가는 파라미터를 추가해주시면 됩니다.

 

2. Request 객체 생성

먼저 API에 요청할 API의 URL과 파라미터를 선언해주었습니다. 검색어는 쿼리형식에 맞게 QUrl 클래스에서 제공하는 toPercentEncoding() 함수를 통해 인코딩을 진행했습니다. 이후 API URL과 인코딩된 파라미터를 하나의 QUrl 객체로 병합하고 이를 QNetworkRequest 객체로 변환하여 API에 요청할 Request를 생성해줍니다.

 

3. http 헤더 추가

네이버 오픈 API의 애플리케이션 등록을 마치면 반환받는 클라이언트 ID와 Secret은 API에 데이터 요청 시, http 프로토콜의 헤더에 포함되어야 합니다. 저는 QNetworkRequest 클래스에서 제공하는 setRawHeader() 함수를 통해 해당 값을 생성했던 Request 객체의 헤더에 포함시켰습니다.

 

4. 데이터의 요청 및 응답 저장

Qt4 버전에서는 QNetworkAccessManger 클래스의 get() 메서드를 통해 데이터의 요청이 가능합니다. 응답 받은 데이터는 QNetworkReply 객체를 통해 데이터를 받아올 수 있습니다. 이제 요청한 데이터의 응답은 qReply 객체에 저장됩니다.

 

5. 요청 루프 추가

HTTP에서 네트워크 요청은 비동기 방식으로 처리됩니다. 따라서 위와 같은 단일 코드에서는 관련된 처리를 해주지 않으면 응답을 받기 전에 프로세스가 종료될 수 있습니다. 여러 방식을 사용할 수 있지만 저는 간단한 구현을 위해 루프를 생성하여 QT의 Signal - Slot을 활용해, qReply(응답 객체)가 요청에 대한 응답을 마무리하면 루프를 빠져나오도록 구현하였습니다.

 

6. 에러 처리 및 데이터 수신

에러의 처리와 데이터를 수신하는 방법은 가지각색입니다. 저는 qReply 객체에서 error를 송출하는지의 여부에 따른 처리를 해주었고 응답 받은 데이터는 QNetworkReply 클래스에서 제공하는 readAll() 메서드를 통해 1차적으로 ByteArray에 저장하고, UTF-8 형식으로 변환하여 다시 QString에 2차적으로 저장하여 파싱하는 과정을 거쳤습니다. 이제 인코딩을 거친 데이터는 콘솔창에 표시됩니다.

 

7. 버퍼 비우기

저는 QT에서 제공하는 deleteLater() 함수를 통해 응답 버퍼를 비우는 로직을 덧붙였습니다. deleteLater() 함수는 (1) 이벤트 루프가 동작하는 중간에 작성되면, 이벤트 루프가 반환된 직후 객체를 삭제하는 동작을 하고, (2) 루프 중간이 아닌 곳에서 사용되면 해당 스레드가 종료되는 순간에 객체를 삭제하는 동작을 합니다.

 


 

데이터 파싱 결과

다음은 파싱된 데이터가 표시되는 결과 입니다.

 

 

추가로 데이터를 UTF-8 형식으로 인코딩하는 과정을 거치지 않으면 한글이 깨져서 표시되기 때문에 데이터 인코딩 로직은 꼭 필요합니다. 그리고 네이버 오픈 API에서 제공하는 응답 데이터는, 요청 시 파라미터의 설정을 통해서 json 혹은 XML 형식으로의 응답을 결정할 수 있습니다.

 

 

 

UI를 작성하지 않았고 단순히 Baseball이라는 검색어가 포함된 블로그 게시물을 파싱하여 콘솔에 표시하는 코드 구현이지만, QT에서 네이버 오픈 API를 통해 데이터를 json 형식으로 파싱하는 간단한 구현을 해보았습니다.