【问题标题】:Check in Python if URL exists如果 URL 存在,请检查 Python
【发布时间】:2014-12-04 02:51:47
【问题描述】:

关于这个主题有很多关于 SO 的问题,但没有一个回答以下问题。使用 Python 请求检查正常的 URL 可以很容易地完成,如下所示:

print requests.head('https://www.facebook.com/pixabay').status_code

状态码 200 表示页面存在。在这种特殊情况下,它是 Facebook 上的粉丝页面。

在 Facebook 上使用普通用户个人资料进行尝试也可以:

print requests.head('https://www.facebook.com/steinberger.simon').status_code

但是,尽管普通浏览器返回 200,但仍有(看似随机的)用户配置文件会导致 404 状态代码:

print requests.head('https://www.facebook.com/drcarl').status_code

使用带有 User-Agent 字符串的自定义标头或使用其他方法检查 URL 都以同样的方式失败:

import requests, urllib, urllib2

url = 'https://www.facebook.com/drcarl'

print requests.head(url).status_code

# using an User-Agent string
headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1700.107 Safari/537.36' }
print requests.head(url, headers=headers).status_code

# using GET instead if HEAD as request method
print requests.get(url, stream=True).status_code

# using urllib
print urllib.urlopen(url).getcode()

# using urllib2
try:
    r = urllib2.urlopen(url)
    print r.getcode()
except urllib2.HTTPError as e:
    print e.code

还有其他 URL 示例使用上述方法莫名其妙地失败了。其中之一是:http://www.rajivbajaj.net/ 它与所有浏览器中的 200 状态代码完美配合,但对于上述所有 Python 方法,结果为 403。

我正在尝试编写一个可靠的 URL 验证器,但我不明白为什么这些 URL 没有通过这些测试。有什么想法吗?

【问题讨论】:

  • 你应该向 Facebook 询问他们的 HTTP API(如果有的话)。如果 HEADGET 在 Python(或 curl)中返回 404 Not Found,我们无能为力。
  • 我无法重现您的错误,总是得到 200。尝试在任何请求之前使用 logging.basicConfig(level=logging.DEBUG) 调试请求。
  • 记录没有给出任何新的结果。但是,我找到了 FB URL 失败的原因:未在 Facebook 上进行身份验证时,非公开个人资料返回为 404。

标签: python facebook url http-status-code-404 python-requests


【解决方案1】:

我认为浏览器和python写代码的区别在于底层的HTTP请求。 python代码不能工作应该是因为构造的HTTP请求与浏览器生成的不完全一样。

添加客户标题(使用您提供的)

print requests.get(url, headers=headers).status_code

它适用于我的本地 url http://www.rajivbajaj.net/,获得 200。

在这个例子中,我猜网站对一些用户代理做了一些特别的事情。

【讨论】:

  • lol 我不相信这个!这可能是我似乎错过的唯一请求方法+标头的组合!例如。 HEAD 请求不适用于此标头 - 仍然是 403。谢谢 Jacky!顺便说一句:我还找到了 Facebook 问题的原因:当未经身份验证时,Facebook 会为非公开个人资料发出 404。Facebook 奇怪地不正确,但好吧,如果有人知道...
【解决方案2】:

下面的代码会帮助你:

def check_site_exist(self, url):
    try:
        url_parts = urlparse(url)
        request = requests.head("://".join([url_parts.scheme, url_parts.netloc]))
        return request.status_code == HTTPStatus.OK
    except:
        return False

【讨论】:

  • 答案在显示所需的导入时更有帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-29
  • 1970-01-01
  • 1970-01-01
  • 2015-10-05
相关资源
最近更新 更多