Назад | Перейти на главную страницу

Как лучше всего создать статическую резервную копию веб-сайта?

У меня старая Joomla! сайт, который я хотел бы преобразовать в статический набор HTML-страниц (поскольку он больше не обновляется, и я не хочу накладных расходов, связанных с запуском базы данных MySQL для чего-то, что никогда не обновляется).

Есть ли инструмент командной строки, который может сканировать и загружать весь прямой веб-сайт?

Я только что сделал статические страницы из старой Joomla с помощью этой команды:

wget --adjust-extension --mirror --page-requisites --convert-links http://my.domain.com

Это короткая версия:

wget -E -m -p -k http://my.domain.com

Это сохраняет страницы с .hml расширение и получит (почти) все css, js и файлы изображений, необходимые страницам.

Но я хотел, чтобы на моем статическом зеркале были те же ссылки, что и на исходном. Таким образом, имена файлов не могли иметь .html расширение, которое заставило меня удалить -E вариант.

Затем я обнаружил, что -p вариант (и -k) не будет работать так же, если вы не используете -E . Но используя -E и -p по-прежнему лучший способ получить большую часть page-requisites. Итак, я сделал первую загрузку, удалил все .html файлы, а затем извлекаются заново без -E.

Как вариант -k без -E тоже не все ссылки конвертирует, пришлось сделать некоторые замены. Полный список используемых команд:

# To get almost every thing:
wget --adjust-extension --mirror --page-requisites --convert-links http://my.dommain.com

# Remove files ending with .html:
find my.dommain.com/ -name '*.html*' -exec  rm {} \;

# Get pages without .html extension:
wget --mirror --page-requisites --convert-links http://my.dommain.com

# Check if there are unconverted absolute URL and which are:
grep -lr "http:\/\/my.dommain.com" my.dommain.com/ | sort -u | xargs sed -ne '/http:\/\/my\.dommain\.com/s/.*"http:\/\/\([^"]*\).*/http:\/\/\1/p' | sort -u
# Unconverted absolute URL correspond to missing needed files, so get them:
grep -lr "http:\/\/my.dommain.com" my.dommain.com/ | sort -u | xargs sed -ne '/http:\/\/my\.dommain\.com/s/.*"http:\/\/\([^"]*\).*/http:\/\/\1/p' | sort -u | wget -x -i -
# Then, converter all missing absolute URL to relative:
grep -lr “http:\/\/my.domain.com” my.domain.com/ | sort -u | xargs sed -i -e '/http:\/\/my\.domain\.com/s/http:\/\/my\.domain\.com\/\([^"]*\)/\1/g'

# Converter all URL with "?" into its URL encoding equivalent (%3F):
grep -lr –exclude=*.{css,js} '=\s\{0,1\}”[^?"]*?[^"]*”' my.domain.com/ | sort -u | xargs sed -i -e '/\(=\s\{0,1\}”[^?"]*\)?\([^"]*”\)/s/\(=\s\{0,1\}”[^?"]*\)?\([^"]*”\)/\1%3F\2/g'

Когда я зеркалировал сайт по пути в моем домене, я получил этот файл:

my.domain.com/subsite/index.html

Который index.html был удален моей второй командой, и это нормально. Когда я запустил второй wget он создал файл с тем же именем, что и каталог, и index.php внутри него вроде:

my.domain.com/subsite.1
my.domain.com/subsite/index.php

... и преобразовал (по крайней мере, некоторые) домашние ссылки в subsite.1. Если бы все домашние ссылки были одинаковыми, нужен был бы только один из этих двух файлов. И index.php лучший выбор, так как он автоматически обслуживается, когда клиент запрашивает http://my.domain.com/subsite.

Чтобы решить эту проблему, я запустил:

# To verify if there were links to subsite.1:
grep -r 'subsite\.1' my.domain.com/
# To convert links from subsite.1 to subsite:
grep -lr 'subsite\.1' my.domain.com/ | sort -u | xargs sed -i -e '/subsite\.1/s/\(subsite\)\.1/\1/g'
# Then I could delete the "duplicated" index file:
rm my.domain.com/subsite.1

В конце концов, используя инструмент веб-разработчика (firebug), я обнаружил, что по-прежнему отсутствуют некоторые файлы, которые были включены с помощью javascript или css. Я получил их один за другим.

wget обычно работает.

Страница GNU: https://www.gnu.org/software/wget

Вики: http://wget.addictivecode.org

Пример:

wget.exe -x -r http://www.acmecorp.com

Создает каталог с именем www.acmecorp.com в вашем текущем каталоге и рекурсивно загружает все содержимое.

Есть множество вариантов.

wget --help
GNU Wget 1.11.1, a non-interactive network retriever.
Usage: wget [OPTION]... [URL]...

Mandatory arguments to long options are mandatory for short options too.

Startup:
  -V,  --version           display the version of Wget and exit.
  -h,  --help              print this help.
  -b,  --background        go to background after startup.
  -e,  --execute=COMMAND   execute a `.wgetrc'-style command.

Logging and input file:
  -o,  --output-file=FILE    log messages to FILE.
  -a,  --append-output=FILE  append messages to FILE.
  -d,  --debug               print lots of debugging information.
  -q,  --quiet               quiet (no output).
  -v,  --verbose             be verbose (this is the default).
  -nv, --no-verbose          turn off verboseness, without being quiet.
  -i,  --input-file=FILE     download URLs found in FILE.
  -F,  --force-html          treat input file as HTML.
  -B,  --base=URL            prepends URL to relative links in -F -i file.

Download:
  -t,  --tries=NUMBER            set number of retries to NUMBER (0 unlimits).
       --retry-connrefused       retry even if connection is refused.
  -O,  --output-document=FILE    write documents to FILE.
  -nc, --no-clobber              skip downloads that would download to
                                 existing files.
  -c,  --continue                resume getting a partially-downloaded file.
       --progress=TYPE           select progress gauge type.
  -N,  --timestamping            don't re-retrieve files unless newer than
                                 local.
  -S,  --server-response         print server response.
       --spider                  don't download anything.
  -T,  --timeout=SECONDS         set all timeout values to SECONDS.
       --dns-timeout=SECS        set the DNS lookup timeout to SECS.
       --connect-timeout=SECS    set the connect timeout to SECS.
       --read-timeout=SECS       set the read timeout to SECS.
  -w,  --wait=SECONDS            wait SECONDS between retrievals.
       --waitretry=SECONDS       wait 1..SECONDS between retries of a retrieval.
       --random-wait             wait from 0...2*WAIT secs between retrievals.
       --no-proxy                explicitly turn off proxy.
  -Q,  --quota=NUMBER            set retrieval quota to NUMBER.
       --bind-address=ADDRESS    bind to ADDRESS (hostname or IP) on local host.
       --limit-rate=RATE         limit download rate to RATE.
       --no-dns-cache            disable caching DNS lookups.
       --restrict-file-names=OS  restrict chars in file names to ones OS allows.
       --ignore-case             ignore case when matching files/directories.
       --user=USER               set both ftp and http user to USER.
       --password=PASS           set both ftp and http password to PASS.

Directories:
  -nd, --no-directories           don't create directories.
  -x,  --force-directories        force creation of directories.
  -nH, --no-host-directories      don't create host directories.
       --protocol-directories     use protocol name in directories.
  -P,  --directory-prefix=PREFIX  save files to PREFIX/...
       --cut-dirs=NUMBER          ignore NUMBER remote directory components.

HTTP options:
       --http-user=USER        set http user to USER.
       --http-password=PASS    set http password to PASS.
       --no-cache              disallow server-cached data.
  -E,  --html-extension        save HTML documents with `.html' extension.
       --ignore-length         ignore `Content-Length' header field.
       --header=STRING         insert STRING among the headers.
       --max-redirect          maximum redirections allowed per page.
       --proxy-user=USER       set USER as proxy username.
       --proxy-password=PASS   set PASS as proxy password.
       --referer=URL           include `Referer: URL' header in HTTP request.
       --save-headers          save the HTTP headers to file.
  -U,  --user-agent=AGENT      identify as AGENT instead of Wget/VERSION.
       --no-http-keep-alive    disable HTTP keep-alive (persistent connections).
       --no-cookies            don't use cookies.
       --load-cookies=FILE     load cookies from FILE before session.
       --save-cookies=FILE     save cookies to FILE after session.
       --keep-session-cookies  load and save session (non-permanent) cookies.
       --post-data=STRING      use the POST method; send STRING as the data.
       --post-file=FILE        use the POST method; send contents of FILE.
       --content-disposition   honor the Content-Disposition header when
                               choosing local file names (EXPERIMENTAL).
       --auth-no-challenge     Send Basic HTTP authentication information
                               without first waiting for the server's
                               challenge.

HTTPS (SSL/TLS) options:
       --secure-protocol=PR     choose secure protocol, one of auto, SSLv2,
                                SSLv3, and TLSv1.
       --no-check-certificate   don't validate the server's certificate.
       --certificate=FILE       client certificate file.
       --certificate-type=TYPE  client certificate type, PEM or DER.
       --private-key=FILE       private key file.
       --private-key-type=TYPE  private key type, PEM or DER.
       --ca-certificate=FILE    file with the bundle of CA's.
       --ca-directory=DIR       directory where hash list of CA's is stored.
       --random-file=FILE       file with random data for seeding the SSL PRNG.
       --egd-file=FILE          file naming the EGD socket with random data.

FTP options:
       --ftp-user=USER         set ftp user to USER.
       --ftp-password=PASS     set ftp password to PASS.
       --no-remove-listing     don't remove `.listing' files.
       --no-glob               turn off FTP file name globbing.
       --no-passive-ftp        disable the "passive" transfer mode.
       --retr-symlinks         when recursing, get linked-to files (not dir).
       --preserve-permissions  preserve remote file permissions.

Recursive download:
  -r,  --recursive          specify recursive download.
  -l,  --level=NUMBER       maximum recursion depth (inf or 0 for infinite).
       --delete-after       delete files locally after downloading them.
  -k,  --convert-links      make links in downloaded HTML point to local files.
  -K,  --backup-converted   before converting file X, back up as X.orig.
  -m,  --mirror             shortcut for -N -r -l inf --no-remove-listing.
  -p,  --page-requisites    get all images, etc. needed to display HTML page.
       --strict-comments    turn on strict (SGML) handling of HTML comments.

Recursive accept/reject:
  -A,  --accept=LIST               comma-separated list of accepted extensions.
  -R,  --reject=LIST               comma-separated list of rejected extensions.
  -D,  --domains=LIST              comma-separated list of accepted domains.
       --exclude-domains=LIST      comma-separated list of rejected domains.
       --follow-ftp                follow FTP links from HTML documents.
       --follow-tags=LIST          comma-separated list of followed HTML tags.
       --ignore-tags=LIST          comma-separated list of ignored HTML tags.
  -H,  --span-hosts                go to foreign hosts when recursive.
  -L,  --relative                  follow relative links only.
  -I,  --include-directories=LIST  list of allowed directories.
  -X,  --exclude-directories=LIST  list of excluded directories.
  -np, --no-parent                 don't ascend to the parent directory.

Mail bug reports and suggestions to <bug-wget@gnu.org>.

Там есть httrack (автономный браузер: копируйте веб-сайты в локальный каталог) и синтаксис:

httrack www.example.com/bob/

который будет отражать сайт www.example.com/bob/ и только этот сайт.

Однако мне проще использовать wget, например:

wget -m www.example.com