したがって、トルネードでこれを行う方法はわかりません(経験はまったくありません)が、Flaskで例を挙げることができます。
まず第一に、あなたができるようにするプロキシを書くことはとにかくないと思いますhttp://localhost:8000/http://espn.com
. たとえば、Optimizely は使用せずhttp://espn.com
、espn.com
. 同じことをします。
Flask に慣れていない場合は、非常に簡単です。これがあなたができる証明ですlocalhost:8000/espn.com
:
from flask import Flask
app = Flask(__name__)
@app.route('/<uri>')
def fake_proxy(uri):
return uri
if __name__ == '__main__':
app.run(debug=True)
それをファイルに保存してからproxy1.py
実行python proxy1.py
すると、デバッグサーバーが起動し、(ブラウザで)アクセスしてブラウザに出力できhttp://localhost:5000/espn.com
ますespn.com
。成功!
Web サイトのコンテンツを単純に表示するには、return requests.get('http://' + uri).content
. Flask でデフォルトで設定されている content-type はわかりませんが、ほとんどのブラウザーは HTML を検出して適切に表示するため、心配する必要はありません。
これについて正確に知りたい場合は、Flask のドキュメント、特に応答について調べて作業を開始してください。
これをデプロイしたい場合は、デバッグサーバー以外のものを使用する必要があります (つまり、現在実行している方法)。そのため、gunicorn、セロリなど、さまざまなソリューションを検討する必要があります。 .
Twisted でそれを続けたいのであれば、Twisted のドキュメントは素晴らしく、この特定の Flask アプリよりもはるかに難しいことはないと確信しています。
これがどのように機能するかを忘れてしまうと思われる場合は、「/」のルートを追加して、使用情報を返すだけです。動作するのに html の書式設定さえ必要ありません。
編集
OP のコメントの後、私は彼の質問を完全には理解していないことに気付きました。これは、より良いことをするための試みです。
Content-Types、Content-Lengths、およびその他のヘッダーを適切に設定するには、リクエストから Response オブジェクトを実際に保存する必要があります。たとえば、次のコードを見てください。
import requests
r = requests.get('http://httpbin.org/get')
次に、headers 属性を見てください。
r.headers
応答で返されるヘッダーのディクショナリ (大文字と小文字を区別せずにアクセスできます) です。そこにある 1 つのヘッダーはSet-Cookie
ヘッダーです (スクレイピングしているサイトが Cookie を設定すると仮定します)。
Cookie も設定しているため、新しい Cookie を適切に構築して、サイトのサイトに干渉せず、RFC が意図したとおりに適切に追加できるようにする必要があります。
そこにある辞書には、送信する必要があると見なされるContent-Length
、Content-Type
、およびその他すべてのヘッダーがあります。好きなように転送してください。
また、私は Optimizely であまり遊んでいませんでしたが、ページ上のリンクをクリックすることでサイトを離れることはなかったと思います。上記の単純な例では、プロキシを離れることになります。とは言っても、あなたはすでにその事件をそのまま処理しているようですので、私の助けは必要ありません。
Optimizely が実際にどのように機能しているかについては、読み込み、編集、表示に大量の JavaScript を使用していると思われます。すべてが、その使用のために設計された「内部」API ( ) を通過するように見えるedit.optimizely.com
ため、すべてが 1 か所で発生しているわけではありません。
彼らの API がどのように設計されたのか、どのように機能するのかはわかりませんが、傍受されたパケットを十分に受信して、彼らが何をしているのか、API がどのように見えるのかを判断できれば、トラフィックを盗聴し、おそらくそれをいじることができるのではないかと思います。
requests がこれに適したライブラリであるかどうかについて: requests は (おそらく、自分でテストしたことはありません) urllib2 よりもはるかに高速です。これは、スレッド化された状況とスレッド化されていない (または greenlet の) 状況でうまく機能します。セッション オブジェクトを使用すると、espn.com
(たとえば) によって設定されたすべての Cookie が保存され、Cookie が設定されていないことを ESPN が通知してもナビゲーションが妨げられることはありません。しかし実際には、それがあなたが構築しているツールに適したライブラリであるかどうかはわかりません. それは完全にあなたの呼びかけです。