본문 바로가기
Programming/Python

requests - 프록시 서버 이용

by NAMP 2020. 9. 16.

requests 사용

requests 를 사용하여 웹페이지 정보를 가져온다.

import requests

resp = requests.get(url)

헤더 정보 추가

headers = {
    "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.100 Safari/537.36",
    "content-type": "application/json",
}
resp = requests.get(url, headers=headers)

프록시 사용

resp = requests.get(url, proxies=proxies)

"https://free-proxy-list.net/" 에서 제공하는 정보를 활용하여 프록시 서버 설정

필요에 따라 Https 를 지원하는 서버 목록만을 가져온다.

import requests
from scrapy import Selector

proxy_url = "https://free-proxy-list.net/"

resp = requests.get(proxy_url)
sel = Selector(resp)
tr_list = sel.xpath('//*[@id="proxylisttable"]/tbody/tr')

proxy_server_list = []

for tr in tr_list:
    ip = tr.xpath("td[1]/text()").extract_first()
    port = tr.xpath("td[2]/text()").extract_first()
    https = tr.xpath("td[7]/text()").extract_first()

    if https == "yes":
        server = f"{ip}:{port}"
        proxy_server_list.append(server)

proxy_server_list 를 사용하여 proxy를 설정한 requests를 요청한다.

from random import choice

proxy_server = choice(proxy_server_list)
proxies = {"http": proxy_server, 'https': proxy_server}

resp = requests.get(url, headers=headers, proxies=proxies)

해외 프록시를 사용하는 경우 응답이 늦을 수 있으니, 추가적으로 timeout 설정도 할 수 있다.

resp = requests.get(url, headers=headers, proxies=proxies, timeout=3)

요청이 실패하면, 프록시 목록에서 삭제한다.

import requests
from requests.exceptions import ProxyError, SSLError, ConnectTimeout

try:
    resp = requests.get(url, headers=headers, proxies=proxies, timeout=3)
except (ProxyError, SSLError, ConnectTimeout) as e:       
    proxy_server_list.remove(proxy_server)

프록시가 실패하면 다음 프록시를 사용하도록 변경

def get_proxy_list():
    proxy_url = "https://free-proxy-list.net/"

    response = requests.get(proxy_url)
    selector = Selector(response)
    tr_list = selector.xpath('//*[@id="proxylisttable"]/tbody/tr')

    server_list = []
    server_list.extend(PROXIES)

    for tr in tr_list:
        ip = tr.xpath("td[1]/text()").extract_first()
        port = tr.xpath("td[2]/text()").extract_first()
        https = tr.xpath("td[7]/text()").extract_first()

        if https == "yes":
            server = f"{ip}:{port}"
            server_list.append(server)

    return server_list


while True:
    if len(proxy_server_list) == 0:
        proxy_server_list = get_proxy_list()

    proxy_server = choice(proxy_server_list)
    proxies = {"http": proxy_server, 'https': proxy_server}
    print(f'proxies: {proxies}')

    try:
        resp = requests.get(url, headers=headers, proxies=proxies, timeout=5)
        sel = Selector(resp)
        break
    except (ProxyError, SSLError, ConnectTimeout) as e:        
        proxy_server_list.remove(proxy_server)
        print(f'proxy len: {len(proxy_server_list)}')
                continue

댓글