Vérifier si un site web est en place via Python

en utilisant python, Comment puis-je vérifier si un site web est en place? D'après ce que j'ai lu, je dois vérifier la "tête HTTP" et voir le code d'état "200 OK", mais comment le faire ?

Cheers

connexe

  • Comment envoyer une requête HTTP HEAD en Python?
41
demandé sur Community 2009-12-23 00:31:41

11 réponses

vous pouvez essayer de le faire avec getcode() de urllib

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

EDIT: Pour plus modernes python, c'est à dire python3 , utilisez:

import urllib.request
print(urllib.request.urlopen("http://www.stackoverflow.com").getcode())
>>> 200
60
répondu Anthony Forloney 2017-11-09 14:12:17

je pense que la façon la plus facile de le faire est d'utiliser Requests module.

import requests

def url_ok(url):
    r = requests.head(url)
    return r.status_code == 200
11
répondu caisah 2013-04-01 12:36:55

vous pouvez utiliser httplib

import httplib
conn = httplib.HTTPConnection("www.python.org")
conn.request("HEAD", "/")
r1 = conn.getresponse()
print r1.status, r1.reason

imprime

200 OK

bien sûr, seulement si www.python.org est en haut.

9
répondu OscarRyz 2009-12-22 21:44:21
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
6
répondu Evan Fosmark 2013-11-14 16:38:20

l'objet HTTPConnection du module httplib de la bibliothèque standard fera probablement l'affaire pour vous. BTW, si vous commencez à faire quelque chose de avancé avec HTTP en Python, assurez-vous de vérifier httplib2 ; c'est une grande bibliothèque.

4
répondu Hank Gay 2009-12-22 21:34:44
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')

Travaille sur Python 3

4
répondu Christopher Punton 2016-07-01 14:15:00

si par up, vous voulez simplement dire" le serveur sert", alors vous pouvez utiliser cURL, et si vous obtenez une réponse que c'est en place.

Je ne peux pas vous donner de conseil spécifique car je ne suis pas un programmeur python, cependant voici un lien vers pycurl http://pycurl.sourceforge.net / .

2
répondu Tyler Smith 2009-12-22 21:34:12

si le serveur est désactivé, sur Python 2.7 x86, les urllib windows n'ont pas de délai d'attente et le programme est verrouillé. Ainsi, utilisez 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
répondu themadmax 2017-10-06 09:41:03

Bonjour cette classe peut faire un test de vitesse et de up pour votre page Web avec cette classe:

 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
répondu Manouchehr Rasouli 2017-08-21 06:59:16

voici ma solution en utilisant PycURL et 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
répondu techouse 2016-12-06 12:38:52

vous pouvez utiliser requests bibliothèque pour trouver si le site web est up i.e. status code comme 200

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

>> 200
0
répondu Harry_pb 2018-08-12 03:16:01