Краткое руководство по скачиванию интернета на дискетку.

Oct 29, 2007 23:35

Задача - смотреть googlemaps родного города с приличной скоростью, но при этом интернет-радио не должно заикаться от нехватки канала.
Очевидное решение - локальный кэш.
Ключевые слова: nginx, PAC, bash, perl.

0. понять нумерацию картинок в гугле.

kh${srv}.google.com/kh?n=404&v=${version}&t=${img_name}

srv - номер сервера на момент поста изменялся от 0 до 3
version - глобальная версия карт, т.е. номер версии увеличивается даже если меняется только часть карты. Например, для Омска карты версий 20 и 21 совпадают.
Что такое n=404 - вне моего разумения, а разбираться особо не пришлось.
img_name - имя занумерованного кусочка плоской земли

Нумерация оказалась довольно простой, вся земля - это не шар и не геоид, земля плоская - Квадрат t. Далее этот квадрат делится на 4 части в духе

tqtr
ttts

Потом на 16 частей.

tqqtqrtrqtrr
tqttqstrttrs
ttqttrtsqtsr
tttttststtss

И так далее до длины имени квадрата в 20 симоволов (макимальный уровень детализации).

1. скачать гугль.

Я набросал тривиальную качалку всея гугля и запустил её на далеком серваке.
ITER_MAX - кол-во попыток, которые скрипт будет предпренимать, чтоб скачать картинку.
TAIL_MAX задает глубину рекурсии относительно некоторого базового квадрата, который передается функции getmap

В конце файла видно, что я выбрал 12 квадратов 12го увеличения и хочу скачать их на глубину 7 (т.е. до 19го увеличения включительно).

Если боитесь, что вас забанят в гугле за черезмерную активность по скачиванию планеты себе на жесткий диск - также реализуйте ф-ции _proxify и _change_proxy.

Также можно потом поправить скрипт отрисовывающий качество покрытия для визуализации детальности кэша.
Например, у меня получилось так:


И это занимало около двух гигабайт и покрыло вот такую территорию.

2. настроить локальный кэш

Ставим nginx версии не ниже 0.5.31 (которая включает замечательную возможность - proxy_store) и конфигуряем его примерно так, как сконфигурял его я. :)
Замечания по конфигу приветствуются (кроме вопроса, когда же в proxy_pass будет возможно использование хотя бы адекватного набора констант).

3. заставить браузер ходить в кэш

Скормить браузеру примерно такой файл авто-конифгурации proxy:

function FindProxyForURL(url, host) {
if (host.match('kh[0-9]+\.google\.com'))
return 'PROXY 127.0.0.1:1234';
return 'DIRECT';
}
Во всяком случае данный пример работает с firefox.

pac, perl, linux, nginx, google, bash, howto

Previous post Next post
Up