そこで、次のコード スニペットを使用して Web ページの一部を取得し、解析しています (この問題とは関係ありません)。
def load_max_resp(self, resp, size=4096):
it = resp.iter_content()
file_str = StringIO()
for i in xrange(size):
try:
file_str.write(it.next())
except StopIteration:
break
return file_str.getvalue()
resp 要素には以下がロードされます。
resp = requests.get(url, stream=True)
このコードの断片は、自分のマシン/ネットワークで適切に動作します。まったく問題ありません。ただし、サーバーにアップロードするとiter_content()
、空のイテレータが返されることがあります(it.next()
初めて呼び出すと、StopIteration
例外としてスローされます)。これは、一部の (実際にはほとんどの) Web サイトでのみ発生し、常に同じです。
コンソール/インタープリターでテストしましたが、stream=True
パラメーターを削除すると意図したとおりに機能しますが、ページから最大量のバイトのみをダウンロードする必要があるため (ネットワークの輻輳を回避するため)、パラメーターを削除できません。pip から最新の requests パッケージにアップグレードし、開発マシンと運用マシンでライブラリが同じであることを確認しました。
私の推測では、ストリーム接続を停止する Linux フラグがどこかにあるのではないでしょうか? (開発マシンで ubuntu を使用し、運用サーバーで Debian wheezy を使用します)。
または、リソースの最大許容戻り値を指定する HTTP リクエスト (GET) を作成するにはどうすればよいですか? 一部の Web サイトには content-length がないため、ヘッダーをテストできません。