Скрипт Python, чтобы увидеть, существует ли веб-страница без загрузки всей страницы?


Я пытаюсь написать скрипт для проверки на наличие веб-страницы, было бы неплохо, если бы он проверял без загрузки всей страницы.

Это моя точка отсчета, я видел множество примеров использования httplib таким же образом, однако каждый сайт, который я проверяю, просто возвращает false.

import httplib
from httplib import HTTP
from urlparse import urlparse

def checkUrl(url):
    p = urlparse(url)
    h = HTTP(p[1])
    h.putrequest('HEAD', p[2])
    h.endheaders()
    return h.getreply()[0] == httplib.OK

if __name__=="__main__":
    print checkUrl("http://www.stackoverflow.com") # True
    print checkUrl("http://stackoverflow.com/notarealpage.html") # False

Есть идеи?

Править

Кто-то предложил это, но их сообщение было удалено.. позволяет ли urllib2 избежать загрузки всей страницы целиком?

import urllib2

try:
    urllib2.urlopen(some_url)
    return True
except urllib2.URLError:
    return False
4 15

4 ответа:

Как насчет этого:

import httplib
from urlparse import urlparse

def checkUrl(url):
    p = urlparse(url)
    conn = httplib.HTTPConnection(p.netloc)
    conn.request('HEAD', p.path)
    resp = conn.getresponse()
    return resp.status < 400

if __name__ == '__main__':
    print checkUrl('http://www.stackoverflow.com') # True
    print checkUrl('http://stackoverflow.com/notarealpage.html') # False

Это отправит запрос HTTP HEAD и вернет True, если код состояния ответа

    Обратите внимание, что корневой путь StackOverflow возвращает перенаправление (301), а не 200 OK.

Используя requests, это так же просто, как:

import requests

ret = requests.head('http://www.example.com')
print(ret.status_code)

Это просто загружает заголовок веб-сайта. Чтобы проверить, было ли это успешно, вы можете проверить результаты status_code. Или используйте метод raise_for_status, который вызывает Exception, Если соединение не было успешным.

Как насчет этого.

import requests

def url_check(url):
    #Description

    """Boolean return - check to see if the site exists.
       This function takes a url as input and then it requests the site 
       head - not the full html and then it checks the response to see if 
       it's less than 400. If it is less than 400 it will return TRUE 
       else it will return False.
    """
    try:
            site_ping = requests.head(url)
            if site_ping.status_code < 400:
                #  To view the return status code, type this   :   **print(site.ping.status_code)** 
                return True
            else:
                return False
    except Exception:
        return False

Вы можете попробовать

import urllib2

try:
    urllib2.urlopen(url='https://someURL')
except:
    print("page not found")