Подтвердить что ты не робот

Python проверяет, существует ли сайт

Я хотел проверить, существует ли какой-то веб-сайт, это то, что я делаю:

user_agent = 'Mozilla/20.0.1 (compatible; MSIE 5.5; Windows NT)'
headers = { 'User-Agent':user_agent }
link = "http://www.abc.com"
req = urllib2.Request(link, headers = headers)
page = urllib2.urlopen(req).read() - ERROR 402 generated here!

Если страница не существует (ошибка 402 или любые другие ошибки), что я могу сделать в строке page = ..., чтобы убедиться, что страница, которую я читаю, завершает работу?

4b9b3361

Ответ 1

Вы можете использовать HEAD-запрос вместо GET. Он будет загружать только заголовок, но не контент. Затем вы можете проверить статус ответа из заголовков.

import httplib
c = httplib.HTTPConnection('www.example.com')
c.request("HEAD", '')
if c.getresponse().status == 200:
   print('web site exists')

или вы можете использовать urllib2

import urllib2
try:
    urllib2.urlopen('http://www.example.com/some_page')
except urllib2.HTTPError, e:
    print(e.code)
except urllib2.URLError, e:
    print(e.args)

или вы можете использовать requests

import requests
request = requests.get('http://www.example.com')
if request.status_code == 200:
    print('Web site exists')
else:
    print('Web site does not exist') 

Ответ 2

Лучше проверить, что код состояния <400, как это было сделано здесь. Вот что означают коды статуса (взяты из Википедии):

  • 1xx - информационный
  • 2xx - успех
  • 3xx - перенаправление
  • 4xx - ошибка клиента
  • 5xx - ошибка сервера

Если вы хотите проверить, существует ли страница, и не хотите загружать всю страницу целиком, вы должны использовать Head Request:

import httplib2
h = httplib2.Http()
resp = h.request("http://www.google.com", 'HEAD')
assert int(resp[0]['status']) < 400

взято из этого ответа.

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

import requests

response = requests.get('http://google.com')
assert response.status_code < 400

Смотрите также похожие темы:

Надеюсь, это поможет.

Ответ 3

from urllib2 import Request, urlopen, HTTPError, URLError

user_agent = 'Mozilla/20.0.1 (compatible; MSIE 5.5; Windows NT)'
headers = { 'User-Agent':user_agent }
link = "http://www.abc.com/"
req = Request(link, headers = headers)
try:
        page_open = urlopen(req)
except HTTPError, e:
        print e.code
except URLError, e:
        print e.reason
else:
        print 'ok'

Чтобы ответить на комментарий unutbu:

Поскольку обработчики по умолчанию обрабатывают переадресацию (коды в диапазоне 300), а коды в диапазоне 100-299 указывают на успех, вы обычно увидите только коды ошибок в диапазоне 400-599. Источник

Ответ 4

код:

a="http://www.example.com"
try:    
    print urllib.urlopen(a)
except:
    print a+"  site does not exist"

Ответ 5

@Adem Öztaş предлагает отличный ответ для использования с httplib и urllib2. Для requests, если вопрос строго о существовании ресурса, то ответ может быть улучшен в случае существования большого ресурса.

Предыдущий ответ на requests предполагал что-то вроде следующего:

def uri_exists_get(uri: str) -> bool:
    try:
        response = requests.get(uri)
        try:
            response.raise_for_status()
            return True
        except requests.exceptions.HTTPError:
            return False
    except requests.exceptions.ConnectionError:
        return False

requests.get пытается вытащить весь ресурс сразу, поэтому для больших медиа файлов приведенный выше фрагмент будет пытаться вытащить весь медиа файл в память. Чтобы решить эту проблему, мы можем передать ответ.

def uri_exists_stream(uri: str) -> bool:
    try:
        with requests.get(uri, stream=True) as response:
            begin = datetime.utcnow()
            try:
                response.raise_for_status()
                return True
            except requests.exceptions.HTTPError:
                return False
    except requests.exceptions.ConnectionError:
        return False

Я запустил приведенные выше фрагменты с таймерами, прикрепленными к двум веб-ресурсам:

1) http://bbb3d.renderfarming.net/download.html, очень легкая html-страница

2) http://distribution.bbb3d.renderfarming.net/video/mp4/bbb_sunflower_1080p_30fps_normal.mp4, видео файл приличного размера

Сроки результаты ниже:

uri_exists_get("http://bbb3d.renderfarming.net/download.html")
# Completed in: 0:00:00.611239

uri_exists_stream("http://bbb3d.renderfarming.net/download.html")
# Completed in: 0:00:00.000007

uri_exists_get("http://distribution.bbb3d.renderfarming.net/video/mp4/bbb_sunflower_1080p_30fps_normal.mp4")
# Completed in: 0:01:12.813224

uri_exists_stream("http://distribution.bbb3d.renderfarming.net/video/mp4/bbb_sunflower_1080p_30fps_normal.mp4")
# Completed in: 0:00:00.000007

И последнее замечание: эта функция также работает в том случае, если хост ресурса не существует. Например, "http://abcdefghblahblah.com/test.mp4" вернет False.

Ответ 6

def isok(mypath):
    try:
        thepage = urllib.request.urlopen(mypath)
    except HTTPError as e:
        return 0
    except URLError as e:
        return 0
    else:
        return 1

Ответ 7

Попробуй это::

import urllib2  
website='https://www.allyourmusic.com'  
try:  
    response = urllib2.urlopen(website)  
    if response.code==200:  
        print("site exists!")  
    else:  
        print("site doesn't exists!")  
except urllib2.HTTPError, e:  
    print(e.code)  
except urllib2.URLError, e:  
    print(e.args)