Python3 크롤러에서는 프록시 사용이 IP 차단을 방지하거나 크롤링 속도를 높이는 일반적인 방법이며, 주로 여러 IP 주소로 접근하는 상황을 시뮬레이션하는 데 사용됩니다. 프록시는 무료 프록시와 유료 프록시로 나눌 수 있는데, 무료 프록시는 불안정하고 유료 프록시는 상대적으로 더 안정적이고 신뢰할 수 있습니다.
다음은 Python3 크롤러 프록시의 사용 시나리오와 활용 예시입니다:
IP 차단 방지: 일부 웹사이트는 IP 접근 빈도 제한을 두고 있으며, 방문 횟수가 제한을 넘으면 해당 IP의 웹사이트 접근을 금지합니다. 프록시를 사용하면 이러한 상황을 피할 수 있습니다.
크롤링 속도 향상: 프록시를 사용하면 동시에 여러 연결을 만들 수 있어 목표 데이터를 빠르게 수집할 수 있습니다.
지역 제한 우회: 일부 웹사이트는 지역에 따라 제공하는 서비스가 다릅니다. 특정 지역에만 공개된 웹사이트에 접근해야 한다면 프록시를 사용해 이러한 제한을 우회하고 필요한 데이터를 얻을 수 있습니다.
요약하면, 프록시 IP는 Python3 크롤러에서 매우 중요한 역할을 합니다. 다만 프록시 사용은 일부 보안 문제를 동반할 수 있으므로, 사용할 때는 적절한 프록시 서비스 제공업체를 선택하고 네트워크 보안 규정을 엄격히 준수해야 합니다.
준비 작업
먼저 사용 가능한 프록시를 하나 확보해야 합니다. 프록시는 IP 주소와 포트의 조합으로, 즉 ip:포트 형식입니다. 프록시에 인증이 필요하다면 사용자 이름과 비밀번호 정보 두 가지를 추가로 입력해야 합니다.
여기서는 제 로컬 컴퓨터에 프록시 소프트웨어가 설치되어 있으며, 이 소프트웨어는 로컬 7890 포트에 HTTP 프록시 서비스, 즉 127.0.0.1:7890 프록시를 생성합니다. 또한 이 소프트웨어는 7891 포트에 SOCKS 프록시 서비스, 즉 127.0.0.1:7891 프록시도 생성합니다. 따라서 이 프록시를 설정하기만 하면 로컬 IP를 프록시 소프트웨어가 연결한 서버의 IP로 성공적으로 전환할 수 있습니다.
이 장의 아래 예제에서는 위에서 언급한 프록시를 사용해 설정 방법을 시연하겠습니다. 물론 자신의 사용 가능한 프록시로 바꿔서 사용해도 됩니다.
프록시를 설정한 뒤 테스트할 URL은 http://httpbin.org/get 입니다. 이 링크에 접속하면 요청 관련 정보를 확인할 수 있으며, 반환 결과의 origin 필드가 바로 클라이언트의 IP입니다. 이를 기준으로 프록시가 성공적으로 설정되었는지, 즉 IP가 제대로 위장되었는지 판단할 수 있습니다.
좋습니다. 이제 각 요청 라이브러리의 프록시 설정 방법을 살펴보겠습니다.
Python3 크롤러 프록시 구하기
일부 웹사이트는 자사 데이터에 대한 빈번한 접근을 감지하고 이를 차단하는 조치를 취합니다. 프록시 서버를 사용하면 접속 출처를 분산시켜 탐지 가능성을 줄이고, 그에 따라 크롤링 성공률을 높일 수 있습니다.
최고의 미국 정적 프록시 IP
IPRoyal은 중국 지역에 매우 친화적인 프록시 서비스 제공업체이며, 그 주거용 프록시 솔루션은 매우 매력적입니다.
IPRoyal 보기
가장 저렴한 고정 프록시
Proxy-seller는 많은 소규모 인터넷 마케터들에게 인기가 있는 데이터센터 프록시 제공업체입니다.
Proxy-seller 보기
가장 가성비 좋은 고정 프록시
Shifter.io는 사용자에게 개인정보 보호와 더 나은 인터넷 경험을 제공하는 것을 목표로 하는 잘 알려진 프록시 서비스 제공업체입니다.
Shifter.io 보기
2. urllib
먼저 가장 기본적인 urllib를 예로 들어 프록시 설정 방법을 살펴보겠습니다. 코드는 다음과 같습니다:
from urllib.error import URLError
from urllib.request import ProxyHandler, build_opener
proxy = '127.0.0.1:7890'
proxy_handler = ProxyHandler({
'http': 'http://' + proxy,
'https': 'http://' + proxy
})
opener = build_opener(proxy_handler)
try:
response = opener.open('https://httpbin.org/get')
print(response.read().decode('utf-8'))
except URLError as e:
print(e.reason)
실행 결과는 다음과 같습니다:
{
"args": {},
"headers": {
"Accept-Encoding": "identity",
"Host": "httpbin.org",
"User-Agent": "Python-urllib/3.7",
"X-Amzn-Trace-Id": "Root=1-60e9a1b6-0a20b8a678844a0b2ab4e889"
},
"origin": "210.173.1.204",
"url": "https://httpbin.org/get"
}
여기서는 ProxyHandler를 사용해 프록시를 설정해야 하며, 파라미터는 딕셔너리 타입입니다. 키 이름은 프로토콜 종류이고 값은 프록시입니다. 주의할 점은 프록시 앞에 프로토콜을 붙여야 한다는 것으로, 즉 http:// 또는 https://입니다. 요청한 링크가 HTTP 프로토콜일 때는 http 키에 해당하는 프록시를 사용하고, 요청한 링크가 HTTPS 프로토콜일 때는 https 키에 해당하는 프록시를 사용합니다. 하지만 여기서는 프록시 자체를 HTTP 프로토콜로 설정했으므로 접두사는 모두
http://입니다. 따라서 HTTP든 HTTPS든 어떤 링크에 접근하더라도 우리가 구성한 HTTP 프로토콜 프록시를 사용해 요청하게 됩니다.
ProxyHandler 객체를 만든 뒤에는 build_opener 메서드에 해당 객체를 전달해 Opener를 생성해야 합니다. 이렇게 하면 해당 Opener에 이미 프록시가 설정된 셈입니다. 이어서 Opener 객체의 open 메서드를 직접 호출하면 원하는 링크에 접근할 수 있습니다.
실행 결과는 JSON이며 origin 필드가 클라이언트의 IP를 보여줍니다. 확인해 보면 여기의 IP는 실제 IP가 아니라 프록시의 IP입니다. 이렇게 해서 프록시 설정이 완료되었고 실제 IP도 숨길 수 있습니다.
인증이 필요한 프록시를 만나면 다음과 같은 방법으로 설정할 수 있습니다:
from urllib.error import URLError
from urllib.request import ProxyHandler, build_opener
proxy = 'username:password@127.0.0.1:7890'
proxy_handler = ProxyHandler({
'http': 'http://' + proxy,
'https': 'http://' + proxy
})
opener = build_opener(proxy_handler)
try:
response = opener.open('https://httpbin.org/get')
print(response.read().decode('utf-8'))
except URLError as e:
print(e.reason)
여기서 바뀌는 것은 proxy 변수뿐이며, 프록시 앞에 인증용 사용자 이름과 비밀번호를 추가하면 됩니다. 여기서 username은 사용자 이름, password는 비밀번호입니다. 예를 들어 사용자 이름이 foo이고 비밀번호가 bar라면 프록시는 다음과 같습니다: foo:bar@127.0.0.1:7890。
프록시가 SOCKS5 유형이라면 다음과 같이 프록시를 설정할 수 있습니다:
import socks
import socket
from urllib import request
from urllib.error import URLError
socks.set_default_proxy(socks.SOCKS5, '127.0.0.1', 7891)
socket.socket = socks.socksocket
try:
response = request.urlopen('https://httpbin.org/get')
print(response.read().decode('utf-8'))
except URLError as e:
print(e.reason)
여기에는 socks 모듈이 필요하며, 다음 명령으로 설치할 수 있습니다:
pip3 install PySocks
여기서는 로컬에서 7891 포트로 동작하는 SOCKS5 프록시를 실행해야 하며, 실행에 성공하면 위의 HTTP 프록시 출력 결과와 동일합니다:
{
"args": {},
"headers": {
"Accept-Encoding": "identity",
"Host": "httpbin.org",
"User-Agent": "Python-urllib/3.7",
"X-Amzn-Trace-Id": "Root=1-60e9a1b6-0a20b8a678844a0b2ab4e889"
},
"origin": "210.173.1.204",
"url": "https://httpbin.org/get"
}
결과의 origin 필드 역시 프록시 IP이므로 프록시 설정이 성공한 것입니다.
3. requests의 프록시 설정
requests의 경우 프록시 설정은 매우 간단하며, proxies 파라미터만 전달하면 됩니다.
여기서는 제 로컬 프록시를 예로 들어 requests의 HTTP 프록시 설정을 살펴보겠습니다. 코드는 다음과 같습니다:
import requests
proxy = '127.0.0.1:7890'
proxies = {
'http': 'http://' + proxy,
'https': 'http://' + proxy,
}
try:
response = requests.get('https://httpbin.org/get', proxies=proxies)
print(response.text)
except requests.exceptions.ConnectionError as e:
print('Error', e.args)
실행 결과는 다음과 같습니다:
{
"args": {},
"headers": {
"Accept": "*/*",
"Accept-Encoding": "gzip, deflate",
"Host": "httpbin.org",
"User-Agent": "python-requests/2.22.0",
"X-Amzn-Trace-Id": "Root=1-5e8f358d-87913f68a192fb9f87aa0323"
},
"origin": "210.173.1.204",
"url": "https://httpbin.org/get"
}
urllib와 마찬가지로 요청한 링크가 HTTP 프로토콜일 때는 http 키에 해당하는 프록시를 사용하고, 요청한 링크가 HTTPS 프로토콜일 때는 https 키에 해당하는 프록시를 사용합니다. 다만 여기서는 HTTP 프로토콜 프록시를 통일해서 사용했습니다.
실행 결과의 origin 이 프록시 서버의 IP라면 프록시가 제대로 설정된 것입니다.
프록시에 인증이 필요하다면 프록시 앞에 사용자 이름과 비밀번호를 추가하면 되며, 프록시 표기는 다음과 같이 바뀝니다:
proxy = 'username:password@127.0.0.1:7890'
여기서는 username 및 password 만 바꾸면 됩니다.
SOCKS 프록시를 사용해야 한다면 다음과 같이 설정할 수 있습니다:
import requests
proxy = '127.0.0.1:7891'
proxies = {
'http': 'socks5://' + proxy,
'https': 'socks5://' + proxy
}
try:
response = requests.get('https://httpbin.org/get', proxies=proxies)
print(response.text)
except requests.exceptions.ConnectionError as e:
print('Error', e.args)
여기서는 추가로 requests[socks]패키지를 설치해야 하며, 관련 명령은 다음과 같습니다:
pip3 install "requests[socks]"
실행 결과는 완전히 동일합니다:
{
"args": {},
"headers": {
"Accept": "*/*",
"Accept-Encoding": "gzip, deflate",
"Host": "httpbin.org",
"User-Agent": "python-requests/2.22.0",
"X-Amzn-Trace-Id": "Root=1-5e8f364a-589d3cf2500fafd47b5560f2"
},
"origin": "210.173.1.204",
"url": "https://httpbin.org/get"
}
또 다른 설정 방법으로는 socks 모듈을 사용하는 방식이 있으며, 이 경우에도 앞서와 마찬가지로 socks 라이브러리를 설치해야 합니다. 설정 방법은 다음과 같습니다:
import requests
import socks
import socket
socks.set_default_proxy(socks.SOCKS5, '127.0.0.1', 7891)
socket.socket = socks.socksocket
try:
response = requests.get('https://httpbin.org/get')
print(response.text)
except requests.exceptions.ConnectionError as e:
print('Error', e.args)
이 방법으로도 SOCKS 프록시를 설정할 수 있으며, 실행 결과는 완전히 같습니다. 첫 번째 방법과 비교하면 이 방법은 전역 설정입니다. 상황에 따라 서로 다른 방법을 선택하면 됩니다.
4. httpx의 프록시 설정
httpx의 사용법은 requests와 매우 비슷하므로 역시 proxies 파라미터로 프록시를 설정합니다. 하지만 requests와 다른 점은 proxies 파라미터의 키 이름을 더 이상 http 또는 https로 둘 수 없고 http:// 또는 https://로 바꿔야 하며, 나머지 설정은 동일합니다.
HTTP 프록시의 설정 방법은 다음과 같습니다:
import httpx
proxy = '127.0.0.1:7890'
proxies = {
'http://': 'http://' + proxy,
'https://': 'http://' + proxy,
}
with httpx.Client(proxies=proxies) as client:
response = client.get('https://httpbin.org/get')
print(response.text)
인증이 필요한 프록시의 경우에도 proxy 값만 바꾸면 됩니다:
proxy = 'username:password@127.0.0.1:7890'
여기서는 username 및 password 만 바꾸면 됩니다.
실행 결과는 requests를 사용할 때와 비슷하며, 다음과 같습니다:
{
"args": {},
"headers": {
"Accept": "*/*",
"Accept-Encoding": "gzip, deflate",
"Host": "httpbin.org",
"User-Agent": "python-httpx/0.18.1",
"X-Amzn-Trace-Id": "Root=1-60e9a3ef-5527ff6320484f8e46d39834"
},
"origin": "210.173.1.204",
"url": "https://httpbin.org/get"
}
SOCKS 프록시를 사용하려면 httpx-socks 라이브러리를 설치해야 하며, 설치 방법은 다음과 같습니다:
pip3 install "httpx-socks[asyncio]"
이렇게 하면 동기와 비동기 두 가지 모드 지원이 함께 설치됩니다.
동기 모드의 설정 방법은 다음과 같습니다:
import httpx
from httpx_socks import SyncProxyTransport
transport = SyncProxyTransport.from_url(
'socks5://127.0.0.1:7891')
with httpx.Client(transport=transport) as client:
response = client.get('https://httpbin.org/get')
print(response.text)
여기서는 transport 객체를 설정하고 SOCKS 프록시 주소를 구성한 뒤, httpx의 Client 객체를 선언할 때 transport 파라미터를 전달하면 됩니다. 실행 결과는 앞서와 같습니다.
비동기 모드의 설정 방법은 다음과 같습니다:
import httpx
import asyncio
from httpx_socks import AsyncProxyTransport
transport = AsyncProxyTransport.from_url(
'socks5://127.0.0.1:7891')
async def main():
async with httpx.AsyncClient(transport=transport) as client:
response = await client.get('https://httpbin.org/get')
print(response.text)
if __name__ == '__main__':
asyncio.get_event_loop().run_until_complete(main())
동기 모드와 다른 점은 transport 객체로 SyncProxyTransport가 아니라 AsyncProxyTransport를 사용하고, Client 객체도 AsyncClient 객체로 바꿔야 한다는 점뿐입니다. 나머지는 동일하며 실행 결과도 같습니다.
5. Selenium의 프록시 설정
Selenium도 동일하게 프록시를 설정할 수 있으며, 여기서는 Chrome을 예로 들어 설정 방법을 소개하겠습니다.
인증이 없는 프록시는 다음과 같이 설정합니다:
from selenium import webdriver
proxy = '127.0.0.1:7890'
options = webdriver.ChromeOptions()
options.add_argument('--proxy-server=http://' + proxy)
browser = webdriver.Chrome(options=options)
browser.get('https://httpbin.org/get')
print(browser.page_source)
browser.close()
실행 결과는 다음과 같습니다:
{
"args": {},
"headers": {
"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9",
"Accept-Encoding": "gzip, deflate",
"Accept-Language": "zh-CN,zh;q=0.9",
"Host": "httpbin.org",
"Upgrade-Insecure-Requests": "1",
"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.149 Safari/537.36",
"X-Amzn-Trace-Id": "Root=1-5e8f39cd-60930018205fd154a9af39cc"
},
"origin": "210.173.1.204",
"url": "http://httpbin.org/get"
}
프록시 설정이 성공했으며,origin 역시 프록시 IP 주소입니다.
프록시가 인증 프록시라면 설정 방법이 상대적으로 더 복잡하며, 구체적으로는 다음과 같습니다:
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
import zipfile
ip = '127.0.0.1'
port = 7890
username = 'foo'
password = 'bar'
manifest_json = """{"version":"1.0.0","manifest_version": 2,"name":"Chrome Proxy","permissions": ["proxy","tabs","unlimitedStorage","storage","<all_urls>","webRequest","webRequestBlocking"],"background": {"scripts": ["background.js"]
}
}
"""
background_js = """
var config = {
mode: "fixed_servers",
rules: {
singleProxy: {
scheme: "http",
host: "%(ip) s",
port: %(port) s
}
}
}
chrome.proxy.settings.set({value: config, scope: "regular"}, function() {});
function callbackFn(details) {
return {
authCredentials: {username: "%(username) s",
password: "%(password) s"
}
}
}
chrome.webRequest.onAuthRequired.addListener(
callbackFn,
{urls: ["<all_urls>"]},
['blocking']
)
""" % {'ip': ip, 'port': port, 'username': username, 'password': password}
plugin_file = 'proxy_auth_plugin.zip'
with zipfile.ZipFile(plugin_file, 'w') as zp:
zp.writestr("manifest.json", manifest_json)
zp.writestr("background.js", background_js)
options = Options()
options.add_argument("--start-maximized")
options.add_extension(plugin_file)
browser = webdriver.Chrome(options=options)
browser.get('https://httpbin.org/get')
print(browser.page_source)
browser.close()
여기서는 인증 프록시를 설정하기 위해 로컬에 manifest.json 구성 파일과 background.js 스크립트를 만들어야 합니다. 코드를 실행하면 현재 구성을 저장하는 proxy_auth_plugin.zip 파일이 로컬에 생성됩니다.
실행 결과는 앞선 예와 같으며,origin 역시 프록시 IP입니다.
SOCKS 프록시 설정도 비교적 간단하며, 해당 프로토콜을 socks5 로 바꾸면 됩니다. 비밀번호 인증이 없는 프록시 설정 방법은 다음과 같습니다:
from selenium import webdriver
proxy = '127.0.0.1:7891'
options = webdriver.ChromeOptions()
options.add_argument('--proxy-server=socks5://' + proxy)
browser = webdriver.Chrome(options=options)
browser.get('https://httpbin.org/get')
print(browser.page_source)
browser.close()
실행 결과는 같습니다.
6. aiohttp의 프록시 설정
aiohttp의 경우 proxy 파라미터로 직접 설정할 수 있습니다. HTTP 프록시 설정은 다음과 같습니다:
import asyncio
import aiohttp
proxy = 'http://127.0.0.1:7890'
async def main():
async with aiohttp.ClientSession() as session:
async with session.get('https://httpbin.org/get', proxy=proxy) as response:
print(await response.text())
if __name__ == '__main__':
asyncio.get_event_loop().run_until_complete(main())
프록시에 사용자 이름과 비밀번호가 있다면 requests와 마찬가지로 proxy 를 다음과 같이 수정하면 됩니다:
proxy = 'http://username:password@127.0.0.1:7890'
여기서는 username 및 password 만 바꾸면 됩니다.
SOCKS 프록시를 사용하려면 aiohttp-socks 지원 라이브러리를 설치해야 하며, 설치 명령은 다음과 같습니다:
pip3 install aiohttp-socks
이 라이브러리의 ProxyConnector를 이용해 SOCKS 프록시를 설정할 수 있으며, 코드는 다음과 같습니다:
import asyncio
import aiohttp
from aiohttp_socks import ProxyConnector
connector = ProxyConnector.from_url('socks5://127.0.0.1:7891')
async def main():
async with aiohttp.ClientSession(connector=connector) as session:
async with session.get('https://httpbin.org/get') as response:
print(await response.text())
if __name__ == '__main__':
asyncio.get_event_loop().run_until_complete(main())
실행 결과는 같습니다.
또한 이 라이브러리는 SOCKS4, HTTP 프록시 및 해당 프록시 인증 설정도 지원하므로 공식 소개를 참고할 수 있습니다.
7. Pyppeteer의 프록시 설정
Pyppeteer의 경우 기본적으로 Chrome과 유사한 Chromium 브라우저를 사용하므로 설정 방법이 Selenium의 Chrome과 같습니다. 예를 들어 HTTP 비인증 프록시 설정은 모두 args 를 통해 설정하며, 구현은 다음과 같습니다:
import asyncio
from pyppeteer import launch
proxy = '127.0.0.1:7890'
async def main():
browser = await launch({'args': ['--proxy-server=http://' + proxy], 'headless': False})
page = await browser.newPage()
await page.goto('https://httpbin.org/get')
print(await page.content())
await browser.close()
if __name__ == '__main__':
asyncio.get_event_loop().run_until_complete(main())
실행 결과는 다음과 같습니다:
{
"args": {},
"headers": {
"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8",
"Accept-Encoding": "gzip, deflate, br",
"Accept-Language": "zh-CN,zh;q=0.9",
"Host": "httpbin.org",
"Upgrade-Insecure-Requests": "1",
"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3494.0 Safari/537.36",
"X-Amzn-Trace-Id": "Root=1-5e8f442c-12b1ed7865b049007267a66c"
},
"origin": "210.173.1.204",
"url": "https://httpbin.org/get"
}
마찬가지로 설정이 성공한 것을 확인할 수 있습니다.
SOCKS 프록시도 마찬가지로 프로토콜만 socks5 로 바꾸면 되며, 구현 코드는 다음과 같습니다:
import asyncio
from pyppeteer import launch
proxy = '127.0.0.1:7891'
async def main():
browser = await launch({'args': ['--proxy-server=socks5://' + proxy], 'headless': False})
page = await browser.newPage()
await page.goto('https://httpbin.org/get')
print(await page.content())
await browser.close()
if __name__ == '__main__':
asyncio.get_event_loop().run_until_complete(main())
실행 결과도 같습니다.
8. Playwright의 프록시 설정
Selenium과 Pyppeteer에 비해 Playwright는 프록시 설정이 더 편리합니다. 시작할 때 설정할 수 있는 proxy 파라미터가 미리 제공됩니다.
HTTP 프록시는 다음과 같이 설정할 수 있습니다:
from playwright.sync_api import sync_playwright
with sync_playwright() as p:
browser = p.chromium.launch(proxy={
'server': 'http://127.0.0.1:7890'
})
page = browser.new_page()
page.goto('https://httpbin.org/get')
print(page.content())
browser.close()
launch 메서드를 호출할 때 proxy 파라미터를 전달할 수 있는데, 이 값은 딕셔너리입니다. 이 딕셔너리에는 server라는 필수 필드가 있으며, 여기에 HTTP 프록시 주소를 직접 입력하면 됩니다.
실행 결과는 다음과 같습니다:
{
"args": {},
"headers": {
"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9",
"Accept-Encoding": "gzip, deflate, br",
"Accept-Language": "zh-CN,zh;q=0.9",
"Host": "httpbin.org",
"Sec-Ch-Ua": "\" Not A;Brand\";v=\"99\", \"Chromium\";v=\"92\"",
"Sec-Ch-Ua-Mobile": "?0",
"Sec-Fetch-Dest": "document",
"Sec-Fetch-Mode": "navigate",
"Sec-Fetch-Site": "none",
"Sec-Fetch-User": "?1",
"Upgrade-Insecure-Requests": "1",
"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4498.0 Safari/537.36",
"X-Amzn-Trace-Id": "Root=1-60e99eef-4fa746a01a38abd469ecb467"
},
"origin": "210.173.1.204",
"url": "https://httpbin.org/get"
}
SOCKS 프록시도 설정 방법은 완전히 동일하며, server 필드 값만 SOCKS 프록시 주소로 바꾸면 됩니다:
from playwright.sync_api import sync_playwright
with sync_playwright() as p:
browser = p.chromium.launch(proxy={
'server': 'socks5://127.0.0.1:7891'
})
page = browser.new_page()
page.goto('https://httpbin.org/get')
print(page.content())
browser.close()
실행 결과는 방금 전과 완전히 같습니다.
사용자 이름과 비밀번호가 있는 프록시의 경우에도 Playwright 설정은 매우 간단합니다. proxy 파라미터에 username과 password 필드를 추가로 설정하면 됩니다. 예를 들어 사용자 이름과 비밀번호가 각각 foo와 bar라면 설정 방법은 다음과 같습니다:
from playwright.sync_api import sync_playwright
with sync_playwright() as p:
browser = p.chromium.launch(proxy={
'server': 'http://127.0.0.1:7890',
'username': 'foo',
'password': 'bar'
})
page = browser.new_page()
page.goto('https://httpbin.org/get')
print(page.content())
browser.close()
이렇게 하면 Playwright에서 인증 프록시를 매우 손쉽게 설정할 수 있습니다.
9. 요약
이상으로 각 요청 라이브러리의 프록시 사용 방법을 정리했습니다. 각 라이브러리의 설정 방식은 대체로 비슷하므로, 이 방법들을 익혀 두면 앞으로 IP 차단 문제가 생겼을 때 프록시를 추가하는 방식으로 쉽게 해결할 수 있습니다.
서로 다른 지리적 위치에 있는 프록시 서버를 사용하면 서로 다른 지역에서 크롤링하는 상황을 시뮬레이션하고 특정 지역의 데이터를 얻을 수 있습니다. 이는 지역 관련 데이터를 수집해야 하는 작업에 매우 유용합니다. 프록시 서버를 사용하면 크롤러의 실제 IP 주소를 숨겨 웹사이트의 차단이나 요청 빈도 제한을 피할 수 있습니다. 이는 개인정보와 보안을 보호하는 데도 도움이 됩니다. 일부 웹사이트는 동일한 IP 주소에서 너무 많은 요청이 오는 것을 식별하고 차단해 크롤러를 막습니다. 프록시 서버를 사용하면 이러한 안티 크롤링 메커니즘을 우회하여 더 빠른 속도와 더 높은 성공률로 데이터를 수집할 수 있습니다.