如果URL存在,请检入Python

时间:2014-10-09 08:40:23

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

关于这个主题有很多关于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

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

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

还有其他网址的例子,上述方法令人费解。其中之一是:http://www.rajivbajaj.net/ 它与所有浏览器中的200状态代码完美配合,但对于上述所有Python方法,结果为403。

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

2 个答案:

答案 0 :(得分:2)

我认为浏览器和python编写代码之间的区别是底层的HTTP请求。 python代码无法工作,因为构造的HTTP请求与浏览器生成的请求不完全相同。

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

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

它可以在我的本地方面使用网址 http://www.rajivbajaj.net/ ,获得200。

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

答案 1 :(得分:0)

以下代码可以帮助您

    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;