[Python]

[Python] 사이트(Jennifer Front)에서 조회한 데이터 excel로 저장해보기

미냠 2023. 10. 15. 20:54
반응형

갑작스럽게 스팟성 업무가 생겨버렸다..! CRM 시스템의 특정 페이지 페이지뷰 수를 파악해야 했다.

대략,, 10개 정도의 URL을 조회 가능한 날짜 모두 ..

어떻게 하면 효율적으로 조회를 할 수 있을까.. 고민하다

(서버 로그를 확인했더니 6개월 이내 로그만 저장하고 있어서 다른 방법을 찾아야 했다 ㅠ)

이전에 회사 전체 시스템의 성능 개선을 위해 설치한 Jennifer Front가 생각났다.

Jennifer Front를 간단하게 설명하자면 웹 프론트 성능 개선 툴이다.

여러 대시보드를 지원하는데 페이지 별 로드시간이나 Ajax 응답 시간이나 JS Error 등을 확인할 수 있다.

그리고 여기서 페이지 호출 수에 있는 수치를 조회해야겠다고 생각했다!!

대략 10개의 URL을 작년 11월부터 올해 9월까지... 노가다를 할 자신이 없어서

요고를 python으로 만들어야겠다!라고 생각했다. (사실 팀장님이 약간의 힌트를 줬다.. 후후)

일단 Jennifer Front에서 데이터 조회 시 호출하는 Network를 확인해서 Postman으로 호출해 봤다.

아래의 링크를 참고했다.

https://dev.to/stuartcreed/how-to-copy-a-http-request-to-from-the-network-taboo-postman-5835

그리고 이것을 그대로 Python 코드로 만들어서 조회된 데이터에서 내가 원하는 데이터만 추출하여 excel로 저장했다.

여기서 주의할 점은 로그인 세션 토큰을 Header의 Cookie 값에 유지시켜줘야 하는 점이다.

그리고 timestamp만 변환해서 조회하게끔 했다.

먼저 조회할 월을 선언해 줬다.

# 조회

s_date_arr = [

"2022-11",

"2022-12",

"2023-01",

"2023-02",

"2023-03",

"2023-04",

"2023-05",

"2023-06",

"2023-07",

"2023-08"

]

만약 2022년 11월 데이터 조회의 경우,

2022년 11월 1일부터 2022년 12월 1일까지 unix timestamp로 변환하여 get param에 추가하여 호출해야 했다.

다음 달 1일을 가져오는 함수를 생성했고

# 다음달 1일

def first_day_of_next_month(date):

if date.month == 12:

date = date.replace(year=date.year+1, month=1, day=1)

else :

date = date.replace(month=date.month + 1, day=1)

return date.strftime("%Y-%m-%d")

검색 시작일과 종료일을 변수에 넣어주고 unix 변환을 해줬다.

start_str = s_date+"-01" # 검색 시작일

end_str = first_day_of_next_month(datetime.date(int(s_date[0:4]), int(s_date[5:7]), 1)) # 검색 종료일

 

print("start_date : "+start_str+" ~ end_date : "+end_str)

# unix 변환

start_time_unix = int(datetime.datetime.strptime(start_str, '%Y-%m-%d').timestamp())

end_time_unix = int(datetime.datetime.strptime(end_str, '%Y-%m-%d').timestamp())

date_diff = datetime.datetime.strptime(end_str, '%Y-%m-%d') - datetime.datetime.strptime(start_str, '%Y-%m-%d')

다음은 Jennifer Front에서 get param으로 같이 전송하는 조회 단위값이었는데

7일 이상 날짜 검색 시, 864000 값으로 전송된다고 보면 된다.

(조회 단위값의 초단위 변환 값이다)

# 조회 단위 하루 : 600(10분) / 1일 ~ 3일 : 3600(1시간) / 4일 ~ 6일 : 21600(6시간) / 7일 : 86400(일별)

if date_diff.days < 1:

interval = 600

elif date_diff.days >= 1 and date_diff.days < 4 :

interval = 3600

elif date_diff.days >= 4 and date_diff.days < 7 :

interval = 21600

elif date_diff.days >= 7 :

interval = 86400

print(start_time_unix)

print(end_time_unix)

print(interval)

그리고 조회할 url를 설정했다.

기본 도메인과 url path를 분리했다. 엑셀 저장 시, path를 추가해주려고 따로 저장했다.

(여기서 Jennifer Front가 http와 https를 각각 수집하는 이슈로..각각 조회하게끔 했다 ㅠ)

## CRM URL

url_arr = [

"http://test.com",

"https://test.com"

]

## 조회 PATH

path_arr = [

"/test1",

"/test2"

]

그리고 get 호출의 param 값을 설정했다.

검색 시작일, 종료일, 조회 단위, 검색 url 순이다.

params = {

"startTime": start_time_unix,

"endTime": end_time_unix,

"interval": interval,

"pageUrlFilter": url+path # 검색 url

}

그리고 headers에 해당 호출을 위한 값들을 추가해줬다.

여기서 cookie에 토큰 값이 꼭 있어야 조회가 가능하다.

headers = {

"authority": "d-api.jennifersoft.com",

"accept": "*/*",

"accept-language": "ko-KR,ko;q=0.9,en-US;q=0.8,en;q=0.7",

"cookie": "",

}

로그인 관련 해서는 아래 링크에서 상세하게 정리해뒀다. ㅎ

https://blog.naver.com/minyeong66/223220530833

 

그리고 해당 내용을 호출해서 원하는 값만 excel 저장해주는 로직만 추가하면 된다.

여기서 월별로 csv 파일로 저장하게 함으로서

해당 코드를 실행시키면 월별로 조회하는 url 페이지 호출수가 저장되게 된다.

response = requests.get(base_url, params=params, headers=headers)

if (response.json()) :

data = response.json()

raw_data = data['pageLoadCountByPeriod']

raw_data.insert(0, url+path)

print(raw_data)

csv_file = start_str[0:7]+"_output.csv"

# 월별 csv 저장

with open(csv_file, mode='a', newline='', encoding='utf-8') as file:

writer = csv.writer(file)

writer.writerow(raw_data)

여기서 open이라는 함수를 통해 excel을 활용할 수 있는데,

csv_file : 파일명

mode='a' : 동일 파일명이 있는 경우 append

newline = '' : 자동 줄바꿈 없애기

로 설정했다.

다양한 설정이 가능하니 이것은 직접 해보는 게 좋을 것 같다.

json 형태의 데이터를 excel로 저장할 때는 pandas를 활용하면 편하긴한데..

사실 그렇게 복잡한 데이터 구조는 아니라서 그냥 간단하게 했다.

이렇게 해서 전체 코드이다.

 

import requests

import csv

import datetime

import json

# 호출 jennifor front url

base_url = "https://d-api.jennifersoft.com/....."

# 다음달 1일

def first_day_of_next_month(date):

if date.month == 12:

date = date.replace(year=date.year+1, month=1, day=1)

else :

date = date.replace(month=date.month + 1, day=1)

return date.strftime("%Y-%m-%d")

# 조회

s_date_arr = [

"2022-11",

"2022-12",

"2023-01",

"2023-02",

"2023-03",

"2023-04",

"2023-05",

"2023-06",

"2023-07",

"2023-08"

]

for s_date in s_date_arr :

 

start_str = s_date+"-01" # 검색 시작일

end_str = first_day_of_next_month(datetime.date(int(s_date[0:4]), int(s_date[5:7]), 1)) # 검색 종료일

 

print("start_date : "+start_str+" ~ end_date : "+end_str)

# unix 변환

start_time_unix = int(datetime.datetime.strptime(start_str, '%Y-%m-%d').timestamp())

end_time_unix = int(datetime.datetime.strptime(end_str, '%Y-%m-%d').timestamp())

date_diff = datetime.datetime.strptime(end_str, '%Y-%m-%d') - datetime.datetime.strptime(start_str, '%Y-%m-%d')

# 조회 단위 하루 : 600(10분) / 1일 ~ 3일 : 3600(1시간) / 4일 ~ 6일 : 21600(6시간) / 7일 : 86400(일별)

if date_diff.days < 1:

interval = 600

elif date_diff.days >= 1 and date_diff.days < 4 :

interval = 3600

elif date_diff.days >= 4 and date_diff.days < 7 :

interval = 21600

elif date_diff.days >= 7 :

interval = 86400

print(start_time_unix)

print(end_time_unix)

print(interval)

## CRM URL

url_arr = [

"http://test.com",

"https://test.com"

]

## 조회 PATH

path_arr = [

"/test1",

"/test2"

]

for path in path_arr :

for url in url_arr :

params = {

"startTime": start_time_unix,

"endTime": end_time_unix,

"interval": interval,

"pageUrlFilter": url+path # 검색 url

}

headers = {

"authority": "d-api.jennifersoft.com",

"accept": "*/*",

"accept-language": "ko-KR,ko;q=0.9,en-US;q=0.8,en;q=0.7",

"cookie": "",

}

response = requests.get(base_url, params=params, headers=headers)

if (response.json()) :

data = response.json()

raw_data = data['pageLoadCountByPeriod']

raw_data.insert(0, url+path)

print(raw_data)

csv_file = start_str[0:7]+"_output.csv"

# 월별 csv 저장

with open(csv_file, mode='a', newline='', encoding='utf-8') as file:

writer = csv.writer(file)

writer.writerow(raw_data)

 

print(s_date+" Count Date Save Success")

 
반응형