본문 바로가기
Python Requests 기초 강의

파이썬 유효한 프록시 리스트 확인하는 방법 [requests proxy/5강]

by 파이썬코딩대학 2025. 1. 7.

 

python valid proxy check

이번 글 개요

이번 시간에는 여러 개의 프록시 주소가 들어 있는 파일을 불러와서,requests 모듈을 사용하여 실제로 접속이 가능한(유효한)
프록시들만 골라내는 방법에 대해 알아보겠습니다. 프록시 서버를 사용할 때, 해당 주소가 정말로 동작하는지 한 번에 확인하기 어렵잖아요. queuethreading을 활용해 프록시 유효성 검사를 빠르게 처리해 보는 코드를 보여 드릴게요.


 

파이썬 프록시 리스트 확인하기
핵심 코드 부분입니다. 쓰레드로 병렬적으로 확인해주는게 Key Point

 

1. 프로젝트 준비, 라이브러리 설치 

먼저, 파이썬에서 필요한 라이브러리들이 있습니다.

  • requests : HTTP 요청을 날리는 데 필요한 라이브러리
  • queue : 여러 스레드가 동시에 데이터를 꺼내 쓸 수 있도록 도와주는 자료구조
  • threading : 멀티 스레드를 구현하기 위한 라이브러리

이 코드는 비교적 간단한 예제이기 때문에 따로 pip install 할 패키지는 없지만,
requests가 설치되어 있지 않다면 아래 명령어로 설치해 주세요.

pip install requests

2. 코드 개요 설명

영상보면서 따라 만들어보기

 

 

 

무료 프록시 리스트는 https://free-proxy-list.net/ 에서 가져왔습니다 !

python free proxy list

 

 

이번에 만들어 볼 코드는 다음과 같은 순서로 진행됩니다.

 

1) 프록시 목록 불러오기:

  • proxy_list.txt(여기서는 예시로 05_proxy_list.txt) 파일에서
    프록시 주소들을 한 줄씩 읽어 옵니다.

2) 큐 생성 후, 목록 추가:

  • 읽어 온 프록시 주소들을 queue.Queue() 객체에 차곡차곡 넣어 둡니다.

3) 멀티 스레드 실행:

  • 한 번에 여러 스레드가 각자 큐에서 프록시 주소를 하나씩 꺼내서
    정상 동작 여부를 확인합니다.

4) 모든 스레드 종료 대기:

  • 모든 스레드가 작동을 마칠 때까지 기다린 뒤 종료시킵니다.

이렇게 하면 프록시 주소가 100개든, 1000개든,
동시에 여러 스레드가 확인 작업을 해 주기 때문에 한결 빠르고 편리하게
유효한 프록시만 선별할 수 있게 됩니다.


3. 소스코드 원문

아래는 예시 코드입니다. proxy_list.txt 대신
05_proxy_list.txt 라는 파일을 사용하고 있고,
그 안에는 IP:PORT 형태의 프록시 주소들이 한 줄씩 적혀 있다고 가정할게요.

import queue
import threading
import requests

def load_proxies_from_file(filename):
    with open(filename, "r") as f:
        return [line.strip() for line in f if line.strip()]

def check_proxy_in_queue():
    global proxy_queue
    while not proxy_queue.empty():
        proxy_address = proxy_queue.get()
        try:
            # 실제로 확인할 URL
            url_to_check = "https://google.com"
            # 요청에 사용할 프록시 설정
            proxy_dict = {"http": proxy_address, "https": proxy_address}
            # 예시 User-Agent 헤더
            headers = {
                "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) "
                              "AppleWebKit/537.36 (KHTML, like Gecko) "
                              "Chrome/114.0.0.0 Safari/537.36"
            }
            # 실제로 요청 보내기
            response = requests.get(url_to_check, proxies=proxy_dict, headers=headers, timeout=5)
            response.raise_for_status()

            # 상태 코드가 200이면 유효한 프록시로 간주
            if response.status_code == 200 and response.ok:
                print(proxy_address)

        except Exception as e:
            # 문제가 생기면 넘어감
            continue

    print("Done")

# 1) proxy_list.txt 파일에서 프록시 목록 불러오기
proxy_list = load_proxies_from_file("05_proxy_list.txt")

# 2) 큐 생성 후, 프록시 목록을 큐에 저장
proxy_queue = queue.Queue()
for proxy in proxy_list:
    proxy_queue.put(proxy)

# 3) 스레드 여러 개 실행
num_threads = 30
threads = []
for _ in range(num_threads):
    thread = threading.Thread(target=check_proxy_in_queue)
    thread.start()
    threads.append(thread)

# 4) 모든 스레드가 끝날 때까지 대기
for thread in threads:
    thread.join()

4. 코드 해석 포인트

load_proxies_from_file()

  • 파일을 열어서, 한 줄씩 읽은 뒤 공백을 제거(strip())해서 리스트로 반환합니다.
  • 여기에 프록시 주소가 IP:PORT 형태로 적혀 있다고 가정해 주세요.

check_proxy_in_queue()

  • 전역 변수로 선언된 proxy_queue에서, 스레드가 동시에 하나씩 프록시 주소를 꺼냅니다.
  • requests.get() 메서드에 proxies 파라미터를 전달해서
    해당 프록시 주소가 실제로 응답을 보내주는지 확인해 봅니다.
  • 5초(timeout=5) 안에 응답이 없거나 에러가 발생하면 Exception에서 잡혀서
    그냥 넘어가도록(continue) 했습니다.
  • 만약 상태 코드가 200이라면 해당 프록시 주소를 print()합니다.
  • 모든 주소를 확인하면 "Done" 메시지가 출력하게 됩니다.

스레드 개수(num_threads)

  • 기본적으로 30개 정도의 스레드를 사용해 보았습니다.
  • 너무 많은 스레드를 사용하면 오히려 자원이 부족해져서 느려질 수 있으니
    적당한 수로 설정하는 것이 좋습니다.

5. 실행 결과 확인

코드를 실행하면, 유효한 프록시 주소들만 터미널(혹은 콘솔)에
줄줄이 출력됩니다.

 

이렇게 출력된 Proxy가 정상작동하는지 확인하고 싶다면 아래 글에서 소스코드를 다운받아보세요 !

 

[파이썬] proxy python requests - [4강/소스코드]

Python에서 프록시를 사용하는 방법   아래 코드는 Python에서 프록시(Proxy) 서버를 통해 HTTP GET 요청을 보내는 가장 기본적인 예시입니다.프록시 서버를 처음 들어보신다면, “내가 요청을 직접

pythoncodinguniversity.tistory.com

 


만약 테스트용으로 넣어 둔 주소가 다 죽어 있다면 아무것도 출력이 없을 수도 있고,
서너 개 정도만 살아 있다면 그 주소만 출력이 될 거예요.

추가로, "Done"이라는 메시지가 스레드별로 찍힐 텐데,
이건 각각의 스레드가 큐 안에 있는 프록시를 모두 확인했을 때
나오는 메시지입니다. 모든 스레드가 순서대로 "Done"을 표시한 뒤
메인 스레드에서 thread.join()을 통해 다 끝날 때까지 기다린 후 종료됩니다.


6. 마무리

오늘은 여러 프록시 주소 중
실제로 연결 가능한 주소만 골라내는 간단한 코드를 살펴봤습니다.
실제 실무나 개인 프로젝트에서 대량의 프록시를 활용할 때,
이렇게 큐와 멀티 스레드를 사용하면 한결 빠르게 필터링해 낼 수 있으니
꼭 활용해 보시면 좋을 것 같습니다.

 

궁금하신 점이나 코드가 잘 안 돌아가는 부분이 있다면
댓글로 질문 남겨 주세요. 감사합니다!