【问题标题】:urllib2.Request check if URL is reachableurllib2.Request 检查 URL 是否可达
【发布时间】:2014-09-17 03:05:01
【问题描述】:

所以我有以下代码来验证某些 url 是否正确,我只需要 200 响应所以我制作了一个脚本工作正常但它太慢了(:

import urllib2
import string
def my_range(start, end, step):
    while start <= end:
        yield start
        start += step
url = 'http://exemple.com/test/'
y = 1
for x in my_range(1, 5, 1):
 y =y+1 
 url+=str(y)
 print url 
 req = urllib2.Request(url)
 try:
    resp = urllib2.urlopen(req)
 except urllib2.URLError, e:
    if e.code == 404:
        print "404"
    else:
        print "not 404"
 else:
    print "200"
 url = 'http://exemple.com/test/'
body = resp.read()

在此示例中,我假设我的本地主机中有以下目录以及此结果

http://exemple.com/test/2
200
http://exemple.com/test/3
200
http://exemple.com/test/4
404
http://exemple.com/test/5
404
http://exemple.com/test/6
404

所以我搜索了如何更快地做到这一点,我发现了这段代码:

import urllib2
request = urllib2.Request('http://www.google.com/')
response = urllib2.urlopen(request)
if response.getcode() == 200:
   print "200"    

它似乎更快但是当我用 404 测试它时 (http://www.google.com/111) 它给了我这个结果:

Traceback (most recent call last):
  File "C:\Python27\res.py", line 3, in <module>
    response = urllib2.urlopen(request)
  File "C:\Python27\lib\urllib2.py", line 126, in urlopen
    return _opener.open(url, data, timeout)
  File "C:\Python27\lib\urllib2.py", line 400, in open
    response = meth(req, response)
  File "C:\Python27\lib\urllib2.py", line 513, in http_response
    'http', request, response, code, msg, hdrs)
  File "C:\Python27\lib\urllib2.py", line 438, in error
    return self._call_chain(*args)
  File "C:\Python27\lib\urllib2.py", line 372, in _call_chain
    result = func(*args)
  File "C:\Python27\lib\urllib2.py", line 521, in http_error_default
    raise HTTPError(req.get_full_url(), code, msg, hdrs, fp)
urllib2.HTTPError: HTTP Error 404: Not Found

有什么想法吗? 非常感谢您的帮助:)

【问题讨论】:

  • 为什么不直接使用 try/except 语句?那应该可以解决问题。另请参阅:stackoverflow.com/questions/1947133/…
  • 我在 5 小时前开始学习 python 哈哈,我只有一点其他语言的经验,一些解释可能会有所帮助,非常感谢 :)

标签: python urllib2


【解决方案1】:

HTTPError 被定义为一系列异常,因此您可以在以下情况下使用 Try/Except:

import urllib2
request = urllib2.Request('http://www.google.com/')
try:
    response = urllib.urlopen(request)
    # do stuff..
except urllib2.HTTPError: # 404, 500, etc..
    pass

您还可以为 urllib2.URLError 添加进一步的 except 子句,该子句涵盖其他(非 HTTP)错误,例如超时。

【讨论】:

  • 非常感谢您的回答,但我有点笨,我想我不知道如何更改您提到的来源:/(ps:我只需要给出 200 响应的 url )
  • 您需要我在答案中添加一些内容吗?使用 Try/Except 将意味着所有 200 个响应都将在我写下评论“# do stuff..”的地方结束,您可以在其中使用它们。 except 子句将捕获所有 HTTP 错误代码并避免堆栈跟踪,例如您在问题中发布的那个。
  • 是的,斯蒂芬,我告诉过你这是我的错,我 5 小时前开始学习 python,我没有这门语言或 http 请求的经验,所以如果你可以在我的代码中重写你的代码,那将非常有帮助^^ 因为我尝试了它并且我有一个语法错误:/(ps 我只需要 200 响应)
猜你喜欢
  • 2015-05-06
  • 1970-01-01
  • 2019-01-22
  • 1970-01-01
  • 1970-01-01
  • 2012-01-14
  • 1970-01-01
  • 2023-01-12
  • 2020-08-21
相关资源
最近更新 更多