ふにゃるんv2

もとは、http://d.hatena.ne.jp/Wacky/

自作のプロキシサーバーを介して、iPodからのWebアクセス速度を上げてみる

iPod touchを使って、ごろ寝しながらWebサーフィン(死語)していたんですが、携帯に最適化されていないWebページを見ると、結構待たされるんですね。
しかも、3ペイン構造になっているのが多くて、ズームイン・ズームアウトを繰り返すのもアホらしい。


携帯(ガラケー)のWebアクセス機能は、アクセス速度こそ遅いものの、少しでもアクセス速度が上がるよう、携帯のキャリア側のサーバーで本来のHTMLを変換して最適化して表示してくれるので、小さい画面でも見やすいし、我慢ならんほど表示が遅い訳でも無い。


2つの良い所と悪い所が頭の中で、シェイクしている内、ふと思った訳です。

iPod touch(iPhoneでも可)で、携帯向けにHTMLを最適化するHTTPプロキシサーバーを介してWebアクセスすれば、サクサクWebサーフィンできるんじゃね?

情報収集

そのものズバリな「携帯向け最適化用HTTPプロキシサーバー」を提供している所は、ぱっと調べた限り見つかりませんでした。
多分、調べ方が悪いんでしょう。(誰か教えて〜)


代わりに、プロキシの代替になるような、ページを変換してくれるWebサービスを提供してくれている所が見つかりました。

まぁ、これだけでもOKかな?と、一瞬思ったのですが、一々見たいページのURLを入力するのも面倒なんですよ。
(ブックマークレットも紹介されているけど、結局ブックマークを開く操作が入るしね)


で、思いついたのが、
「適当な自作プロキシサーバーを作り、iPod touchは、このプロキシサーバーにアクセスさせる。プロキシサーバーは、送られてきたURLを、上記の「Google Mobile Proxy」に転送して、携帯向けWebページに変換させてしまう」
というものです。

自作プロキシを作ってみる

Pythonなら諸先輩方が、何かサンプルコードを作っているだろうと思って検索したら、結構引っかかりました。
日本語系だと、BaseHTTPServerクラスを使うものとTwistedを使うものに、大体2分するようです。


という訳で、今回はid:yattさんの口調変換プロキシが、URLの転送の実例に使えそうなので、ちと拝借して改造してみました。
以下に、早速コードを示します。

#! /bin/env python
# -*- coding: utf-8 -*-

import sys
import BaseHTTPServer
import urllib
import urllib2
import urlparse
import re

TMPL = """<html>
  <body>
    <h1>Proxy Server Error</h1>
    <div>response error to '%(path)s'</div>
    <div>ERROR: <b>%(error)s</b></div>
  </body>
</html>
"""
#urllib.FancyURLopener.version = "Mozilla/4.0" # 素のままだとgoogleやwikipediaに弾かれる
#urllib.FancyURLopener.version = "transApp" # 素のままだとgoogleやwikipediaに弾かれる

class ProxyHandler(BaseHTTPServer.BaseHTTPRequestHandler):
    def error(self, e):
        return  TMPL % dict([("path",self.path), ("error",e)])
    
    def do_GET(self):
        KEY_URL = "http://www.google.co.jp/gwt/"
        print "request:",self.path
        try:
            url = self.path
            if url.find("/gwt/") > 0:
                url = KEY_URL + url[url.find("/gwt/") + 5:]
                print "  change url:", url
            elif url.find(KEY_URL) < 0:
                url = KEY_URL + "n?u=" + url
                print "  make url:", url
            pipe = urllib.urlopen(url)
            content = pipe.read()
        except Exception, e:
            content = self.error(e)
        self.wfile.write(content)
    def do_POST(self):
        BaseHTTPRequestHandler.do_POST()

if __name__ == '__main__':
    serv_addr = ("", 8080)
    print "server address:", serv_addr
    httpd = BaseHTTPServer.HTTPServer(serv_addr, ProxyHandler)
    try:
        httpd.serve_forever()
    except KeyboardInterrupt:
        pass


早速試してみましょう。
作業の流れは、以下のようなものです。

  1. スクリプトを動かすWindows PC(ここでは、普通にWebが見られる環境にあります)の、IPアドレスを調べておきます。
    「ipconfig」をコマンドラインで打ち込めばIPアドレスはわかります。
  2. 上記のコードスクリプトを、PC上で動かします。
    例えば、「python proxy.py」という風に。
  3. iPod touchの設定で、プロキシのIPアドレスとポート欄に、PCの(1.で調べた)IPアドレスと8080番ポートに設定します。
  4. iPod touchのMobile Safariを起動し、http://www.yahoo.co.jp にアクセスします。

すると、以下の画面が出てきました。
2
2 posted by (C)wacky

ちなみに、iPod touchで、プロキシの設定をするには、以下のWeb siteの説明が参考になるでしょう。
(実は切り替えが面倒なので、Pixyというソフトを突っ込んでみたんだが、うまく動かなかったです。何ででしょうね。誰か教えて!)

余談:urllib.FancyURLopener.versionの設定による挙動の差

動き出した後、普通にWebブラウザから表示する場合と、画面の表示の仕方が違う事に気づきました。


↓PCのWebブラウザから表示。
1
1 posted by (C)wacky

↓iPod touchから自作プロキシを介して表示。
2
2 posted by (C)wacky


一番上に表示されるメッセージが英語だったり、画像が出てこなかったりですね。
何でだろうなぁ?と思って、元のコードを見ていたら、「urllib.FancyURLopener.version」の設定値の所で、「素のままだとgoogleやwikipediaに弾かれる」とあったのですね。


この、urllib.FancyURLopener.version って何の設定かいな?と思って調べたら、「User-Agent」の設定値らしい。
んじゃぁ、という訳で、試しにIEなどで使われる「Mozilla/4.0」を設定してみました。

transAppを指定 Mozilla/4.0を指定
2 3
4 5

おぉ、表示される内容に変化が現れました。
ただ、Yahooのページに関して言えば、urllib.FancyURLopener.version の設定値は、「Mozilla/4.0」にしない方が良いです。
「スポーツ」などのページにジャンプしようとすると、転送ページに飛ばされて、結局ジャンプできませんでした。
プロキシのスクリプトコードの改善が必要という事でしょう。

参考:速度比較

何ちゃってですが、自作プロキシを介する事により、どれぐらい早くなるのか、幾つか試してみました。

Webページ 直接 自作プロキシ
Yahoo! 7秒 3秒
Google 6秒 2秒
楽画喜堂 35秒 3秒
まいじゃー推進委員会 14秒 3秒

携帯に最適化していない+画像が一杯のサイトほど、かなりの効果が見込める事が判ります。
まぁ、いわゆるテキストブラウザで閲覧するようなものですからね。(一部画像が付きますが)

余談:プロキシのテスト中に

余談ですが、自作プロキシを導入してテスト中、iPod touchをスタンバイにして暫く放置していたら、以下のメッセージログが。

192.x.x.x - - [03/Jan/2011 22:00:40] code 501, message Unsupported method ('C
ONNECT')
192.x.x.x - - [03/Jan/2011 22:00:44] "CONNECT m.google.com:443 HTTP/1.1" 501
-
192.x.x.x - - [03/Jan/2011 22:01:52] code 501, message Unsupported method ('C
ONNECT')

Wi-Fiを有効にしているとスタンバイにしても、結構バッテリを消費するので、何でだろう?と思っていたんですが、なるほど、数分おきに動いている訳ですね。
そりゃ、バッテリを消費するわ。

まとめ

という訳で、恒例のまとめ というか感想。

  • 携帯用にHTMLデータを加工させる事で、Webサーフィン(死語)は、更にサクサクになります。
  • 何ちゃって自作プロキシサーバーでも、その効果は得られます。

というか、iPod touchのアプリで、携帯向けにHTMLデータを加工するローカル鯖アプリを提供してくれないですかね。
Safariのプロキシ設定をlocalhostに設定して、アプリがプロキシ処理をするの。
現状だと、Jailbreakしないと出来そうもないですなぁ。
(Webサービスでなく、本当のプロキシサーバーでも良いんですけど。一部広告が入るぐらいなら我慢するんだけど…)

2011/1/4追記:

後で気付いたんですが、Opera Mini Web Browserの、携帯向け表示モードって、今回のプロキシ的な動作を行っているんじゃないかな。

技術仕様のページで、Opera's compression serversを経由してインターネットにアクセスって、図が書いてあるし。
出た当時、アクセス速度が3倍速とか評判になってたけど、今回のプロキシ的な処理を施す事で実現しているって事なんでしょうね。

…だとすると、もうちょっと他でもサービス実現してくれるといいのに。ぶちぶち。