Одно из ограничений приведенных в этой главе сценариев, извлекающих информацию из веб-сайтов, состоит в том, что, если веб-сайт, от которого зависит сценарий, изменит верстку или API после выхода книги, сценарий может перестать работать. Но, имея навык чтения разметки HTML или JSON (даже если вы не понимаете их в полном объеме), вы сумеете все исправить. Проблема трассировки других сайтов является основной причиной создания расширяемого языка разметки (Extensible Markup Language, XML): он позволяет разработчикам сайтов возвращать содержимое страниц отдельно от правил его размещения.
№ 53. Загрузка файлов через FTP
Когда-то одним из самых востребованных применений Интернета была передача файлов, а одним из самых простых решений этой задачи стал протокол передачи файлов (File Transfer Protocol, FTP). На базовом уровне все взаимодействия в Интернете сводятся к передаче файлов. Например, веб-браузер запрашивает передачу HTML-документа и сопутствующих изображений, чат-сервер постоянно передает строки дискуссии взад-вперед, почтовые программы пересылают электронные письма из одного конца мира в другой.
Оригинальная программа FTP все еще остается в строю, и, несмотря на довольно убогий интерфейс, она обладает достаточно мощными средствами и возможностями, чтобы иметь ее на вооружении. Существует богатое разнообразие программ с поддержкой FTP, из которых особенно примечательны FileZilla (http://filezilla-project.org/) и NcFTP (http://www.ncftp.org/), плюс масса замечательных графических интерфейсов, делающих работу с FTP более удобной. Однако FTP с успехом можно использовать для загрузки и выгрузки файлов, написав сценарии-обертки на языке командной оболочки.
Например, FTP часто используется для загрузки файлов из Интернета. Именно эту возможность реализует сценарий в листинге 7.1. Нередко файлы находятся на анонимных FTP-серверах, имеющих адреса URL следующего вида:
Код
Листинг 7.1. Сценарий ftpget
··#!/bin/bash
··# ftpget — получая URL в стиле ftp, разворачивает его и пытается получить
··#·· файл, используя прием доступа к анонимному ftp.
··anonpass="$LOGNAME@$(hostname)"
··if [$# −ne 1]; then
····echo "Usage: $0 ftp://…" >&2
····exit 1
··fi
··# Типичный URL: ftp://ftp.ncftp.com/unixstuff/q2getty.tar.gz
··if ["$(echo $1 | cut −c1-6)"!= "ftp://"]; then
····echo "$0: Malformed url. I need it to start with ftp://" >&2
····exit 1
··fi
··server="$(echo $1 | cut −d/ −f3)"
··filename="$(echo $1 | cut −d/ −f4-)"
··basefile="$(basename $filename)"
··echo ${0}: Downloading $basefile from server $server
··open $server
··user ftp $anonpass
··get "$filename" "$basefile"
··quit
··EOF
··if [$? -eq 0]; then
····ls −l $basefile
··fi
··exit 0
Как это работает
Основу сценария составляет последовательность команд, передаваемых программе FTP, которая начинается в строке
Запуск сценария