web-dev-qa-db-de.com

Überprüfen, ob eine Website über Python verfügbar ist

Wie kann ich mithilfe von Python überprüfen, ob eine Website aktiv ist? Nach dem, was ich lese, muss ich den "HTTP HEAD" überprüfen und den Statuscode "200 OK" sehen, aber wie?

Prost

Verbunden

45
Hellnar

Sie könnten dies mit getcode() von urllib versuchen. 

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

EDIT: Für modernere Pythons, d. H. python3, verwenden Sie: 

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

Ich denke, der einfachste Weg ist die Verwendung von Requests module.

import requests

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

Sie können httplib verwenden.

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

druckt

200 OK

Natürlich nur wenn www.python.org läuft.

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

Funktioniert auf Python 3

5

Das HTTPConnection object aus dem httplib-Modul in der Standardbibliothek wird wahrscheinlich den Trick für Sie tun. Übrigens, wenn Sie mit HTTP etwas fortgeschrittenes in Python anfangen, sollten Sie unbedingt httplib2 auschecken. Es ist eine großartige Bibliothek.

4
Hank Gay

Wenn der Server heruntergefahren ist, haben urllib auf Python 2.7 x86 keine Zeitüberschreitung und das Programm wird in den Deadlock versetzt. Verwenden Sie also 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

Wenn Sie mit "up" den Begriff "Server bereitstellen" meinen, könnten Sie cURL verwenden, und wenn Sie eine Antwort erhalten, ist diese aktiv.

Ich kann Ihnen keine spezifischen Ratschläge geben, da ich kein Python-Programmierer bin. Hier ist jedoch ein Link zu pycurl http://pycurl.sourceforge.net/ .

2
Tyler Smith

Hallo, diese Klasse kann mit dieser Klasse einen Geschwindigkeits- und Aufnahmetest für Ihre Webseite durchführen:

 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

Requests und httplib2 sind großartige Optionen:

# 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

Wenn Sie Ansible verwenden, können Sie die Funktion fetch_url verwenden:

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

Sie können die Bibliothek requests verwenden, um herauszufinden, ob die Website aktiv ist, d. H. status code als 200.

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

>> 200
0
Harry_pb

Hier ist meine Lösung mit PycURL und Validatoren

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