Python — urllib.error.HTTPError: HTTP Error 403: Forbidden

WONBOK LEE
W.B's Log
Published in
5 min readJul 16, 2018

네이버 이미지 크롤링 예제를 하는데

Traceback (most recent call last):File "/Users/wonboklee/Desktop/Python/inflearn_python_webcrawling/section2/download2-8-1.py", line 17, in <module>res = req.urlopen(url)File "/Users/wonboklee/anaconda3/envs/section2/lib/python3.5/urllib/request.py", line 163, in urlopenreturn opener.open(url, data, timeout)File "/Users/wonboklee/anaconda3/envs/section2/lib/python3.5/urllib/request.py", line 472, in openresponse = meth(req, response)File "/Users/wonboklee/anaconda3/envs/section2/lib/python3.5/urllib/request.py", line 582, in http_response'http', request, response, code, msg, hdrs)File "/Users/wonboklee/anaconda3/envs/section2/lib/python3.5/urllib/request.py", line 510, in errorreturn self._call_chain(*args)File "/Users/wonboklee/anaconda3/envs/section2/lib/python3.5/urllib/request.py", line 444, in _call_chainresult = func(*args)File "/Users/wonboklee/anaconda3/envs/section2/lib/python3.5/urllib/request.py", line 590, in http_error_defaultraise HTTPError(req.full_url, code, msg, hdrs, fp)urllib.error.HTTPError: HTTP Error 403: Forbidden

이런 에러가 떠서 검색해 봄. 강의에서는 에러 안나는데 왜 나는 나는지는 모르겠지만 stackoverflow가면 예제가 많아서 해결. 봇인지 아닌지 구분하느라 그렇다고 header를 넣으면 된단다

from bs4 import BeautifulSoup
import urllib.request as req
import urllib.parse as rep
import sys
import io
import os
sys.stdout = io.TextIOWrapper(sys.stdout.detach(), encoding = 'utf-8')
sys.stderr = io.TextIOWrapper(sys.stderr.detach(), encoding = 'utf-8')
base = "https://search.naver.com/search.naver?where=image&query="
quote = rep.quote_plus("사자")
url = base + quote
res = req.urlopen(url)
savePath ="C:\\imagedown\\"
try:
if not(os.path.isdir(savePath)
os.makedirs(os.path.join(savePath))
except OSError as e:
if e.errno != errno.EEXIST:
print("Failed to create directory!!!!!")
raise

위코드에 아래처럼 헤더를 넣음

base = "https://search.naver.com/search.naver?where=image&query="quote = rep.quote_plus("사자")url = base + quotereq = urllib.request.Request(url, headers={'User-Agent': 'Mozilla/5.0'})res = urllib.request.urlopen(req)savePath ="/Users/wonboklee/Desktop/Python/examples_inflearn_NaverImage"try: if not(os.path.isdir(savePath)):   os.makedirs(os.path.join(savePath))except OSError as e: if e.errno != errno.EEXIST:   print("Failed to create directory!!!!!")    raise  

--

--