이번 글 개요
이번 시간에는 여러 개의 프록시 주소가 들어 있는 파일을 불러와서,requests
모듈을 사용하여 실제로 접속이 가능한(유효한)
프록시들만 골라내는 방법에 대해 알아보겠습니다. 프록시 서버를 사용할 때, 해당 주소가 정말로 동작하는지 한 번에 확인하기 어렵잖아요. queue
와 threading
을 활용해 프록시 유효성 검사를 빠르게 처리해 보는 코드를 보여 드릴게요.
1. 프로젝트 준비, 라이브러리 설치
먼저, 파이썬에서 필요한 라이브러리들이 있습니다.
- requests : HTTP 요청을 날리는 데 필요한 라이브러리
- queue : 여러 스레드가 동시에 데이터를 꺼내 쓸 수 있도록 도와주는 자료구조
- threading : 멀티 스레드를 구현하기 위한 라이브러리
이 코드는 비교적 간단한 예제이기 때문에 따로 pip install
할 패키지는 없지만,requests
가 설치되어 있지 않다면 아래 명령어로 설치해 주세요.
pip install requests
2. 코드 개요 설명
영상보면서 따라 만들어보기
무료 프록시 리스트는 https://free-proxy-list.net/ 에서 가져왔습니다 !
이번에 만들어 볼 코드는 다음과 같은 순서로 진행됩니다.
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가 정상작동하는지 확인하고 싶다면 아래 글에서 소스코드를 다운받아보세요 !
만약 테스트용으로 넣어 둔 주소가 다 죽어 있다면 아무것도 출력이 없을 수도 있고,
서너 개 정도만 살아 있다면 그 주소만 출력이 될 거예요.
추가로, "Done"
이라는 메시지가 스레드별로 찍힐 텐데,
이건 각각의 스레드가 큐 안에 있는 프록시를 모두 확인했을 때
나오는 메시지입니다. 모든 스레드가 순서대로 "Done"
을 표시한 뒤
메인 스레드에서 thread.join()
을 통해 다 끝날 때까지 기다린 후 종료됩니다.
6. 마무리
오늘은 여러 프록시 주소 중
실제로 연결 가능한 주소만 골라내는 간단한 코드를 살펴봤습니다.
실제 실무나 개인 프로젝트에서 대량의 프록시를 활용할 때,
이렇게 큐와 멀티 스레드를 사용하면 한결 빠르게 필터링해 낼 수 있으니
꼭 활용해 보시면 좋을 것 같습니다.
궁금하신 점이나 코드가 잘 안 돌아가는 부분이 있다면
댓글로 질문 남겨 주세요. 감사합니다!
'Python Requests 기초 강의' 카테고리의 다른 글
[파이썬] proxy python requests - [4강/소스코드] (0) | 2025.01.07 |
---|---|
get cookie selenium python, requests 기초강의 3강 소스코드 (0) | 2025.01.06 |
셀레니움(Selenium) 쿠키를 활용해 requests 쿠키값으로 사용하는 방법 (0) | 2025.01.06 |
Python Requests Session 사용법, 속도와 효율 모두 잡기 (0) | 2025.01.04 |
Python requests 기초 강의 proxy server 사용하는 방법 [2강/2025년] (0) | 2024.12.31 |