爬虫403问题解决urllib.error.HTTPError: HTTP Error 403: Forbidden
一、爬虫时,出现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)))
四、效果图:
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。