본문 바로가기
Work 💻

웹 크롤링 | WinError 10060 해결하기

by 째파 2023. 1. 18.
반응형

요즘 혼자 python으로 크롤링을 공부하며 여러 가지를 시도해보고 있다.

그런데 아무래도 특정 웹 사이트를 계속 request 하다 보니 아래와 같은 에러가 자주 발생한다.

urllib.error.URLError: <urlopen error [WinError 10060] 연결된 구성원으로부터 응답이 없어 연결하지 못했거나, 호스트로부터 응답이 없어 연결이 끊어졌습니다>

웹 크롤링(crawling)이나 스크래핑(scraping)을 하다보면 웹사이트가 해당 요청을 로봇인 줄 알고 차단하기 때문이다.

이러한 문제를 해결하기 위해 여러 방법을 찾아보았다.

 


 

방안 1 ) user_agent 라이브러리 사용하기 

우선 pip으로 user_agent 라이브러리를 설치하고 python에서 import한다.

from user_agent import generate_user_agent, generate_navigator

hdr = {'User-Agent': generate_user_agent(os='win', device_type='desktop')}

generate_user_agent() 함수는 계속해서 랜덤 한 header를 생성할 수 있으며 위의 옵션처럼 window운영체제인 데스크톱으로 인식하도록 한다.

 

예시 case 1 : urllib의 Request함수 사용

from urllib.request import urlopen
from urllib.error import HTTPError
from urllib.request import Request, urlopen
from user_agent import generate_user_agent, generate_navigator

for i in range(0,10) :
	hdr = {'User-Agent': generate_user_agent(os='win', device_type='desktop')}
	req = Request("방문하고자하는 URL",headers = hdr)
	content = urlopen(req).read()

 

예시 case 2 : requests와 bs4 사용

import requests
from bs4 import BeautifulSoup as bs
from user_agent import generate_user_agent, generate_navigator

for i in range(0,10) :
	hdr = {'User-Agent': generate_user_agent(os='win', device_type='desktop')}
	req = requests.get(url="방문하고자하는 URL", headers=hdr)
	content = bs(req.text, "html.parser")

 

이런 방법으로 for문 안에 헤더를 계속해서 바꿔주며 웹사이트에 요청을 보내는 방법이 있다.

그러나 이 방법도 요청 건수가 많으면 어느 순간 또다시 [WinError 10060] 가 발생했다.

 

방안 2 ) time.sleep() 함수 사용하기

가장 쉽운 방법은 웹사이트가 로봇인지 알 수 없도록 일정기간의 휴식기를 주며 크롤링을 진행하는 것이었다.

하지만 그만큼 시간이 오래 소요된다는 단점이 있다.

 

예시 case : request 후에 5초의 휴식기 주기

import requests
from bs4 import BeautifulSoup as bs
import time

for i in range(0,10) :
	page = requests.get(url="방문하고자하는 URL")
	soup = bs(page.text, "html.parser")
	time.sleep(5)

 

결국 두 방법을 다 적용하여 랜덤하게 header를 넘겨주고 휴식기를 주며 크롤링을 진행했다.

 

반응형

댓글