73

特定のWebサイトが存在するかどうかを確認したかったのですが、これが私がやっていることです:

user_agent = 'Mozilla/20.0.1 (compatible; MSIE 5.5; Windows NT)'
headers = { 'User-Agent':user_agent }
link = "http://www.abc.com"
req = urllib2.Request(link, headers = headers)
page = urllib2.urlopen(req).read() - ERROR 402 generated here!

page = ...ページが存在しない場合 (エラー 402 またはその他のエラー)、読んでいるページが終了していることを確認するために行で何ができますか?

4

9 に答える 9

134

GET の代わりに HEAD リクエストを使用できます。ヘッダーのみをダウンロードし、コンテンツはダウンロードしません。その後、ヘッダーから応答ステータスを確認できます。

Python 2.7.x の場合、以下を使用できますhttplib

import httplib
c = httplib.HTTPConnection('www.example.com')
c.request("HEAD", '')
if c.getresponse().status == 200:
   print('web site exists')

またはurllib2:

import urllib2
try:
    urllib2.urlopen('http://www.example.com/some_page')
except urllib2.HTTPError, e:
    print(e.code)
except urllib2.URLError, e:
    print(e.args)

または2.7および3.xの場合、インストールできますrequests

import requests
response = requests.get('http://www.example.com')
if response.status_code == 200:
    print('Web site exists')
else:
    print('Web site does not exist') 
于 2013-05-27T18:11:34.077 に答える
47

ここで行われたように、ステータス コードが < 400 であることを確認することをお勧めします。ステータスコードの意味は次のとおりです(ウィキペディアから取得):

  • 1xx- 情報提供
  • 2xx- 成功
  • 3xx- リダイレクト
  • 4xx- クライアント エラー
  • 5xx- サーバーエラー

ページが存在するかどうかを確認したいが、ページ全体をダウンロードしたくない場合は、Head Requestを使用する必要があります。

import httplib2
h = httplib2.Http()
resp = h.request("http://www.google.com", 'HEAD')
assert int(resp[0]['status']) < 400

この回答から取得。

ページ全体をダウンロードしたい場合は、通常のリクエストを行い、ステータス コードを確認してください。リクエストの使用例:

import requests

response = requests.get('http://google.com')
assert response.status_code < 400

同様のトピックも参照してください。

それが役立つことを願っています。

于 2013-05-27T18:35:39.067 に答える
9
from urllib2 import Request, urlopen, HTTPError, URLError

user_agent = 'Mozilla/20.0.1 (compatible; MSIE 5.5; Windows NT)'
headers = { 'User-Agent':user_agent }
link = "http://www.abc.com/"
req = Request(link, headers = headers)
try:
        page_open = urlopen(req)
except HTTPError, e:
        print e.code
except URLError, e:
        print e.reason
else:
        print 'ok'

unutbu のコメントに答えるには:

デフォルトのハンドラーはリダイレクト (300 の範囲のコード) を処理し、100 から 299 の範囲のコードは成功を示すため、通常は 400 から 599 の範囲のエラー コードのみが表示されます。 ソース

于 2013-05-27T18:38:16.940 に答える
5

コード:

a="http://www.example.com"
try:    
    print urllib.urlopen(a)
except:
    print a+"  site does not exist"
于 2013-10-04T10:39:49.483 に答える