2017-12-25 29 views
0

ulrステータスをurllib.request.urlopenで取得しようとしていますが、場合によってはurllib.error.URLError: HTTP Error 403: ForbiddenブラウザからこのURLを正常に開くことができます。 urllib以上でこの問題を克服することは可能ですか?urllib.error.URLError:HTTPエラー403:urllib.request.urlopenから禁止

def urllib_status(url): 
    REQUEST_TIMEOUT = 10 

    if 'http' not in url: 
     url = 'http://' + url 

    try: 
     response = urllib.request.urlopen(url, timeout=REQUEST_TIMEOUT) 
     return response.status 
    except urllib.error.URLError as e: 
     print('url:'+url) 
     print('urllib.error.URLError:', e) 
     return -1 
    except ssl.SSLError as e: 
     print('url:'+url) 
     print('ssl.SSLError:', e) 
     return -1 
    except socket.error as e: 
     print('url:'+url) 
     print("socket.error: ", e) 
     return -1 
+0

を(Pythonのユーザーの間で事実上の標準のHTTPライブラリ)requestsを使用している場合は、URLを提供することはできますか?それがなければ助けが難しいです。また、あなたの質問を更新し、あなたの答えを削除してください。 –

答えて

0

それはrequestsを使用してsimlerです:

def url_status(url): 
    headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.0; WOW64; rv:24.0)' 
          ' Gecko/20100101 Firefox/24.0'} 
    REQUEST_TIMEOUT = 10 

    if 'http' not in url: 
     url = 'http://' + url 
    try: 
     response = requests.get(url, headers=headers, timeout=REQUEST_TIMEOUT) 
     if(response.status_code != 200): 
      print(url) 
      print('status',response.status_code) 
     return response.status_code 
    except Exception as e: 
     print(url) 
     print('Error',e) 
     return -1 
1

問題は、ブラウザ以外の要求を受け入れていないサイトが原因である可能性が高いです。リクエストのUser-Agentヘッダーをオーバーライドすることで回避できます(デフォルトはPython-urllib/3.X)。 Python docsから

import urllib.request 
opener = urllib.request.build_opener() 
opener.addheaders = [('User-agent', 'Mozilla/5.0')] 
opener.open('http://www.example.com/') 

それとも、あなたは

import requests 
requests.get('http://www.example.com/', headers={'User-agent': 'Mozilla/5.0'})