Скрипт 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 ответа:
Как насчет этого:
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