URL से HTTP प्रतिक्रिया कोड प्राप्त करने का सबसे अच्छा तरीका क्या है?


82

मैं एक यूआरएल (यानी 200, 404, आदि) से एक HTTP प्रतिक्रिया कोड प्राप्त करने का एक त्वरित तरीका ढूंढ रहा हूं। मुझे यकीन नहीं है कि किस लाइब्रेरी का उपयोग करना है।

जवाबों:


99

अद्भुत अनुरोध लाइब्रेरी का उपयोग करके अपडेट करें । ध्यान दें कि हम HEAD अनुरोध का उपयोग कर रहे हैं, जो कि अधिक तेज़ी से पूर्ण GET या POST अनुरोध के साथ होना चाहिए।

import requests
try:
    r = requests.head("https://stackoverflow.com")
    print(r.status_code)
    # prints the int of the status code. Find more at httpstatusrappers.com :)
except requests.ConnectionError:
    print("failed to connect")

ऐसी लिंक के लिए, urllib2 की तुलना में अनुरोध बहुत बेहतर हैं: dianping.com/promo/208721#mod=4 , urllib2 मुझे एक 404 देता है और अनुरोध मुझे एक ब्राउज़र से जैसा मिलता है वैसा ही 200 देता है।
— WKPlus

5
httpstatusrappers.com ... कमाल !! मेरा कोड उस लील जॉन स्टेटस पर है, बेटा!
— tmthyjames

1
यह सबसे अच्छा उपाय है। दूसरों की तुलना में बहुत बेहतर है।
— Awn

@WKPlus रिकॉर्ड के लिए, अब आपके लिंक के लिए requestsदेता है 403, हालांकि यह अभी भी ब्राउज़र में काम कर रहा है।
— डेनिस गोलोमेज़ोव

2
@ गूर्नेऊ हा! यही नहीं मैं अपनी टिप्पणी के साथ करना चाहता था, मुझे लगता है कि यह पूरी तरह से ठीक था, और इस संदर्भ में, लोगों को यह समझने की कोशिश करनी चाहिए कि यह ब्राउज़र में "बस काम क्यों करता है", लेकिन कोड में 403 देता है, जब वास्तविकता में, वही बात दोनों जगह हो रही है।
— seaders

65

यहां एक समाधान है जो httplibइसके बजाय उपयोग करता है ।

import httplib

def get_status_code(host, path="/"):
    """ This function retreives the status code of a website by requesting
        HEAD data from the host. This means that it only requests the headers.
        If the host cannot be reached or something else goes wrong, it returns
        None instead.
    """
    try:
        conn = httplib.HTTPConnection(host)
        conn.request("HEAD", path)
        return conn.getresponse().status
    except StandardError:
        return None


print get_status_code("stackoverflow.com") # prints 200
print get_status_code("stackoverflow.com", "/nonexistant") # prints 404

14
+1 HEAD अनुरोध के लिए - स्थिति जाँच के लिए संपूर्ण निकाय को पुनः प्राप्त करने की आवश्यकता नहीं है।
— बेन ब्लैंक

7
यद्यपि आपको वास्तव में उस exceptब्लॉक को कम से कम प्रतिबंधित करना चाहिए StandardErrorताकि आप गलत तरीके से चीजों को पकड़ न सकें KeyboardInterrupt।
— बेन ब्लैंक

3
मैं सोच रहा था कि क्या HEAD अनुरोध विश्वसनीय हैं। क्योंकि वेबसाइटों में HEAD पद्धति लागू नहीं हो सकती है, जिसके परिणामस्वरूप 404, 501 या 500 जैसे स्थिति कोड हो सकते हैं। या क्या मैं पागल हो रहा हूं?
— ब्लेज

2
कोई कैसे इस 301 का पालन करेगा?
— रान्डेल हंट

2
@Blaise अगर एक वेबसाइट HEAD अनुरोध तो एक HEAD अनुरोध प्रदर्शन की अनुमति नहीं है चाहिए कि 405 त्रुटि में परिणाम। इसके एक उदाहरण के लिए, दौड़ने का प्रयास करें curl -I http://www.amazon.com/।
— निक

24

आपको इस तरह से urllib2 का उपयोग करना चाहिए:

import urllib2
for url in ["http://entrian.com/", "http://entrian.com/does-not-exist/"]:
    try:
        connection = urllib2.urlopen(url)
        print connection.getcode()
        connection.close()
    except urllib2.HTTPError, e:
        print e.getcode()

# Prints:
# 200 [from the try block]
# 404 [from the except block]

3
यह एक वैध समाधान नहीं है क्योंकि urllib2 रीडायरेक्ट का पालन करेगा, इसलिए आपको कोई 3xx प्रतिक्रियाएं नहीं मिलेंगी।
— सोरिन

1
@ सोरिन: यह निर्भर करता है - आप अच्छी तरह से पुनर्निर्देश का पालन करना चाह सकते हैं । शायद आप यह सवाल पूछना चाहते हैं कि "अगर मैं एक ब्राउज़र के साथ इस URL पर जाना चाहता हूं, तो क्या यह सामग्री दिखाएगा या कोई त्रुटि देगा?" उस स्थिति में, यदि मैं अपने उदाहरण में बदल http://entrian.com/गया http://entrian.com/blog, तो परिणामी 200 सही होगा, भले ही इसमें http://entrian.com/blog/(अनुप्रेक्षा स्लैश पर ध्यान दें) अनुप्रेषित शामिल हो ।
— रिचीहिंडल

8

भविष्य में, उन लोगों के लिए जो python3 का उपयोग करते हैं और बाद में, प्रतिक्रिया कोड खोजने के लिए यहां एक और कोड है।

import urllib.request

def getResponseCode(url):
    conn = urllib.request.urlopen(url)
    return conn.getcode()

2
यह 404, 500 आदि जैसे स्टेटस कोड के लिए HTTPError बढ़ाएगा
— आर


2

@ निकनोर के जवाब पर @ निक्लास आर की टिप्पणी को संबोधित करते हुए:

from urllib.error import HTTPError
import urllib.request

def getResponseCode(url):
    try:
        conn = urllib.request.urlopen(url)
        return conn.getcode()
    except HTTPError as e:
        return e.code

0

यहाँ एक httplibसमाधान है जो urllib2 की तरह व्यवहार करता है। आप इसे सिर्फ एक URL दे सकते हैं और यह सिर्फ काम करता है। अपने URL को होस्टनाम और पथ में विभाजित करने के बारे में कोई गड़बड़ करने की आवश्यकता नहीं है। यह कार्य पहले से ही करता है।

import httplib
import socket
def get_link_status(url):
  """
    Gets the HTTP status of the url or returns an error associated with it.  Always returns a string.
  """
  https=False
  url=re.sub(r'(.*)#.*$',r'\1',url)
  url=url.split('/',3)
  if len(url) > 3:
    path='/'+url[3]
  else:
    path='/'
  if url[0] == 'http:':
    port=80
  elif url[0] == 'https:':
    port=443
    https=True
  if ':' in url[2]:
    host=url[2].split(':')[0]
    port=url[2].split(':')[1]
  else:
    host=url[2]
  try:
    headers={'User-Agent':'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:26.0) Gecko/20100101 Firefox/26.0',
             'Host':host
             }
    if https:
      conn=httplib.HTTPSConnection(host=host,port=port,timeout=10)
    else:
      conn=httplib.HTTPConnection(host=host,port=port,timeout=10)
    conn.request(method="HEAD",url=path,headers=headers)
    response=str(conn.getresponse().status)
    conn.close()
  except socket.gaierror,e:
    response="Socket Error (%d): %s" % (e[0],e[1])
  except StandardError,e:
    if hasattr(e,'getcode') and len(e.getcode()) > 0:
      response=str(e.getcode())
    if hasattr(e, 'message') and len(e.message) > 0:
      response=str(e.message)
    elif hasattr(e, 'msg') and len(e.msg) > 0:
      response=str(e.msg)
    elif type('') == type(e):
      response=e
    else:
      response="Exception occurred without a good error message.  Manually check the URL to see the status.  If it is believed this URL is 100% good then file a issue for a potential bug."
  return response

1
यह सुनिश्चित नहीं किया गया कि प्रतिक्रिया के बिना इसे क्यों अस्वीकृत कर दिया गया। यह HTTP और HTTPS URL के साथ काम करता है। यह HTTP की HEAD विधि का उपयोग करता है।
— सैम ग्रील्के
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.