web-dev-qa-db-ja.com

Pythonを使用してWebサイトが起動しているかどうかを確認する

Pythonを使用して、Webサイトが稼働しているかどうかを確認するにはどうすればよいですか?私が読んだものから、「HTTP HEAD」を確認し、ステータスコード「200 OK」を確認する必要がありますが、どうすればいいですか?

乾杯

関連する

51
Hellnar

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
82

Requests モジュールを使用するのが最も簡単な方法だと思います。

import requests

def url_ok(url):
    r = requests.head(url)
    return r.status_code == 200
17
caisah

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はアップしています。

9
OscarRyz
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
7
Evan Fosmark
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

6

標準ライブラリのHTTPConnectionモジュールからの httplib オブジェクトは、おそらくあなたのためのトリックを行います。ところで、PythonでHTTPを使って高度なことを始める場合は、必ず httplib2 ;それは素晴らしいライブラリです。

4
Hank Gay

サーバーがダウンした場合、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     
2
themadmax

こんにちは、このクラスは、このクラスを使用して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)
1

アップしている場合は、単に「サーバーがサービスを提供している」ことを意味し、cURLを使用できます。また、応答がある場合はアップしています。

私はpythonプログラマーではないので、具体的なアドバイスをすることはできませんが、pycurl http://pycurl.sourceforge.net/ へのリンクです。

1
Tyler Smith

requestsライブラリを使用して、ウェブサイトが稼働しているかどうかを確認できます。つまり、status code as 200

import requests
url = "https://www.google.com"
page = requests.get(url)
print (page.status_code) 

>> 200
1
Harry_pb

リクエスト および 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
0
constrict0r

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))
0
techouse