查看网页是否存在而不下载整个网页的Python脚本?

查看网页是否存在而不下载整个网页的Python脚本?,python,httplib,urlparse,Python,Httplib,Urlparse,我正在尝试编写一个脚本来测试网页的存在性,如果它能够在不下载整个网页的情况下进行检查,那就太好了 这是我的出发点,我见过多个示例以相同的方式使用httplib,但是,我检查的每个站点都返回false import httplib from httplib import HTTP from urlparse import urlparse def checkUrl(url): p = urlparse(url) h = HTTP(p[1]) h.putrequest('H

我正在尝试编写一个脚本来测试网页的存在性,如果它能够在不下载整个网页的情况下进行检查,那就太好了

这是我的出发点,我见过多个示例以相同的方式使用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
这个怎么样:

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
导入httplib
从URLPRASE导入URLPRASE
def检查url(url):
p=url解析(url)
conn=httplib.HTTPConnection(p.netloc)
连接请求(“头”,p.path)
resp=conn.getresponse()
返回响应状态<400
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
打印检查URL('http://www.stackoverflow.com)#是的
打印检查URL('http://stackoverflow.com/notarealpage.html“)#错
这将发送HTTP HEAD请求,如果响应状态代码<400,则返回True

  • 请注意,StackOverflow的根路径返回重定向(301),而不是200 OK
    • 你可以试试

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

      使用
      请求
      ,这非常简单:

      import requests
      
      ret = requests.head('http://www.example.com')
      print(ret.status_code)
      
      这只是加载网站的标题。要测试此操作是否成功,您可以检查结果
      状态\u code
      。或者使用
      raise\u for_status
      方法,如果连接未成功,该方法将引发
      异常。

      如何

      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
      
      导入请求
      def url_检查(url):
      #描述
      “”“布尔返回-检查站点是否存在。
      此函数将url作为输入,然后请求站点
      head-不是完整的html,然后它检查响应以确定
      小于400。如果小于400,则返回TRUE
      否则它将返回False。
      """
      尝试:
      site\u ping=requests.head(url)
      如果站点状态代码<400:
      #要查看退货状态代码,请键入:*打印(site.ping.status_code)**
      返回真值
      其他:
      返回错误
      除例外情况外:
      返回错误
      
      第二个例子确实存在:)我对重复另一个用户的答案感到内疚,所以你应该检查一下。作为警告,这个问题可能被标记为重复,因为它与其他问题非常相似,尽管这个问题的措辞略有不同。否。响应中有一个实体,但状态代码很清楚:未找到。假设404不能说什么(或者必须有默认的“无聊”错误消息),这是一种误解。这只是意味着你正在寻找的资源不存在,结果证明它实现得很好,因此它给出了一个可读的描述(说“找不到页面”…)。小心,一些Web服务器(例如我的例子中的IIS)不支持HEAD,并且可以响应,例如401而不是200,但返回200时带有GET;在这种情况下,最快的方法是使用请求的stream=True进行部分块下载。它将在不下载文件的情况下执行正确的GET。urlopen将下载整个页面,这是OP试图避免的。您应该添加代码说明。这将有助于未来的访问者查看此答案,并有助于OP.404不会引发异常。需要为else返回False。必须对python3进行相应的更改。导入urllib.parse作为urlparse并导入httplib2。它不是HTTPConnection,而是HTTPConnectionWithTimeout。它不是urlparse,而是urlparse.urlparse。可以返回HTTP 401或403,但URL可能存在。