뒤로가기뒤로가기

데일리 랩스

캠퍼스론을 위한 데이터 정형화 프로젝트 vol.2

그동안 만난 이슈들

데일리펀딩

 

⛄ 인턴을 시작할 때는 에어컨 바람과 함께였는데 지금은 벌써 겨울 냄새가 물씬 풍기는 11월이 지나갔다. 이번 일지에서는 지난번 일지에 이어  ‘캠퍼스론을 위한 데이터 정형화 프로젝트’가 어떻게 진행되고 있는지 작성해 보았다.


개발일지

 

[ 그동안 만난 이슈들 ]

새로운 코드를 추가할 때마다 새로운 이슈를 마주했다? 열심히 구글링도 하고 조언도 구하면서 해결한 상황을 정리해 보려 한다.

 

문제 상황 1

그동안 instagram에서 데이터를 가져올 때 해당 유저의 게시글이 100개가 있으면 python에서 100개의 게시글 데이터와 각 게시글의 댓글 데이터를 모두 스크래핑을 한 후 nestjs로 넘겨주어 저장하도록 코드를 작성했다. 데이터의 양이 적으면 상관이 없지만 일정 정도를 넘어가면 nestjs로 넘어올 때 인스타그램 데이터를 담은 json이 잘려서 변환이 안되는 오류가 발생했다. 또한 인스타그램의 게시글 수가 많아지면 python에서 데이터를 가져오는 시간이 길어져서 중간에 네트워크의  오류 등의 문제로 연결이 끊기면 nestjs에 데이터를 저장을 하지 못하는 상황이 발생한다. 

 

해결 방법

이에 python에서 한 번에 모든 게시글을 가져오는 것이 아니라 게시글의 수를 n개 씩 가져오도록 코드를 수정했다. 게시글의 총개수가 Mxn개라면 nestjs에서 python 파일을 M번 호출하는 식으로 구현했다.


문제 상황 2

인스타그램의 데이터를 불러오는 request 호출을 많이 보내면 계정이 spam 처리가 되어 데이터를 불러올 수가 없었다. 이는 일정 시간이 지나면 해결이 됐는데 반복해서 spam 처리가 되면 인스타그램 앱에서 카메라에 얼굴을 돌려가며 사람이라는 것을 인증해야 했다?(아무도 보는 사람이 없지만 회사에서 얼굴을 돌리는 것은 매우 부끄러웠다?)

 

해결방법

인스타그램에서 일정 시간 동안 몇 번의 api를 호출이 가능한지 기준이 정해져 있는 것 같았다. 이를 찾기 위해 API를 호출하는 개수를 조절하며 몇 개를 가져오면 스팸처리가 되는지 실험을 진행했다. 최대 개수를 알아본 후, 게시글을 n개씩 가져오는 중간중간 몇 초간 delay를 주면서 계정이 스팸처리가 안 되는 것을 확인하고 이를 토대로 코드를 수정했다.


문제 상황 3

DB에 timestamp로 저장한 값이 현재 시간이 아닌 다른 시간으로 저장되었다. 분명 오후인데 새벽 5시가 찍혀서 당황했던 기억이 있다.

 

해결방법

MySQL 서버에서 timezone을 출력해 봤더니 UTC로 표시되고 있었다. 이를 한국 시간대로 표시하기 위해  ‘Asia/Seoul’로 변경을 해주기 위해 MySQL Workbench에서  SET GLOBAL time_zone = 'Asia/Seoul'; 을 시도하면 다음과 같은 오류가 발생했다.

Error Code: 1227. Access denied;

you need (at least one of) the SUPER or SYSTEM_VARIABLES_ADMIN privilege(s) for this operation

현재 Binnie님과 함께 DB를 사용해야 해서 AWS RDS로 사용하고 있기 때문에 파라미터 그룹을 수정해 주어야 했다. 파라미터 편집에서 time_zone 값을 Asia/Seoul로 변경 후 저장해 주었더니 시간이 제대로 표시가 되었다. (●'◡'●)?


[데이터 정형화]

인스타그램 스크래핑을 통해 모은 데이터 중 정형화가 가능한 부분이 무엇일지 고민해 보며 데이터 정형화를 진행 중에 있다. 일부 내용을 소개해 보도록 하겠다.

 

? 게시글을 올린 기간

해당 대외활동 계정으로 언제부터 언제까지 게시글을 작성했는지 계산했다. 다음과 같이 게시글 작성일이 들어있는 Repository에 접근해 최근 게시글 작성 일자와 가장 처음 작성한 게시글 작성일자를 가져온 후 일자를 계산해 주었다.

 

? 유저가 가장 많이 사용한 해시태그 TOP5

해당 계정으로 게시글을 작성할 때 가장 많이 사용한 해시태그 중 5개를 골라 보여주기로 했다. 해시태그 별 개수를 세기 위해 게시글 내용 안의 해시태그와 댓글에 계정주가 단 해시태그를 가져와 카운트해 주었다. 다음 과정을 거쳐 원하는 정보를 가져올 수 있었다.

◾ instagram_data 테이블에서 인스타그램 ID로 게시글 고유번호 가져오기

◾ instagram_content_hashtag 테이블에서 게시글 고유번호로 게시글에 작성된 해시태그 ID 가져오기 

◾ instagram 테이블에서 인스타그램 ID로 게시글 유저 고유 ID 가져오기

◾ instagram_comment 테이블에서 유저 고유 ID, 게시글 고유번호로 댓글 ID 가져오기

◾ instagram_content_hashtag 테이블에서 댓글 ID로 게시글에 작성된 해시태그 ID 가져오기 

◾ instagram_hashtag 테이블에서 앞에서 모은 해시태그 ID로 해시태그 가져오기

현재는 5개의 Repository에 접근해서 해시태그를 가져오고 있는데 이를 조인으로 한 번에 가져오는 방법으로 수정하는 것을 고려 중이다.

 

? 해시태그별 개수

계정이 대외활동 계정이 아니라 개인 계정일 수도 있으므로 대외활동이나 서포터즈 활동 등과 관련 없는 일상 위주의 해시태그들이 TOP5 안에 있을 수도 있다고 생각되었다. 이에 인턴, 공모전, 서포터즈 등과 같은 해시태그를 몇 개 선정해 사용 빈도수를 따로 표기할 수 있게 해주었다.

관련 해시태그들이 무엇이 있나 더 고민해 본 후 specHash를 DB에 따로 저장해서 확인하는 방향으로 수정 예정이다.

 


 

[?11월의 일상]

? 그동안 Binnie님과 점심에 배달 맛집과 회사 근처 맛집 도장 깨기를 하며 이것저것 다 먹었더니 몸이 안 좋아지는 게 느껴진다. 아프지 않고 오래 살기 위해 Binnie님과 건강한 음식 먹기 프로젝트에 돌입했다. 매일 실패하는 것 같지만 남은 인턴 기간 동안 열심히 지켜봅시다…!

 

⏰ 예상하지 못한 오류를 만나기도 하고 코드를 볼 때마다 수정하고 싶은 부분도 계속 생겨나지만 하나하나 고쳐나가면서 뿌듯함을 느끼는 중이다. 남은 인턴 기간 동안 뿌듯함이 연속되길 ?

 

우리는 매일 금융의 각을 넓혀가는
데일리언입니다.

데일리언과 함께하기 >