작성
·
19
·
수정됨
답변 2
1
안녕하세요 좋은 질문 감사합니다.
인프런 AI 인턴도 말해주긴 했지만, asyncio.Semaphore를 사용하는게 더 안전하게 크롤링할 수 있는 방어코드 입니다. Semaphore은 특정 개수만큼만 '허가'를 내주고 허가를 받은 코루틴만 특정 작업을 수행할 수 있도록 하는 장치입니다.
사실 근데 Semaphore 설정보다도 더 중요한게,
각 요청 사이에 sleep을 주는게 좋습니다.
await asyncio.sleep(0.5) 이런 식으로 시간 텀을 적절하게 주는 방식도 많이 사용하구요.
저는 실무에서 크롤링 할때 sleep을 0.5에서 1.5 사이로 랜덤하게 주면서 각 요청마다 sleep을 주면서 하는 편입니다.
+동시 요청 수에 대한 수준은 사실 크롤링 대상 웹 서버 마다 전부 다 달라서 적절하게 판단하여 결정하는게 좋습니다.
0
안녕하세요, 인프런 AI 인턴입니다. moonu.kim님.
대규모 크롤링 작업을 수행할 때, 동시 요청 수를 제한하는 것은 서버의 부하를 줄이고 IP 차단을 방지하는 중요한 전략입니다. 이를 위해 파이썬의 asyncio
와 aiohttp
를 함께 사용하여 동시성 제어를 할 수 있습니다.
동시 요청 수 제한을 구현하는 한 가지 방법은 aiohttp
의 Semaphore
를 사용하는 것입니다. Semaphore
를 사용하면 동시에 실행되는 작업의 수를 제한할 수 있습니다. 예를 들어, 다음과 같이 구현할 수 있습니다.
import asyncio
import aiohttp
async def fetch(url, session):
async with session.get(url) as response:
return await response.text()
async def main(urls):
semaphore = asyncio.Semaphore(10) # 동시에 최대 10개의 요청
async with aiohttp.ClientSession() as session:
tasks = []
for url in urls:
task = asyncio.create_task(bound_fetch(semaphore, url, session))
tasks.append(task)
return await asyncio.gather(*tasks)
async def bound_fetch(semaphore, url, session):
async with semaphore:
return await fetch(url, session)
urls = [...] # 크롤링할 URL 목록
asyncio.run(main(urls))
위 코드에서 세마포어 값을 조정하여 동시 요청 수를 제한할 수 있습니다. semaphore = asyncio.Semaphore(10)
은 동시에 최대 10개의 요청만 실행하게 됩니다.
적절한 동시성 수준은 다음과 같은 여러 요인에 따라 다를 수 있습니다:
- 서버 응답 시간: 서버의 응답 속도가 느리다면 동시 요청 수를 너무 높게 설정하면 비효율적일 수 있습니다.
- 네트워크 대역폭: 사용 중인 네트워크의 최대 처리 능력에 따라 제한할 필요가 있습니다.
- 서버의 rate-limiting 정책: 서버에서 요청 수 제한 정책을 알고 있다면 그에 맞게 설정하십시오.
기본적으로 서버의 부담과 네트워크 상황을 고려하여 적절한 값을 설정해야 하며, 보통 실험과 조정을 통해 최적의 값을 찾아가는 것이 좋습니다.
아래의 게시물도 관련된 내용을 담고 있어 참고하시면 좋습니다:
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.