[ERROR] Failed to fetch YouTube subscribers for squedney: [SSL] record layer failure (_ssl.c:2570)
youtube 구독자를 불러오는데 이런 에러가 계속 발생했다. 처음 보는 에러라 해결하려고 해봤지만,, 해결 불가능ㅠㅠ GPT의 힘을 빌려보기 위해서 질문했는데
SSL 문제 해결
[SSL] record layer failure (_ssl.c:2570) 에러는 SSL 연결을 설정할 때 발생하는 오류입니다. 이미 몇 가지 해결 방법을 제시했지만, 여전히 문제가 발생하고 있다면 SSL 인증서를 우회하거나 다른 방법을 시도할 수 있습니다.
1) SSL 인증서 우회
아래와 같이 requests와 google-api의 SSL 인증서를 우회하도록 코드를 수정할 수 있습니다:
import ssl
import requests
# SSL 인증서 우회 (전체 코드에서 적용)
ssl._create_default_https_context = ssl._create_unverified_context
def send_slack_message(message):
payload = {"text": message}
try:
response = requests.post(SLACK_WEBHOOK_URL, json=payload, verify=False) # SSL 인증 우회
if response.status_code != 200:
print(f"Error sending message to Slack: {response.status_code}")
else:
print("Message sent to Slack successfully.")
except Exception as e:
print(f"Failed to send message to Slack: {e}")
위 코드는 requests와 google-api 클라이언트 모두에 SSL 우회를 적용하여 인증서 문제를 피할 수 있도록 합니다.
2) requests와 google-api SSL 설정 수정
또한 google-api 클라이언트에서 SSL 오류를 피하기 위해 다음 코드를 사용하여 SSL을 우회할 수 있습니다:
import ssl
# SSL 인증서 우회
ssl._create_default_https_context = ssl._create_unverified_context
# YouTube API 호출 부분
request = youtube.search().list(part="snippet", q=handle, order='relevance', maxResults=5)
response = request.execute()
계속 이렇게만 말하는게 아니겠는가 ...
하라는대로 했는데 문제 해결은 커녕 계속 같은 문제가 반복되었다.
심지어 새로운 에러 발생ㅠㅠ
Python(32365,0x16c40b000) malloc: double free for ptr 0x12e29fa00
Python(32365,0x16c40b000) malloc: *** set a breakpoint in malloc_error_break to debug
"코드를 찬찬히 읽어보자!" 하고 코드를 읽어보다가 갑자기 머릿속을 스쳐가는 생각
if __name__ == "__main__":
ids = get_ids_from_notion()
with ThreadPoolExecutor(max_workers=1) as executor:
# for entry in ids["Instagram"]:
# executor.submit(get_instagram_followers, entry["id"])
for entry in ids["YouTube"]:
executor.submit(get_youtube_followers, entry["id"])
for entry in ids["TikTok"]:
executor.submit(get_tiktok_followers, entry["id"])
print("[INFO] 프로그램 종료.")
팔로워를 자동으로 크롤링해서 업데이트 해주는 프로그램을 만들고 있었는데, 노션 DB 저장되어있는 인플루언서만 거의 4만명 ..? 이들을 다 크롤링 하려면 시간이 너무너무 오래걸려서 멀티스레드 방식을 선택했었다.
찾아보니
1. 공유 자원에 대한 경쟁
멀티스레드를 사용할 때, 여러 스레드가 동일한 자원(예: 메모리, 네트워크 연결 등)을 동시에 접근하려고 할 때 충돌이 발생할 수 있습니다. 이는 메모리 할당 문제나 네트워크 요청에서 발생할 수 있는 malloc 오류와 관련이 있을 수 있습니다.
2. 네트워크 연결 문제
멀티스레드에서 동시에 여러 개의 네트워크 요청을 보내면, 요청들이 서버에서 처리되지 않거나 네트워크 제한에 걸려 SSL 오류가 발생할 수 있습니다. 이 경우, 서버가 동시에 많은 요청을 처리하는데 문제가 생겨 “SSL record layer failure” 오류나 “EOF occurred in violation of protocol” 오류가 발생할 수 있습니다.
3. ThreadPoolExecutor와 Google API
ThreadPoolExecutor를 사용할 때 googleapiclient와 같은 외부 라이브러리가 멀티스레딩을 잘 지원하지 않는 경우가 있습니다. 라이브러리에서 멀티스레드를 처리하는 방식이 적절하지 않으면, 요청을 동시에 처리하면서 문제가 발생할 수 있습니다.
멀티스레드를 사용해서 에러가 발생할 수 있다는게 말이 되는 것이다!!!
스레드 수를 제한하면 출돌을 줄일 수 있다는 말에 max_workers=5 대신 max_workers=2로 줄여보았는데, 에러가 거짓말처럼 사라졌다. 완전히 다 사라진 것은 아니고 절반으로 줄었길래, 아예 멀티스레드를 사용하지 않도록 코드를 다시 수정하고 실행시켰더니 잘 작동되었다ㅠㅠ
TikTok, Instagram 에 비해 Youtube 인플루언서는 정말정말 적었기에, Youtube는 멀티스레드를 사용하지 않고, 순차 처리하게 코드를 수정했다.
if __name__ == "__main__":
ids = get_ids_from_notion()
# Instagram과 TikTok은 멀티스레드 처리
with ThreadPoolExecutor(max_workers=5) as executor:
# Instagram과 TikTok 처리
for entry in ids["Instagram"]:
executor.submit(get_instagram_followers, entry["id"])
for entry in ids["TikTok"]:
executor.submit(get_tiktok_followers, entry["id"])
# YouTube는 순차 처리
for entry in ids["YouTube"]:
get_youtube_followers(entry["id"]) # YouTube만 순차 처리
print("[INFO] 프로그램 종료.")
ㅠㅠ 아무도 날 도와줄 수 있는 사람은 없었지만 ,, 혼자 해결했을 때의 쾌감이란 ,,
그리고 너무 뿌듯했다. 인턴 생활하면서 배우는게 너무너무 많아서 너무 좋다!