一、爬虫时,出现urllib.error.HTTPError: HTTP Error 403: Forbidden

Traceback(mostrecentcalllast):File"D:/访问web.py",line75,in<module>downHtml(url=url)File"D:/urllib访问web.py",line44,indownHtmlhtml=request.urlretrieve(url=url,filename='%s/%s.txt'%(savedir,get_domain_url(url=url)))File"C:\Python35\lib\urllib\request.py",line187,inurlretrievewithcontextlib.closing(urlopen(url,data))asfp:File"C:\Python35\lib\urllib\request.py",line162,inurlopenreturnopener.open(url,data,timeout)File"C:\Python35\lib\urllib\request.py",line471,inopenresponse=meth(req,response)File"C:\Python35\lib\urllib\request.py",line581,inhttp_response'http',request,response,code,msg,hdrs)File"C:\Python35\lib\urllib\request.py",line503,inerrorresult=self._call_chain(*args)File"C:\Python35\lib\urllib\request.py",line443,in_call_chainresult=func(*args)File"C:\Python35\lib\urllib\request.py",line686,inhttp_error_302returnself.parent.open(new,timeout=req.timeout)File"C:\Python35\lib\urllib\request.py",line471,inopenresponse=meth(req,response)File"C:\Python35\lib\urllib\request.py",line581,inhttp_response'http',request,response,code,msg,hdrs)File"C:\Python35\lib\urllib\request.py",line509,inerrorreturnself._call_chain(*args)File"C:\Python35\lib\urllib\request.py",line443,in_call_chainresult=func(*args)File"C:\Python35\lib\urllib\request.py",line589,inhttp_error_defaultraiseHTTPError(req.full_url,code,msg,hdrs,fp)urllib.error.HTTPError:HTTPError403:Forbidden

二、分析:

之所以出现上面的异常,是因为如果用 urllib.request.urlopen 方式打开一个URL,服务器端只会收到一个单纯的对于该页面访问的请求,但是服务器并不知道发送这个请求使用的浏览器,操作系统,硬件平台等信息,而缺失这些信息的请求往往都是非正常的访问,例如爬虫.有些网站为了防止这种非正常的访问,会验证请求信息中的UserAgent(它的信息包括硬件平台、系统软件、应用软件和用户个人偏好),如果UserAgent存在异常或者是不存在,那么这次请求将会被拒绝(如上错误信息所示)所以可以尝试在请求中加入UserAgent的信息


三、方案:

对于Python 3.x来说,在请求中添加UserAgent的信息非常简单,代码如下

#如果不加上下面的这行出现会出现urllib.error.HTTPError: HTTP Error 403: Forbidden错误

#主要是由于该网站禁止爬虫导致的,可以在请求加上头信息,伪装成浏览器访问User-Agent,具体的信息可以通过火狐的FireBug插件查询

headers={'User-Agent':'Mozilla/5.0(WindowsNT10.0;WOW64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/55.0.2883.75Safari/537.36'}req=urllib.request.Request(url=chaper_url,headers=headers)urllib.request.urlopen(req).read()

而使用request.urlretrieve库下载时,如下解决:

opener=request.build_opener()opener.addheaders=[('User-Agent','Mozilla/5.0(WindowsNT10.0;WOW64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/55.0.2883.75Safari/537.36')]request.install_opener(opener)request.urlretrieve(url=url,filename='%s/%s.txt'%(savedir,get_domain_url(url=url)))

四、效果图: