Проверка работоспособности сайта через Python - PullRequest
49 голосов
/ 23 декабря 2009

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

Приветствия

Относящиеся

Ответы [ 11 ]

79 голосов
/ 23 декабря 2009

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

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

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

import urllib.request
print(urllib.request.urlopen("http://www.stackoverflow.com").getcode())
>>> 200
15 голосов
/ 01 апреля 2013

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

import requests

def url_ok(url):
    r = requests.head(url)
    return r.status_code == 200
9 голосов
/ 23 декабря 2009

Вы можете использовать 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 поднялся.

7 голосов
/ 23 декабря 2009
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
5 голосов
/ 01 июля 2016
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')

Работает на Python 3

4 голосов
/ 23 декабря 2009

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

2 голосов
/ 06 октября 2017

Если сервер не работает, на python 2.7 x86 windows 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     
1 голос
/ 12 августа 2018

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

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

>> 200
1 голос
/ 21 августа 2017

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

 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 голос
/ 23 декабря 2009

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

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

...