Tôi đang tìm kiếm một cách nhanh chóng để nhận mã phản hồi HTTP từ URL (ví dụ: 200, 404, v.v.). Tôi không chắc nên sử dụng thư viện nào.Cách tốt nhất để nhận mã phản hồi HTTP từ URL là gì?
Trả lời
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]
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
+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. –
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'. –
Ý tưởng hay, Ben. Tôi cập nhật nó cho phù hợp. –
Ngoại lệ urllib2.HTTPError
không chứa phương thức getcode()
. Sử dụng thuộc tính code
để thay thế.
Nó cho tôi, sử dụng Python 2.6. – RichieHindle
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()
Điều này sẽ tăng HTTPError cho các mã trạng thái như 404, 500, v.v. –
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")
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
httpstatusrappers.com ... tuyệt vời !! Mã của tôi là tình trạng Lil Jon đó, con trai! – tmthyjames
Đâ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
Đâ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
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. –
- 1. Cách nhận mã trạng thái phản hồi từ jQuery.ajax?
- 2. Cách nhận mã phản hồi từ Yêu cầu HTTP trong Ruby
- 3. Cách nhận url phản hồi trong XMLHttpRequest?
- 4. Lỗi kết nối URL - java.io.IOException: Máy chủ trả về mã phản hồi HTTP: 400 cho URL
- 5. Cách tốt nhất để gây ra nút Flex 3 để phản hồi phím enter là gì?
- 6. Mã phản hồi HTTP cho hoạt động Xóa HTTP không thành công là gì?
- 7. Java: Nhận phản hồi HTTP nhiều phần
- 8. Cách nhận phản hồi tốt từ việc lưu mô hình
- 9. Nhận tiêu đề phản hồi từ yêu cầu HTTP Ruby
- 10. Nhận URL từ phản hồi http khi không có tiêu đề vị trí được gửi
- 11. Thẻ đối tượng phản hồi HTTP là gì?
- 12. Kích thước đoạn tối đa trong phản hồi HTTP với Mã hóa chuyển mã là gì?
- 13. Cách tốt nhất để phân tích cú pháp phản hồi JSON từ thư viện yêu cầu là gì?
- 14. Python urllib2: Nhận phản hồi JSON từ url
- 15. Làm cách nào để nhận mã phản hồi lỗi HTTP trong Jquery POST
- 16. Máy chủ trả lại mã phản hồi HTTP: 400
- 17. Nhận phản hồi từ PostAsJsonAsync
- 18. Nhận phản hồi từ TIdHttp với Mã lỗi 400
- 19. Cách nhận trạng thái phản hồi jQuery.ajax?
- 20. Cách tốt nhất để băm url trong ruby là gì?
- 21. làm cách nào để kiểm tra mã trạng thái phản hồi yêu cầu http từ iOS?
- 22. Mã phản hồi HTTP 401 trong Google GCM
- 23. Cách nhanh nhất để nhận HTTP bằng Python là gì?
- 24. Nhận mã phản hồi tiêu đề
- 25. Cách gửi yêu cầu HTTP POST và nhận phản hồi?
- 26. nhận mã phản hồi từ HttpURLConnection trong android
- 27. làm thế nào để tôi nhận được chuỗi từ android phản hồi http của tôi?
- 28. Cách nhận phản hồi của XMLHttpRequest?
- 29. Cách tốt nhất để ghi lại mã f # là gì?
- 30. Máy chủ trả lại mã phản hồi HTTP: 401 cho URL: https
Đâ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
@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