반응형
요즘 혼자 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를 넘겨주고 휴식기를 주며 크롤링을 진행했다.
반응형
'Work 💻' 카테고리의 다른 글
Pycharm Setting | Black Formatter 적용하기 (1) | 2024.01.26 |
---|---|
Python | Pandas DataFrame 교차 조인(Cross Join, 곱집합) 하는 법 (0) | 2024.01.15 |
Pycharm Setting | 파이참 콘솔 프롬프트가 In[]으로 바뀐 현상 해결 (0) | 2023.04.27 |
개발환경 | zsh: command not found: conda 해결하기 (0) | 2023.04.06 |
Python | Pandas의 DataFrame 초기화하기 (0) | 2023.01.17 |
댓글