Python - 检查文件/网页是否存在

0 投票
3 回答
2737 浏览
提问于 2025-04-18 04:32

我想用Python来检查一个文件或网页是否存在,主要是通过它的响应代码来判断,并根据结果采取相应的行动。不过,我有一个要求,就是必须使用HTTPS,并且需要提供用户名和密码。我尝试用curl来实现,但它对HTTPS不太友好,所以没能成功。不过,我用wget成功了,使用了--spider、--user和--password这些选项。我想我可以通过os.system把wget放进脚本里,但它输出的信息很多,解析起来会很麻烦,而且如果URI不存在(也就是404错误),它可能会卡在“等待响应...”的状态。

我在网上查了一下urllib2,看到有人做了一些相关的事情,但我不确定这些是否适合我的情况,而且那些解决方案总是很复杂(比如Python urllib2,基本HTTP认证和tr.im)。总之,如果能给我一些关于用Python实现这个功能的简单建议,我会非常感激。

补充:使用os.system的方法,并给wget加上“-q”选项,似乎可以根据URI是否存在返回不同的数字,这样我就有了一些可以利用的信息。

3 个回答

0

你应该使用 urllib2 来检查这个:

import urllib2, getpass
url = raw_input('Enter the url to search: ')
username = raw_input('Enter your username: ')
password = getpass.getpass('Enter your password: ')
if not url.startswith('http://') or not url.startswith('https://'):
        url = 'http://'+url

def check(url):
        try:
                urllib2.urlopen(url)
                return True
        except urllib2.HTTPError:
                return False

if check(url):
        print 'The webpage exists!'
else:
        print 'The webpage does not exist!'

opener = urllib2.build_opener(
urllib2.HTTPSHandler())
opener.open(url,data="username=%s&password=%s" %(username, password))

这段代码运行的结果是:

bash-3.2$ python url.py
Enter the url to search: gmail.com
Enter your username: aj8uppal
Enter your password: 
The webpage exists!
5

你可以使用Python的requests库来发送一个HEAD请求。

import requests
r = requests.head('http://google.com/sjklfsjd', allow_redirects=True, auth=('user', 'pass'))
assert r.status_code != 404

如果请求失败并出现ConnectionError,那说明这个网站不存在。如果你只是想检查某个页面是否存在,你会收到一个成功的响应,但状态码会是404,这表示页面找不到。

requests库的界面非常友好,所以我推荐你去试试。你可能会非常喜欢它,因为它既直观又强大,而且使用起来也很轻便。

1

urllib2 是打开任何网页的好方法。

urllib2.urlopen('http://google.com')

如果你想要更多功能,就需要一个带有处理器的打开器。我觉得你只需要 https,因为你几乎不需要提取任何信息。

opener = urllib2.build_opener(
    urllib2.HTTPSHandler())
opener.open('https://google.com')

添加数据后,它会自动变成一个 POST 请求,我是这么认为的:

opener.open('https://google.com',data="username=bla&password=da")

你收到的对象会有一个 code 属性。

这就是基本的内容,你可以添加尽可能多的处理器,我相信这样做不会有坏处。

来源: https://docs.python.org/2.7/library/urllib2.html#httpbasicauthhandler-objects

撰写回答