通过Python检查网站是否已启动

问题描述 投票:0回答:16

通过使用python,我如何检查网站是否已启动?根据我的阅读,我需要检查“HTTP HEAD”并查看状态代码“200 OK”,但该怎么做?

干杯

相关

python http scripting httprequest http-head
16个回答
142
投票

您可以尝试使用

urllib
中的 getcode()

来执行此操作
import urllib.request

print(urllib.request.urlopen("https://www.stackoverflow.com").getcode())
200

对于 Python 2,请使用

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

36
投票

我认为最简单的方法是使用 Requests 模块。

import requests

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

11
投票

您可以使用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
向上。


9
投票
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


8
投票
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
投票

我使用requests来做到这一点,那么它既简单又干净。 您可以定义和调用新函数(通过电子邮件等通知),而不是 print 函数。 Try- except 块是必不可少的,因为如果主机无法访问,那么它将引发很多异常,因此您需要捕获所有异常。

import requests

URL = "https://api.github.com"

try:
    response = requests.head(URL)
except Exception as e:
    print(f"NOT OK: {str(e)}")
else:
    if response.status_code == 200:
        print("OK")
    else:
        print(f"NOT OK: HTTP response code {response.status_code}")

5
投票

您可以使用

requests
库来查找网站是否已启动,即
status code
200

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

>> 200

4
投票
标准库中

HTTPConnection 模块中的

httplib
 对象可能会为您解决问题。顺便说一句,如果您开始在 Python 中使用 HTTP 进行任何高级操作,请务必查看 
httplib2
;这是一个很棒的图书馆。


4
投票
如果服务器宕机,在 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
    

3
投票
在我看来,

caisah的回答遗漏了你问题的一个重要部分,即处理服务器离线的问题。

不过,使用

requests

 是我最喜欢的选择,尽管如此:

import requests try: requests.get(url) except requests.exceptions.ConnectionError: print(f"URL {url} not reachable")
    

1
投票
如果“up”只是指“服务器正在提供服务”,那么您可以使用 cURL,如果收到响应,则表明它已启动。

我无法给你具体的建议,因为我不是Python程序员,但是这里有一个pycurl的链接

http://pycurl.sourceforge.net/.


1
投票
您好,这个课程可以使用这个课程对您的网页进行速度和速度测试:

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
投票

Requestshttplib2 是不错的选择:

# 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

如果使用

Ansible,您可以使用fetch_url函数:

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
    

1
投票
我的2分钱

def getResponseCode(url): conn = urllib.request.urlopen(url) return conn.getcode() if getResponseCode(url) != 200: print('Wrong URL') else: print('Good URL')
    

0
投票
这是我使用

PycURLvalidators 的解决方案

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
投票
有时某些网站在某些国家/地区(例如伊朗)被禁止,您无法直接使用您的 IP 访问它们。因此,我在

this link 中找到了更好的解决方案,它使用 https://www.isitdownrightnow.com 检查您的域,该解决方案使用世界上多个分布式服务器请求您的域。所以你可以使用这个代码:

domain = 'your domain ex:a.com' print(f"checking '{domain}' is up?") isitdown_url = f'https://www.isitdownrightnow.com/check.php?domain={domain}' r = requests.get(isitdown_url) r_text = (r.text.lower().replace('</div>', ' ')) status = (re.compile(f'{domain} is (.*) (?:it is not|and reachable)').search(r_text).group(1).split(' ')[0]) if status == 'down': raise ValueError(f"'{domain}' is down in all the world!please request later!")
    
© www.soinside.com 2019 - 2024. All rights reserved.