Differences
This shows you the differences between two versions of the page.
Both sides previous revision Previous revision Next revision | Previous revision | ||
blog:facebook_api_get_posting_2_python [2020/02/29 06:16] – ↷ Page moved from blogs:facebook_api_get_posting_2_python to blog:facebook_api_get_posting_2_python prgram | blog:facebook_api_get_posting_2_python [2025/07/07 14:12] (current) – external edit 127.0.0.1 | ||
---|---|---|---|
Line 1: | Line 1: | ||
====== Facebook API 포스팅 가져오기 #2 python으로 정리 ====== | ====== Facebook API 포스팅 가져오기 #2 python으로 정리 ====== | ||
- | |||
{{tag> | {{tag> | ||
- | + | {{section> | |
- | {{section> | + | |
===== Why Python? ===== | ===== Why Python? ===== | ||
Line 12: | Line 9: | ||
- 오프라인에도 자료를 저장하고 싶음 | - 오프라인에도 자료를 저장하고 싶음 | ||
- 데이터 정리나 라이브러리 사용이 용이함. 익숙하기 때문에 개발 시간이 단축 | - 데이터 정리나 라이브러리 사용이 용이함. 익숙하기 때문에 개발 시간이 단축 | ||
- | 이라는 이유 때문에 데스크톱에서 주기적으로 실행시켜줘야 하지만, Python을 이용하기로 하고,\\ | + | 이라는 이유 때문에 데스크톱에서 주기적으로 실행시켜줘야 하지만, Python을 이용하기로 하고, |
PHP는 최신 현황만 불러오는 간단한 스크립트를 작성하기로 했다. | PHP는 최신 현황만 불러오는 간단한 스크립트를 작성하기로 했다. | ||
Line 32: | Line 29: | ||
==== API 호출 ==== | ==== API 호출 ==== | ||
- | [[blogs: | + | [[blog: |
requests 라이브러리의 get 함수를 사용해서 데이터를 받아서 json을 dict 형식으로 변환한다. | requests 라이브러리의 get 함수를 사용해서 데이터를 받아서 json을 dict 형식으로 변환한다. | ||
- | (Line 1의 utils 는 nested_json, | + | (Line 1의 utils 는 nested_json, |
<code python; highlight: [1,11,22] > | <code python; highlight: [1,11,22] > | ||
from utils import * | from utils import * | ||
Line 53: | Line 50: | ||
</ | </ | ||
- | \\ | + | |
- | \\ | + | |
Line 61: | Line 58: | ||
==== 다음페이지 호출 ==== | ==== 다음페이지 호출 ==== | ||
- | [[# | + | [[# |
<code python; highlight: | <code python; highlight: | ||
Line 79: | Line 76: | ||
output.to_excel(' | output.to_excel(' | ||
</ | </ | ||
- | \\ | + | |
- | \\ | + | |
==== json을 DataFrame으로 ==== | ==== json을 DataFrame으로 ==== | ||
- | 우선 Archiving과 추후 페이스북 포스팅 효과 분석 등을 위해서 눈으로 볼 수 있는 DataFrame 형식으로 변환을 하고 싶었다.\\ | + | 우선 Archiving과 추후 페이스북 포스팅 효과 분석 등을 위해서 눈으로 볼 수 있는 DataFrame 형식으로 변환을 하고 싶었다. |
하지만 받아오는 json이 아래와 같이 attachments 가 다시 dict 구조로 되어 있기 때문에 일반적인 방법으로는 DataFrame 형식으로 바꾸기 어려워 보였다. | 하지만 받아오는 json이 아래와 같이 attachments 가 다시 dict 구조로 되어 있기 때문에 일반적인 방법으로는 DataFrame 형식으로 바꾸기 어려워 보였다. | ||
Line 104: | Line 101: | ||
)} | )} | ||
</ | </ | ||
- | \\ | + | |
- | \\ | + | |
그래서 recursion을 이용해서 nested json 형식을 DataFrame으로 바꿀 수 있도록 11번 라인의 nested_json 함수를 다음과 같이 만들어 보았다. | 그래서 recursion을 이용해서 nested json 형식을 DataFrame으로 바꿀 수 있도록 11번 라인의 nested_json 함수를 다음과 같이 만들어 보았다. | ||
<code python> | <code python> | ||
Line 123: | Line 120: | ||
return df_out | return df_out | ||
</ | </ | ||
- | \\ | + | |
- | nested_json 에서 데이터의 리스트 element 하나(DataFrame에서 한 행이 될 부분)에 대해서 nested_json_row 를 실행해서 DataFrame을 만들게 된다.\\ | + | nested_json 에서 데이터의 리스트 element 하나(DataFrame에서 한 행이 될 부분)에 대해서 nested_json_row 를 실행해서 DataFrame을 만들게 된다. |
- | \\ | + | |
- | nested_json_row 에서는 아래와 같이 dict나 list가 아닌 ' | + | nested_json_row 에서는 아래와 같이 dict나 list가 아닌 ' |
dict일 때는 dict의 값을 컬럼명으로, | dict일 때는 dict의 값을 컬럼명으로, | ||
- | \\ | + | |
- | \\ | + | |
<code python; highlight: [5-6, | <code python; highlight: [5-6, | ||
def nested_json_row(dict_data): | def nested_json_row(dict_data): | ||
Line 147: | Line 144: | ||
return out | return out | ||
</ | </ | ||
- | \\ | + | |
- | \\ | + | |
엑셀로 저장해서 보면, 컬럼명이 다음과 같이 잘 들어간 것을 볼 수 있다. | 엑셀로 저장해서 보면, 컬럼명이 다음과 같이 잘 들어간 것을 볼 수 있다. | ||
- | {{:blogs: | + | {{blog: |
- | \\ | ||
===== wiki문법으로 변환 ===== | ===== wiki문법으로 변환 ===== | ||
- | 데이터들을 사용가능하도록 정리하고, | + | 데이터들을 사용가능하도록 정리하고, |
- | 본 사이트는 [[https:// | + | 본 사이트는 [[https:// |
- | \\ | + | |
- | 아래 코드에서 wiki 문법을 HTML 이나 Markdown 문법 등으로 수정해서 사용하면 다른 곳에서도 사용할 수 있을 것이다. | + | 아래 코드에서 wiki 문법을 HTML 이나 Markdown 문법 등으로 수정해서 사용하면 다른 곳에서도 사용할 수 있을 것이다. |
- | \\ | + | |
==== 기본정보 처리 ==== | ==== 기본정보 처리 ==== | ||
Line 195: | Line 192: | ||
* type : 포스팅 종류 (link, picutre, video 등) | * type : 포스팅 종류 (link, picutre, video 등) | ||
- | \\ | + | |
- | \\ | + | |
==== Image 처리 ==== | ==== Image 처리 ==== | ||
- | API를 통해서 정보는 original URL이 아닌, Facebook CDN 서버를 통하는 URL로 제공.\\ | + | API를 통해서 정보는 original URL이 아닌, Facebook CDN 서버를 통하는 URL로 제공. |
이 이미지 URL은 다음의 두 가지 경우가 존재한다. | 이 이미지 URL은 다음의 두 가지 경우가 존재한다. | ||
- Facebook 내부 이미지(line3) : '' | - Facebook 내부 이미지(line3) : '' | ||
- 외부 이미지(line6~) : '' | - 외부 이미지(line6~) : '' | ||
여기에 몇가지 예외 처리를 추가하여 다음과 같이 이미지 URL 을 추출하였다. | 여기에 몇가지 예외 처리를 추가하여 다음과 같이 이미지 URL 을 추출하였다. | ||
- | \\ | + | |
<code python> | <code python> | ||
# image 처리 ################ | # image 처리 ################ | ||
Line 221: | Line 218: | ||
</ | </ | ||
- | \\ | + | |
- | 그리고 아래와 같이 '' | + | 그리고 아래와 같이 '' |
Archiving을 위한, | Archiving을 위한, | ||
- 이미지를 다운로드 | - 이미지를 다운로드 | ||
Line 233: | Line 230: | ||
con[' | con[' | ||
</ | </ | ||
- | \\ | + | |
- | \\ | + | |
==== 기타 처리 ==== | ==== 기타 처리 ==== | ||
* 포스팅의 대표 링크는 페이스북에서 보이는 것처럼 도메인 이름만 추출하도록 하고, | * 포스팅의 대표 링크는 페이스북에서 보이는 것처럼 도메인 이름만 추출하도록 하고, | ||
* message 내에 있는 링크가 길이가 길 때는 말 줄임표로 줄이도록 하고. | * message 내에 있는 링크가 길이가 길 때는 말 줄임표로 줄이도록 하고. | ||
- | * 또한 참고로 dokuwiki문법 적용시 개행을 의미하는 '\\'가 f-string에서는 적용되지 않기 때문에 따로 처리하였다. | + | * 또한 참고로 dokuwiki문법 적용시 개행을 의미하는 '' |
<code python> | <code python> | ||
con[' | con[' | ||
Line 249: | Line 246: | ||
con[' | con[' | ||
- | con[' | + | con[' |
</ | </ | ||
- | \\ | + | |
- | \\ | + | |
==== 날짜 처리 및 Template 완성 ==== | ==== 날짜 처리 및 Template 완성 ==== | ||
- | API를 통해서 제공하는 날짜 정보는 모두 [[https:// | + | API를 통해서 제공하는 날짜 정보는 모두 [[https:// |
- | 한국은 UTC+9 시간이기 때문에 아래와 같이 timezone 라이브러리를 이용하여 변환해주는 작업이 필요하다.\\ | + | 한국은 UTC+9 시간이기 때문에 아래와 같이 timezone 라이브러리를 이용하여 변환해주는 작업이 필요하다. |
<code python> | <code python> | ||
Line 270: | Line 267: | ||
</ | </ | ||
- | \\ | + | |
지금까지 작업을 바탕으로 아래처럼 각 포스팅별로 wiki문법을 적용한 Template을 만들었다. | 지금까지 작업을 바탕으로 아래처럼 각 포스팅별로 wiki문법을 적용한 Template을 만들었다. | ||
- | \\ | + | |
<code python> | <code python> | ||
content = f""" | content = f""" | ||
=== {con[' | === {con[' | ||
- | | {con[' | + | | {con[' |
- | \\\\ | + | |
{con[' | {con[' | ||
> <wrap group> | > <wrap group> | ||
Line 284: | Line 281: | ||
</ | </ | ||
<wrap column> | <wrap column> | ||
- | {con[' | + | {con[' |
{con[' | {con[' | ||
</ | </ | ||
Line 294: | Line 291: | ||
# END of for ################################## | # END of for ################################## | ||
</ | </ | ||
- | \\ | + | |
- | \\ | + | |
지금까지 for loop 를 통해서 각 포스팅 들을 만들었고, | 지금까지 for loop 를 통해서 각 포스팅 들을 만들었고, | ||
- | \\ | + | |
<code python; highlight: [1]> | <code python; highlight: [1]> | ||
iframe = " | iframe = " | ||
Line 321: | Line 318: | ||
f.close() | f.close() | ||
</ | </ | ||
- | \\ | + | |
- | \\ | + | |
===== 추후 작업 / 다음 편 ===== | ===== 추후 작업 / 다음 편 ===== | ||
- | [[blogs: | + | [[blog: |
- Image 처리부분에서 호출한 get_images 함수 부분 : Image 다운로드, | - Image 처리부분에서 호출한 get_images 함수 부분 : Image 다운로드, | ||
- FTP 를 통한 Image 업로드 | - FTP 를 통한 Image 업로드 | ||
- txt파일로 저장한 글로 웹 상의 문서 생성/ | - txt파일로 저장한 글로 웹 상의 문서 생성/ | ||
을 설명하도록 하겠다. | 을 설명하도록 하겠다. | ||
- | \\ | ||
- | \\ | ||
- | 또한, [[blogs: | ||
- | \\ | + | |
- | \\ | + | 또한, [[blog: |
+ | |||
+ | |||