2017-07-14 47 views
0

我有一列我正在使用urllib来检查的网址。它的工作很好,直到它遇到阻止请求的网站。在这种情况下,我只想跳过它并继续到列表中的下一个URL。任何想法如何做到这一点?如何跳过一个在Python 3中给出HTTP 403错误代码的网站?

以下是完整的错误:

Traceback (most recent call last): 
    File "C:/Users/Goris/Desktop/ssser/link.py", line 51, in <module> 
    x = urllib.request.urlopen(req) 
    File "C:\Users\Goris\AppData\Local\Programs\Python\Python36-32\lib\urllib\request.py", line 223, in urlopen 
    return opener.open(url, data, timeout) 
    File "C:\Users\Goris\AppData\Local\Programs\Python\Python36-32\lib\urllib\request.py", line 532, in open 
    response = meth(req, response) 
    File "C:\Users\Goris\AppData\Local\Programs\Python\Python36-32\lib\urllib\request.py", line 642, in http_response 
    'http', request, response, code, msg, hdrs) 
    File "C:\Users\Goris\AppData\Local\Programs\Python\Python36-32\lib\urllib\request.py", line 570, in error 
    return self._call_chain(*args) 
    File "C:\Users\Goris\AppData\Local\Programs\Python\Python36-32\lib\urllib\request.py", line 504, in _call_chain 
    result = func(*args) 
    File "C:\Users\Goris\AppData\Local\Programs\Python\Python36-32\lib\urllib\request.py", line 650, in http_error_default 
    raise HTTPError(req.full_url, code, msg, hdrs, fp) 
urllib.error.HTTPError: HTTP Error 403: Forbidden 
+0

什么是错误? – Ryan

+0

urllib.error.HTTP错误:HTTP错误403:禁止 – Goriss

+2

好的,请将这些信息编辑到您的问题中。你可能会想用'try' /'except'来捕获这个错误。如果您不知道如何将其应用到您的脚本,那么您也可能想要将相关代码编辑到您的问题中。 – Ryan

回答

1

我没试过,也不知道urlib,但你可以使用try和except语句捕获错误,然后继续。你可以尝试

try: 
    #connect-to-site 
except: 
    #connect-to-next-site 

如果你想不断地捕捉异常,你可以使用

def func(): 
    try: 
     #connect-to-site 
    except: 
     func() 

虽然不建议这样做,因为你可能会拖垮整个堆栈(利玛窦意大利)

+2

不要无故递归 - 您风险炸毁堆栈。如果代码被正确写入(一个单一的循环选择从列表中加载下一页),实际上不需要在“except”中做任何特别的事情 - 只需要继续下一次迭代。 –

3

错误你看到的只是表明服务器已经标记了所请求的资源 - 也就是你试图访问的URL--就像你禁止的那样。它没有给出任何指示为什么资源被禁止,尽管这种错误最常见的原因是您需要先登录。

但无论如何,这并不重要。跳过这个页面并转到下一个页面的方法是捕获提出的错误并忽略它。如果您的网址,访问代码是一个循环,这样的范围内:

while <condition>: 
    x = urllib.request.urlopen(req) 
    <more code> 

for req in <list>: 
    x = urllib.request.urlopen(req) 
    <more code> 

则可能赶上并忽略该错误的最简单的方法是这样的:

while <condition>: 
    try: 
     x = urllib.request.urlopen(req) 
    except urllib.error.HTTPError as e: 
     if e.code in (..., 403, ...): 
      continue 
    <more code> 

其中continue立即跳转到循环的下一次迭代。或者你可以在处理代码移到一个函数:

def process_url(x): 
    <more code> 

while <condition>: 
    try: 
     x = urllib.request.urlopen(req) 
    except urllib.error.HTTPError as e: 
     if e.code in (..., 403, ...): 
      continue 
     else: 
      process_url(x) 
    else: 
     process_url(x) 

在另一方面,如果你的URL访问代码已经是一个功能,你可以return

def access_url(req) 
    try: 
     x = urllib.request.urlopen(req) 
    except urllib.error.HTTPError as e: 
     if e.code in (..., 403, ...): 
      return 
    <more code> 

我强烈建议你了解the HTTP status codes,并且要清楚the errors that urllib.request can generate