Pythonを使用して、Webサイトが稼働しているかどうかを確認するにはどうすればよいですか?私が読んだものから、「HTTP HEAD」を確認し、ステータスコード「200 OK」を確認する必要がありますが、どうすればいいですか?
乾杯
urllib からgetcode()
を使用してこれを行うことができます。
>>> print urllib.urlopen("http://www.stackoverflow.com").getcode()
>>> 200
編集:より現代的なPythonの場合、つまりpython3
、 つかいます:
import urllib.request
print(urllib.request.urlopen("http://www.stackoverflow.com").getcode())
>>> 200
Requests モジュールを使用するのが最も簡単な方法だと思います。
import requests
def url_ok(url):
r = requests.head(url)
return r.status_code == 200
httplib を使用できます
import httplib
conn = httplib.HTTPConnection("www.python.org")
conn.request("HEAD", "/")
r1 = conn.getresponse()
print r1.status, r1.reason
プリント
200 OK
もちろん、www.python.org
はアップしています。
import httplib
import socket
import re
def is_website_online(Host):
""" This function checks to see if a Host name has a DNS entry by checking
for socket info. If the website gets something in return,
we know it's available to DNS.
"""
try:
socket.gethostbyname(Host)
except socket.gaierror:
return False
else:
return True
def is_page_available(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
False.
"""
try:
conn = httplib.HTTPConnection(Host)
conn.request("HEAD", path)
if re.match("^[23]\d\d$", str(conn.getresponse().status)):
return True
except StandardError:
return None
from urllib.request import Request, urlopen
from urllib.error import URLError, HTTPError
req = Request("http://stackoverflow.com")
try:
response = urlopen(req)
except HTTPError as e:
print('The server couldn\'t fulfill the request.')
print('Error code: ', e.code)
except URLError as e:
print('We failed to reach a server.')
print('Reason: ', e.reason)
else:
print ('Website is working fine')
動作するPython 3
サーバーがダウンした場合、on python 2.7 x86 Windows urllibにはタイムアウトがなく、プログラムはデッドロックになります。したがって、urllib2を使用してください。
import urllib2
import socket
def check_url( url, timeout=5 ):
try:
return urllib2.urlopen(url,timeout=timeout).getcode() == 200
except urllib2.URLError as e:
return False
except socket.timeout as e:
print False
print check_url("http://google.fr") #True
print check_url("http://notexist.kc") #False
こんにちは、このクラスは、このクラスを使用してWebページのテストを高速化および高速化できます。
from urllib.request import urlopen
from socket import socket
import time
def tcp_test(server_info):
cpos = server_info.find(':')
try:
sock = socket()
sock.connect((server_info[:cpos], int(server_info[cpos+1:])))
sock.close
return True
except Exception as e:
return False
def http_test(server_info):
try:
# TODO : we can use this data after to find sub urls up or down results
startTime = time.time()
data = urlopen(server_info).read()
endTime = time.time()
speed = endTime - startTime
return {'status' : 'up', 'speed' : str(speed)}
except Exception as e:
return {'status' : 'down', 'speed' : str(-1)}
def server_test(test_type, server_info):
if test_type.lower() == 'tcp':
return tcp_test(server_info)
Elif test_type.lower() == 'http':
return http_test(server_info)
アップしている場合は、単に「サーバーがサービスを提供している」ことを意味し、cURLを使用できます。また、応答がある場合はアップしています。
私はpythonプログラマーではないので、具体的なアドバイスをすることはできませんが、pycurl http://pycurl.sourceforge.net/ へのリンクです。
requests
ライブラリを使用して、ウェブサイトが稼働しているかどうかを確認できます。つまり、status code
as 200
import requests
url = "https://www.google.com"
page = requests.get(url)
print (page.status_code)
>> 200
リクエスト および httplib2 は素晴らしいオプションです:
# Using requests.
import requests
request = requests.get(value)
if request.status_code == 200:
return True
return False
# Using httplib2.
import httplib2
try:
http = httplib2.Http()
response = http.request(value, 'HEAD')
if int(response[0]['status']) == 200:
return True
except:
pass
return False
Ansible を使用する場合、fetch_url関数を使用できます。
from ansible.module_utils.basic import AnsibleModule
from ansible.module_utils.urls import fetch_url
module = AnsibleModule(
dict(),
supports_check_mode=True)
try:
response, info = fetch_url(module, url)
if info['status'] == 200:
return True
except Exception:
pass
return False
PycURL および validators を使用した私のソリューションです
import pycurl, validators
def url_exists(url):
"""
Check if the given URL really exists
:param url: str
:return: bool
"""
if validators.url(url):
c = pycurl.Curl()
c.setopt(pycurl.NOBODY, True)
c.setopt(pycurl.FOLLOWLOCATION, False)
c.setopt(pycurl.CONNECTTIMEOUT, 10)
c.setopt(pycurl.TIMEOUT, 10)
c.setopt(pycurl.COOKIEFILE, '')
c.setopt(pycurl.URL, url)
try:
c.perform()
response_code = c.getinfo(pycurl.RESPONSE_CODE)
c.close()
return True if response_code < 400 else False
except pycurl.error as err:
errno, errstr = err
raise OSError('An error occurred: {}'.format(errstr))
else:
raise ValueError('"{}" is not a valid url'.format(url))