Comprobando si un sitio web está arriba a través de Python

Al usar python, ¿cómo puedo verificar si un sitio web está funcionando? Por lo que leí, debo verificar “HTTP HEAD” y ver el código de estado “200 OK”, pero ¿cómo hacerlo?

Aclamaciones

Relacionado

  • ¿Cómo se envía una solicitud HEAD HTTP en Python?

Puedes intentar hacer esto con getcode() desde urllib

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

EDITAR: Para python más moderno, es decir, python3 , use:

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

Creo que la forma más fácil de hacerlo es mediante el uso del módulo Solicitudes .

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

Puedes usar httplib

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

huellas dactilares

 200 OK 

Por supuesto, solo si www.python.org está activo.

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

Funciona en Python 3

El objeto httplib módulo httplib en la biblioteca estándar probablemente hará el truco por usted. Por cierto, si empiezas a hacer algo avanzado con HTTP en Python, asegúrate de revisar httplib2 ; Es una gran biblioteca.

Si el servidor está inactivo, en Python 2.7 x86, las ventanas no tienen tiempo de espera y el progtwig se bloquea. Entonces usa 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 

Si por arriba, simplemente quiere decir “el servidor está sirviendo”, entonces podría usar cURL, y si obtiene una respuesta de lo que está arriba.

No puedo darte consejos específicos porque no soy un progtwigdor de Python, sin embargo, aquí hay un enlace a pycurl http://pycurl.sourceforge.net/ .

Hola, esta clase puede hacer una prueba de velocidad y hasta para su página web con esta clase:

  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) 

Puede usar la biblioteca de requests para averiguar si el sitio web está activo, es decir status code como 200

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

Aquí está mi solución usando PycURL y validadores

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