2009-07-16 34 views

Trả lời

22

Bạn nên sử dụng urllib2, như thế này:

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

Đây không phải là giải pháp hợp lệ vì urllib2 sẽ theo dõi chuyển hướng, vì vậy bạn sẽ không nhận được phản hồi 3xx nào. – sorin

+1

@sorin: Điều đó phụ thuộc - bạn cũng có thể ** muốn ** theo dõi chuyển hướng. Có lẽ bạn muốn đặt câu hỏi "Nếu tôi truy cập URL này bằng trình duyệt, nó có hiển thị nội dung hoặc đưa ra lỗi không?" Trong trường hợp đó, nếu tôi thay đổi 'http: // entrian.com /' thành 'http: // entrian.com/blog' trong ví dụ của tôi, kết quả 200 sẽ là chính xác mặc dù nó liên quan đến một chuyển hướng đến' http:// entrian.com/blog/'(lưu ý dấu gạch chéo). – RichieHindle

63

Dưới đây là một giải pháp mà sử dụng httplib để thay thế.

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 
+13

+1 cho yêu cầu HEAD - không cần truy xuất toàn bộ thực thể để kiểm tra trạng thái. –

+7

Mặc dù bạn thực sự nên hạn chế 'except' chặn ít nhất' StandardError' để bạn không bắt được những thứ như 'KeyboardInterrupt'. –

+0

Ý tưởng hay, Ben. Tôi cập nhật nó cho phù hợp. –

3

Ngoại lệ urllib2.HTTPError không chứa phương thức getcode(). Sử dụng thuộc tính code để thay thế.

+2

Nó cho tôi, sử dụng Python 2.6. – RichieHindle

5

Trong tương lai, đối với những người sử dụng python3 trở lên, đây là một mã khác để tìm mã phản hồi.

import urllib.request 

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

Điều này sẽ tăng HTTPError cho các mã trạng thái như 404, 500, v.v. –

63

Cập nhật bằng cách sử dụng tuyệt vời requests library. Lưu ý rằng chúng tôi đang sử dụng yêu cầu HEAD, điều này sẽ xảy ra nhanh hơn sau đó là yêu cầu GET hoặc POST đầy đủ.

import requests 
try: 
    r = requests.head("http://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") 
+0

yêu cầu tốt hơn nhiều so với urllib2, cho liên kết như vậy: http://www.dianping.com/promo/208721#mod=4, urllib2 cho tôi một 404 và yêu cầu cung cấp cho 200 như những gì tôi nhận được từ trình duyệt. – WKPlus

+5

httpstatusrappers.com ... tuyệt vời !! Mã của tôi là tình trạng Lil Jon đó, con trai! – tmthyjames

+1

Đây là giải pháp tốt nhất. Tốt hơn nhiều so với bất kỳ người nào khác. – Awn

1

Đây là giải pháp httplib hoạt động như urllib2. Bạn chỉ có thể cung cấp cho nó một URL và nó chỉ hoạt động. Không cần phải xáo trộn về việc chia nhỏ URL của bạn thành tên máy chủ và đường dẫn. Chức năng này đã làm điều đó.

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

Không chắc chắn lý do tại sao điều này đã được giảm giá mà không có phản hồi. Nó hoạt động với các URL HTTP và HTTPS. Nó sử dụng phương thức HEAD của HTTP. –

Các vấn đề liên quan