Проверка работоспособности сайта через Python

Используя python, как я могу проверить, работает ли сайт? Из того, что я прочитал, мне нужно проверить "HTTP HEAD" и увидеть код состояния "200 OK", но как это сделать?

ура

связанные с

16 ответов

Решение

Вы можете попытаться сделать это с getcode() из Урлиба

>>> print urllib.urlopen("http://www.stackru.com").getcode()
>>> 200

РЕДАКТИРОВАТЬ: Для более современного Python, т.е. python3, используйте:

import urllib.request
print(urllib.request.urlopen("http://www.stackru.com").getcode())
>>> 200

Я думаю, что самый простой способ сделать это с помощью модуля запросов.

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 вверх

from urllib.request import Request, urlopen
from urllib.error import URLError, HTTPError
req = Request("http://stackru.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

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

Использую для этого запросы , тогда легко и чисто. Вместо функции печати вы можете определить и вызвать новую функцию (уведомление по электронной почте и т. Д.). Блок try-except необходим, потому что, если хост недоступен, он вызовет множество исключений, поэтому вам нужно перехватить их все.

      import requests

URL = "https://api.github.com"

try:
    response = requests.head(URL)
except Exception as e:
    print(f"NOT OK: {str(e)}")
else:
    if response.status_code == 200:
        print("OK")
    else:
        print(f"NOT OK: HTTP response code {response.status_code}")

Вы можете использовать requests библиотека, чтобы найти, если веб-сайт работает, т.е. status code как 200

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

>> 200

HTTPConnection объект из httplib модуль в стандартной библиотеке, вероятно, поможет вам. Кстати, если вы начнете делать что-то продвинутое с HTTP в Python, обязательно посмотрите httplib2; это отличная библиотека

Если сервер не работает, на python 2.7 x86 окна 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     

На мой взгляд, ответ caisah упускает из виду важную часть вашего вопроса, а именно работу с сервером, находящимся в автономном режиме.

Тем не менее, используя requests мой любимый вариант, хотя и как таковой:

import requests

try:
    requests.get(url)
except requests.exceptions.ConnectionError:
    print(f"URL {url} not reachable")

Если up, вы просто имеете в виду "сервер обслуживает", тогда вы можете использовать cURL, и если вы получите ответ, то он работает.

Я не могу дать вам конкретный совет, потому что я не программист на Python, однако вот ссылка на pycurl http://pycurl.sourceforge.net/.

Привет, этот класс может сделать тест скорости и ускорения для вашей веб-страницы с этим классом:

 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)

Мои 2 цента

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

if getResponseCode(url) != 200:
    print('Wrong URL')
else:
    print('Good URL')

Запросы и 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 и валидаторов

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

Вы также можете проверить статус сайта таким образом,

      Import requests
def monitor():
    r = requests.get("https://www.google.com/", timeout=5)
    print(r.status_code)
Другие вопросы по тегам