web-dev-qa-db-fra.com

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

En utilisant python, comment puis-je vérifier si un site Web est actif? D'après ce que j'ai lu, je dois vérifier "HTTP HEAD" et voir le code d'état "200 OK", mais comment faire?

À votre santé

En relation

45
Hellnar

Vous pouvez essayer de faire ceci avec getcode() de urllib

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

EDIT: Pour un python plus moderne, à savoir python3, utilisez: 

import urllib.request
print(urllib.request.urlopen("http://www.stackoverflow.com").getcode())
>>> 200
69
Anthony Forloney

Je pense que le moyen le plus simple de le faire est d'utiliser Requests module.

import requests

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

Vous pouvez utiliser httplib

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

empreintes

200 OK

Bien sûr, seulement si www.python.org est en place.

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

Fonctionne sur Python 3

5
Christopher Punton

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

4
Hank Gay

Si server est en panne, sur urlib sous Windows 2.7 x86 python, le délai d'expiration est dépassé et le programme passe en verrouillage mort. Alors 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
themadmax

Si vous entendez simplement par "le serveur est en train de servir", vous pouvez utiliser cURL, et si vous obtenez une réponse, elle est active.

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
Tyler Smith

Salut cette classe peut faire un test rapide et rapide 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
Manouchehr Rasouli

Vous pouvez utiliser la bibliothèque requests pour déterminer si le site Web est en place, à savoir status code en tant que 200

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

>> 200
0
Harry_pb

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
techouse