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 = ...
, чтобы убедиться, что страница, которую я читаю, завершает работу?
Ответы
Ответ 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)