さまざまな番組ホストからの BBC ポッドキャストのコレクション全体を DL するためのスクリプトを作成しています。私のスクリプトでは、BS4、Mechanize、および wget を使用しています。
URL の要求がサーバーから「404」の応答コードを生成するかどうかをテストする方法を知りたいです。以下の関数を書きました。
def getResponseCode(br, url):
print("Opening: " + url)
try:
response = br.open(url)
print("Response code: " + str(response.code))
return True
except (mechanize.HTTPError, mechanize.URLError) as e:
if isinstance(e,mechanize.HTTPError):
print("Mechanize error: " + str(e.code))
else:
print("Mechanize error: " + str(e.reason.args))
return False
Browser()
オブジェクトと URL 文字列を渡します。True
応答が '404' であるか '200' であるかに応じて、またはを返しますFalse
(実際には、Mechanize は、'200' 以外の場合は例外をスローし、例外処理を行います)。
main()
私は基本的に、BS4 でスクレイピングした URL のリストから多数の URL を渡すこの関数をループしています。関数が戻っTrue
たら、MP3 のダウンロードに進みますwget
。
しかし。私の問題は次のとおりです。
br.open(<URL>)
URL はリモート サーバー上のポッドキャスト MP3 ファイルへの直接パスであり、URL が使用可能になるとハングすることに気付き ました。これは、Mechanize がサーバーから実際のデータをキャッシュ/ダウンロードしているためだと思われます。応答コードが「200」の場合に True を返したいだけなので、これは必要ありません。キャッシュ/DLせずに応答コードをテストするにはどうすればよいですか?
使用してみbr.open_novisit(url, data=None)
ましたが、ハングはまだ続きます...