🥅

HTTPSで、コンテンツの先頭一部のみを取得して通信量を節約する in Python

に公開

私は技術的問題に引っかかると英語で検索しがちなので、英語でもタイトル相当のことを書いておきます
Request partial content with HTTP in Python to reduce communication amount when using commercial proxy


はじめに

RSSがない上にデータセンタからからアクセスするとAkamaiによりブロックされるサイトがありまして。

仕方ないので従量制のプロキシサービスを通して定期的に取得して更新がないか確認しているのですが、この通信量を削減したい(コストを下げたい)と考えました。

当然のようにLast-Modified(最終更新ヘッダ)なんていう便利なものもなく、そもそもHEADリクエストさえ弾かれます。rangeリクエストなんてもってのほかです。

そこで、新しい記事は上に来るので、通信を無理やり途中で切断することにしました。

これにより通信量を300KB→30KBまで削減することに成功しました。15分おきに叩いているので、10分の1になるのは地味に大きいです。

方法

Pythonの requests モジュールを使用します。

REQUEST_BYTES = 15000 # だいたいリクエストしたいバイト数を指定。パケット単位で来るので、大きい方に誤差が出ます
r = requests.get(uri, headers=headers, proxies=proxies, stream=True) # stream=Trueが今回のミソ
resp = ''
for chunk in r.iter_content(REQUEST_BYTES, decode_unicode=True):
    r.close() # ここでいきなりコネクションを切る
    resp = chunk
    break

もう少しマシなコードがあったら教えてください。試行錯誤するとお金がかかるのであんまりガチャガチャしてません。

stream=Trueにすると、ジェネレータで同期的にリクエストを管理できるため、このようなことができます。

パケットを見てみると、こちらからFINを送っておらず、5秒ほどしてタイムアウトで相手からFINが帰っていました。あんまりお行儀は良くない。

socketでTLS通信を扱う元気はなかったので、勘弁してくれ…

Discussion