Аарон Сварц был программистом и политическим активистом, который неизменно загрузил примерно 4,8 миллиона статей из базы данных JSTOR академических статей. Это привело его к ответственности Соединенными Штатами.
В документальном фильме «Собственный мальчик Интернета» о Аароне Сварце есть сценарий, который ссылается на Keegrabbing.py. Этот скрипт – это то, что Aaron используется для объема копирования PDFS из базы данных JSTOR из в сети MIT.
Когда впервые увидели документальный фильм, я был очарован идеей, что простая компьютерная программа может привести к такой фуроре. Естественно, я хотел знать, что было в программе. Оказывается, эта программа является просто простым сценарием Python 2, то есть только 21 строки длиной (17, если вы не включаете пустые строки!)
Вот выдержка из документального фильма, в котором кратко обсуждается сценарий.
https://www.youtube.com/watch?v=j0DLmgmh2N8
Мне удалось найти скрипт онлайн. Но я не сразу понял это. Я получил генерал-супер, но было несколько вещей, которые я не видел раньше, как один класс, который aaron определяет, что это просто исключение, которое, кажется, просто ничего не делает. Существует также URL-адрес, который был отреагирован судами, которые дополнительно заставляют эту программу трудно понять.
Итак, давайте просматриваем программу и попробуйте поймать ее по линии.
Вот файл keggrabbing.py:
“ “ “ Import Subprocess, Urllib, NOBLOCKS Случайные классы (исключение): Pass Def GetBlocks (): .URLOPEN («HTTP://{? Redacted?}/Grab») .read (), если «
Импорт SYS Если len (sys.argv)> 1: префикс = [‘–socks5’, sys.argv [1]] остальное: префикс = [] # ‘- Интерфейс’, ‘eth0: 1’] x: [‘Curl’] + префикс + [‘-H’, “cookie: http://www.jstor.org/stable/pdfplus/ ” + STR (x) + “]
Пока 1: () для блока в блоках: подпроцесс блока печати. Popen (линия (блок)). Ждать () “ “
Это написано в Python2. Я потому, что у нас нет URL, который отреагировал, некоторые примечания здесь – моя лучшая интерпретация.
Импорт:
- Подпрокат – позволяет создавать новые процессы из сценария Python. Подпроцессы – это детские процессы, созданные из другого процесса.
- Urllib – позволяет получать ресурсы от URL.
- Случайные – генерирует псевдослучайные числа (то есть не по-настоящему случайные числа)
- sys – импортируется позже. Включает доступ к параметрам и функциям, специфичным для машины, который выполняет код.
Импорт подпроцесс, Урлыб, случайный
После небольшого расследования я понял, что в однострочном классе Nooblocks, что Аарон включал в этот скрипт, был способом прекращения скрипта (больше на это позже).
Учебные ноблоки (исключение): проходить
Следующий бит кода – это метод getBlocks (). Эта функция читает от URL, который был отреагирован судами.
Похоже, эта функция вызывала пользовательский URL, который, вероятно, настроен самим Swartz, который имел список URL-адресов, связанных с PDF для скачивания. Вполне вероятно, что Swartz имел эту настройку страницы, и будет контролировать и изменять его от внешней стороны кампуса MIT, чтобы направить скрипт для загрузки PDFS, которые он хотел. Первая строка в этой функции вызывает URLLLIB.URLOPEN (). Прочитайте и сохраняет реакцию этого вызова в переменной вызов «R». Функция URLOPEN читает с URL и возвращает файловый объект из содержимого внешнего ресурса, который указывает URL. Функция чтения, которая называется это, просто прочитает содержимое байта и возвращает их.
Вторая строка этой функции проверяет, есть ли HTML на полученной странице. Если есть, то он поднимает исключение NOBLOBLOCKS и выходит из скрипта. Вполне вероятно, что URL-адрес, который реагирует просто был текстовым файлом с PDFS Swartz хотел скачать. Когда он хотел остановить сценарий, он может просто поменять этот текстовый файл для HTML-файла, а скрипт выйдут.
Функция разделения просто берет строку и разделяет его в список, и по умолчанию он разделяет строку в каждом пространстве, что делает здесь Aaron.
Def GetBlocks (): .urlopen (“http://{? отредактировал?}/grab”) .read () Если «
Следующие 5 строк кода связаны с привлечением аргументов скрипту из SYS.Argv и, если есть один aute, добавляя его в переменную в виде списка со строкой – SOCKS5 в качестве первой строки в списке.
Обратите внимание, что требуется второй элемент в списке sys.argv, поскольку первый элемент в списке sys.argv – это имя сценария.
Эта переменная префикса будет использоваться в выражении лямбда ниже. По сути, этот префикс используется, чтобы сделать скрипт подключиться к JStor через прокси или только хотя Компьютерное подключение к Интернету (которое Aaron оставило команду, предполагая, что это было соединение Ethernet, что имеет смысл в качестве компьютера, который Aaron используется для запуска этого сценария, был в шкафу магазина, подключенным к сети MIT)
Эта линия может означать, что Aaron может запустить этот скрипт из-за пределов сети MIT, но это просто спекуляция.
Импорт Sys. Если len (sys.argv)> 1: префикс = [‘–socks5’, sys.argv [1]] еще: префикс = [] # ‘- Интерфейс’, ‘eth0: 1’]
Следующая строка объявляет функцию лямбда, которая сохраняется в переменной под названием Line.
Это выражение лямбда принимает один аргумент, что является названием PDF, который сценарий собирается скачать.
Это выражение лямбда позже будет использоваться в рамках вызова подпроцесса позже в сценарии. Определяет запрос скручиваемости. Команда CURL – это команда, которая позволяет передавать данные в или из URL-адреса, i.e загрузить или загрузить с URL. Запрос скручиваемости – это прокси-сервер для подключения через (в зависимости от условного выше, как упомянуто). Далее он определяет печенье, которое просто строку случайному 3-значному номеру. Это cookie, сделает сервер, отвечая на этот запрос скручиваемости, думаю, что он исходит от реального пользователя, в отличие от скрипта. Следующая вещь, эта функция определяет вывод этого запроса скручиваемости: имя файла PDF в каталог, называемый PDF. Остальная часть этой лямбда создает URL-адрес PDF, из которого можно загрузить PDF с помощью curl.
Линия х: [‘Curl’] + префикс + [‘-H’, “cookie: http://www.jstor.org/stable/pdfplus/” + STR (x) + “]
Этот следующий раздел кода. Определяет бесконечную петлю, которая является частью кода, которая составляет все остальное.
Сначала он вызывает GetBlocks из ранее и сохраняет результирующий список PDF для переменной под названием блоков. Затем он итализает над этим, печатая их в консоль, а затем вызывая линию Lambda с ранее в подпроцессе. Popen Call. Пополнение подпроцесса создаст новый процесс, в этом случае запрос скручиваемости, который загрузит текущий PDF. Затем скрипт заблокирует до тех пор, пока этот подпроцесс не закончит, то есть он ждет, пока PDF не закончится загрузка, а затем он перейдем к следующему PDF.
Пока 1: () Для блока в блоках: печатный блок подпрокат. POPEN (линия (блок)). Ждать ()
Вот и все!
Я также сделал видео, в котором я прохожу через этот код, если такого рода вещи плавают вашу коз:
Оригинал: “https://dev.to/shanelee/keepgrabbing-py-analysed-line-by-line-aaron-swartz-jstor-script-fk4”