[파이썬] requests-html 요청 제한 및 속도 조절

Python의 requests-html 라이브러리는 웹 스크래핑과 크롤링 작업을 쉽게 해주는 강력한 도구입니다. 그러나 때로는 너무 많은 요청을 보내거나 너무 빠른 속도로 요청을 처리할 수 없는 상황이 발생할 수 있습니다. 이런 상황에서는 요청을 제한하거나 속도를 조절해야 합니다. 이 글에서는 requests-html로 요청을 제한하고 속도를 조절하는 방법에 대해 알아보겠습니다.

요청 제한하기

requests-html를 사용하여 많은 요청을 보낼 때, 단기간에 너무 많은 요청을 보내면 웹 서버에서 이를 감지하여 IP 주소를 차단할 수 있습니다. 이를 피하기 위해 요청을 제한할 수 있습니다.

1. Delay

지연(delay)은 요청 간의 일정한 시간 간격을 두는 방법입니다. 따라서 요청을 보내는 속도를 제한할 수 있습니다. 아래는 requests-html에서 지연을 사용하는 예시입니다.

from requests_html import HTMLSession
import time

session = HTMLSession()

def send_request(url):
    response = session.get(url)
    # 작업을 수행합니다.
    time.sleep(1)  # 1초 지연

# 여러 개의 요청을 보낼 때도 동일한 방식으로 작업할 수 있습니다.
urls = ["https://example.com/page1", "https://example.com/page2", "https://example.com/page3"]

for url in urls:
    send_request(url)

위의 코드에서 time.sleep(1)은 요청 간 1초의 지연을 의미합니다. 요청 간의 시간 간격을 조정하여 원하는 작업 속도로 제어할 수 있습니다.

2. Max retrys

요청을 제한하는 또 다른 방법은 요청을 다시 시도하는 횟수를 제한하는 것입니다. 네트워크 상태가 좋지 않을 때의 요청 실패 및 오류를 처리하는 데 도움이 됩니다. 이를 위해 max_retries 매개변수를 사용하여 최대 재시도 횟수를 설정할 수 있습니다.

from requests_html import HTMLSession

session = HTMLSession()

session.max_retries = 3  # 최대 3번까지 재시도

response = session.get("https://example.com")

위의 코드에서 session.max_retries를 3으로 설정하면 최대 3번까지 재시도됩니다.

속도 조절하기

requests-html를 사용하면 크롤링 및 스크래핑을 더욱 효율적으로 수행할 수 있지만, 때로는 속도를 조절하여 웹 서버에 과도한 부하를 주지 않도록 해야합니다.

1. Throttling

throttling은 요청을 제한하는 방법 중 하나로, 요청의 수를 조절하여 과도한 속도로 요청을 보내지 않도록 합니다. 아래는 requests-html에서 throttling을 사용하는 예시입니다.

from requests_html import HTMLSession
from threading import Semaphore
import time

session = HTMLSession()
sem = Semaphore(3)  # 동시에 실행 가능한 요청의 최대 개수

def send_request(url):
    with sem:  # semaphore로 요청 제한
        response = session.get(url)
        # 작업을 수행합니다.
        
# 여러 개의 요청을 보낼 때도 동일한 방식으로 작업할 수 있습니다.
urls = ["https://example.com/page1", "https://example.com/page2", "https://example.com/page3"]

for url in urls:
    send_request(url)

위의 코드에서 Semaphore 객체를 사용하여 동시에 실행 가능한 요청의 최대 개수를 3으로 설정하였습니다. 따라서 동시에 최대 3개의 요청만 보낼 수 있습니다.

2. Concurrent requests

requests-html는 session.concurrent_requests 속성을 사용하여 동시에 실행 가능한 요청의 최대 개수를 설정하는 기능을 제공합니다. 아래는 concurrent requests를 설정하는 예시입니다.

from requests_html import HTMLSession

session = HTMLSession()

session.concurrent_requests = 5  # 최대 5개의 동시 요청

response = session.get("https://example.com")

위의 코드에서 session.concurrent_requests를 5로 설정하면 최대 5개의 동시 요청을 보낼 수 있습니다.

마무리

requests-html를 사용하여 웹 스크래핑 및 크롤링 작업을 수행할 때, 요청을 제한하거나 속도를 조절하는 것은 중요한 요소입니다. 이를 통해 웹 서버에 부하를 줄이면서 원활한 작업을 수행할 수 있습니다. 위에서 소개한 요청 제한과 속도 조절 방법들은 융통성 있게 사용하여 다양한 상황에 대응할 수 있습니다.