Современный_скрапинг_веб_сайтов_с_помощью_Python_2021_Райан_М. Руководство по решению его наиболее распространенных задач
Скачать 3.96 Mb.
|
Глава 17. Удаленный веб-скрапинг В предыдущей главе мы рассмотрели запуск веб-скраперов в нескольких потоках и процессах, так что обмен данными между ними был несколько ограничен или же его приходилось тщательно планировать. В текущей главе мы доведем эту концепцию до ее логического завершения: будем запускать веб-краулеры не только в отдельных процессах, но и на разных машинах. Этой теме не случайно посвящена последняя техническая глава книги. До сих пор мы запускали все приложения Python из командной строки на своем домашнем компьютере. Конечно, мы могли установить MySQL, постаравшись воспроизвести среду реального сервера. Но это не одно и то же. Как говорится, «если ты кого-то любишь — дай ему свободу». В данной главе мы рассмотрим несколько способов запуска скриптов с разных компьютеров и даже с разных IP-адресов. У вас может возникнуть соблазн отложить этот шаг до лучших времен, поскольку сейчас он вам не нужен. Однако вы будете удивлены тем, как легко начать работу с уже имеющимися инструментами (такими как персональный сайт на платном хостинге) и насколько станет проще жить, стоит перестать пытаться запускать написанные на Python веб-скраперы с личного ноутбука. Зачем использовать удаленные серверы При запуске веб-приложения, предназначенного для широкой аудитории, использование удаленного сервера может показаться очевидным шагом, однако инструмент, созданный для наших целей, мы часто так и продолжаем запускать локально. Те, кто решил перейти на удаленную платформу, обычно руководствуются двумя основными соображениями: потребностью в большей мощности и гибкости и необходимостью применять другой IP-адрес. Как избежать блокировки IP-адреса При создании веб-скраперов главное правило гласит: подделать можно практически все. Вы можете отправлять электронные письма с не принадлежащих вам адресов, передавать из командной строки автоматизированные данные о перемещениях мыши и даже, к ужасу веб-администраторов, передавать трафик их сайтов из Internet Explorer 5.0. Единственное, что нельзя подделать, — это ваш IP-адрес. Кто угодно может прислать вам письмо с обратным адресом «Соединенные Штаты Америки, Вашингтон (округ Колумбия), Пенсильвания-авеню, 1600, Президент». Однако если письмо отправлено из Альбукерке, штат Нью-Мексико, вы можете быть уверены, что не состоите в переписке с президентом Соединенных Штатов 28 Большинство усилий, направленных на то, чтобы не предоставить веб-скраперам доступ к сайтам, концентрируются на отличии людей от ботов. Дойти до блокировки IP-адресов — это примерно как фермеру отказаться от распыления пестицидов и взамен просто поджечь поле. Это крайняя, хотя и эффективная мера отбрасывания пакетов, отправленных с проблемных IP- адресов. Однако у такого решения есть свои нюансы. • Списки доступа по IP-адресам трудно поддерживать. У крупных сайтов чаще всего есть собственные программы, автоматизирующие некоторые рутинные операции с такими списками (боты, блокирующие боты!). Однако все равно кто- то должен время от времени проверять эти списки или хотя бы отслеживать их рост и устранять проблемы. • Каждый адрес — это дополнительное время обработки, на которое увеличится время получения пакетов, поскольку сервер должен будет проверить полученные пакеты по списку и решить, следует ли их утверждать. Большое количество адресов, умноженное на большое количество пакетов, дает быстрый рост затрат времени. Чтобы сэкономить время и уменьшить сложность обработки, администраторы часто группируют IP-адреса в блоки и устанавливают правила вроде «заблокировать все 256 адресов из данного диапазона», если найдут несколько тесно сгруппированных нарушителей. Это приводит нас к третьему пункту. • Блокировка IP-адреса также может привести к блокировке «хороших парней». Например, когда я училась в Инженерном колледже им. Франклина В. Олина, один студент написал программу, которая пыталась подделать голосование за широко известный контент на сайте http://digg.com (это было еще до пика популярности Reddit). Один заблокированный IP-адрес привел к тому, что все общежитие лишилось доступа к сайту. Тот студент просто перенес свою программу на другой сервер; тем временем страницы Digg потеряли многих посетителей из своей основной целевой аудитории. Несмотря на все свои недостатки, блокировка IP-адресов остается чрезвычайно распространенным методом, которым пользуются администраторы, чтобы запретить подозрительным веб-скраперам доступ к серверам. Если IP- адрес будет заблокирован, то единственным действенным решением остается веб-скрапинг с другого IP-адреса. Для этого можно либо переместить веб-скрапер на другой сервер, либо построить маршрутизацию трафика через другой сервер с помощью сервиса наподобие Tor. Портируемость и расширяемость Некоторые задачи слишком велики для домашнего компьютера и подключения к Интернету. И пусть вы не намерены создавать большую нагрузку на какой-либо сайт, но, возможно, собираете данные на разных сайтах, для чего потребуются гораздо большие пропускная способность и объем памяти, чем может обеспечить ваша текущая конфигурация. Более того, избавившись от вычислительно интенсивной обработки данных, можно высвободить ресурсы домашнего компьютера для более важных задач (есть здесь любители World of Warcraft?). Вам не придется думать о том, как обеспечить бесперебойное электропитание и подключение к Интернету (можно зайти в Starbucks, запустить приложение, закрыть ноутбук и уйти, зная, что все продолжает надежно работать), и вы получите доступ к собранным данным в любом месте, где есть подключение к Интернету. Если ваше приложение требует такой вычислительной мощности, что его не удовлетворит даже один большой вычислительный узел Amazon, то можно воспользоваться распределенными вычислениями. Тогда на достижение ваших целей будут работать параллельно несколько машин. Приведу простой пример: у вас есть один компьютер, который сканирует один набор сайтов, и второй компьютер, который сканирует второй набор сайтов; оба компьютера сохраняют собранные данные в общей базе. Конечно, как отмечалось в предыдущих главах, кто угодно может скопировать систему поиска Google, но мало кто сможет повторить масштаб, в котором Google выполняет свой поиск. Распределенные вычисления — обширная область информатики, выходящая за рамки данной книги. Однако знание того, как запустить приложение на удаленном сервере, является необходимым первым шагом, и вы будете удивлены тем, на что способны современные компьютеры. Tor Сеть Onion Router, более известная под аббревиатурой Tor, представляет собой сеть волонтерских серверов, настроенных на маршрутизацию и перенаправление трафика через многие уровни (именно поэтому в названии присутствует слово Onion — «репчатый лук») разных серверов, чтобы скрыть происхождение этого трафика. Перед поступлением в сеть данные зашифровываются, и поэтому, если окажется, что какой-нибудь сервер прослушивается, природа коммуникации не будет раскрыта. Кроме того, хоть входящий и исходящий поток данных любого сервера и может быть скомпрометирован, чтобы расшифровать истинные начальные и конечные точки соединения, необходимо знать детали о входящих и исходящих данных для всех серверов коммуникационного пути — подвиг на грани невозможного. Tor часто используют правозащитники и анонимные политические информаторы для общения с журналистами, вследствие чего значительную часть финансирования эта сеть получает от правительства США. Конечно же, она также широко используется для незаконной деятельности, из-за чего является постоянным объектом государственного надзора (хотя пока что он имел в лучшем случае переменный успех). Ограничения анонимности Tor Несмотря на то что причина, по которой мы будем использовать Tor в этой книге, состоит в изменении своего IP-адреса, а не в получении полной анонимности как таковой, все же стоит уделить время изучению некоторых сильных сторон и ограничений возможностей Tor по созданию анонимного трафика. Используя Tor, можно предположить, что IP-адрес, с которого мы пришли на веб-сервер, не является для этого сервера тем IP-адресом, по которому нас можно проследить. Однако нас может выдать любая информация, предоставляемая нами веб- серверу. Например, если вы войдете в свою учетную запись Gmail и затем выполните подозрительный поиск в Google, то его можно будет привязать к вашей личности. Однако, помимо очевидного, сама аутентификация в Tor способна раскрыть вашу анонимность. В декабре 2013 года студент Гарвардского университета, чтобы не сдавать выпускные экзамены, отправил через сеть Tor сообщение о том, что учебное заведение заминировано, используя анонимную учетную запись электронной почты. Когда сотрудники IT-отдела Гарварда просмотрели свои журналы, то обнаружили следующее: во время отправки сообщения об угрозе взрыва трафик, поступивший в сеть Tor, попадал туда только с одной машины, зарегистрированной на студента, имя которого было известно. Несмотря на то что исходный пункт этого трафика определить не удалось (только его передачу через Tor), самого факта совпадения времени и того, что в это время был зарегистрирован вход в систему только с одной машины, было достаточно для того, чтобы на этого студента подали в суд. Аутентификация в Tor — не автоматическая мантия-невидимка, которая предоставляла бы вам полную свободу делать в Интернете все что угодно. Да, это полезный инструмент, однако всегда применяйте его с умом, осторожностью и, конечно же, с благими намерениями. Как вы узнаете в следующем подразделе, для применения Tor в Python необходимо установить и запустить Tor. К счастью, установить и запустить сервис Tor очень легко. Просто перейдите на страницу скачивания Tor (https://www.torproject.org/download/download), скачайте, установите, откройте и подключите его. И учтите, что при использовании Tor скорость соединения с Интернетом может показаться ниже обычной. Будьте терпеливы — возможно, данные, прежде чем попасть к вам, несколько раз обогнут земной шар! PySocks. PySocks — удивительно простой модуль Python, способный маршрутизировать трафик через прокси-серверы и просто фантастически эффективный в сочетании с Tor. PySocks можно скачать с его сайта (https://pypi.python.org/pypi/PySocks/1.5.0) или использовать для его установки любой из многочисленных сторонних менеджеров модулей. У этого модуля не очень много документации, однако пользоваться им чрезвычайно просто. Перед выполнением следующего кода необходимо запустить сервис Tor на порте 9150 (порте, применяемом по умолчанию): import socks import socket from urllib.request import urlopen socks.set_default_proxy(socks.SOCKS5, "localhost", 9150) socket.socket = socks.socksocket print(urlopen('http://icanhazip.com').read()) Сайт http://icanhazip.com показывает только IP-адрес клиента, подключающегося к серверу, и может быть полезен для тестирования. При выполнении этот скрипт должен отображать IP-адрес, который не является вашим собственным. Если вы хотите использовать Selenium и ChromeDriver в сочетании с Tor, то PySocks вообще не нужен — просто не забудьте сначала запустить Tor и укажите дополнительный параметр proxy-server для Chrome, согласно которому Selenium будет подключаться через порт 9150 по протоколу socks5: from selenium import webdriver from selenium.webdriver.chrome.options import Options chrome_options = Options() chrome_options.add_argument("--headless") chrome_options.add_argument("--proxy- server=socks5://127.0.0.1:9150") driver = webdriver.Chrome(executable_path='drivers/chrom edriver', options=chrome_option s) driver.get('http://icanhazip.com') print(driver.page_source) driver.close() Этот скрипт также должен выводить не ваш IP-адрес — на сей раз тот, который в данный момент использует работающий у вас клиент Tor. Удаленный хостинг Хотя на полную анонимность в Интернете рассчитывать не стоит — она теряется, стоит вам лишь указать данные кредитной карты, — однако удаленное размещение веб- скраперов также способно значительно повысить скорость их работы. Это объясняется не только возможностью покупать машинное время на гораздо более мощных компьютерах, чем ваш, но и тем, что по дороге к точке назначения соединение больше не будет проходить через слои сети Tor. Запуск веб-скрапера из учетной записи веб-хостинга Если у вас есть личный или корпоративный сайт, то, вероятно, уже есть все, что нужно для запуска веб-скрапера с внешнего сервера. Даже на веб-серверах с относительно ограниченным доступом, где нет возможности выполнять команды из командной строки, можно запускать и останавливать скрипты через веб-интерфейс. В случае размещения вашего сайта на Linux-сервере тот, скорее всего, сам работает на Python. Если же вы используете хостинг на Windows-сервере, то вам повезло меньше: придется специально проверить, установлен ли там Python или согласится ли администратор сервера его установить. Большинство мелких провайдеров веб-хостинга предоставляют программное обеспечение под названием cPanel, которое используется для выполнения простейших операций по администрированию, а также для предоставления информации о вашем сайте и связанных с ним сервисах. При наличии доступа к cPanel для проверки того, установлен ли на вашем сервере Python, нужно перейти в раздел Apache Handlers и добавить новый обработчик (если его там еще нет): Handler: cgi-script Extension(s): .py Эти строки дают указание вашему серверу выполнять все скрипты Python как скрипты CGI (Common Gateway Interface — общий шлюзовой интерфейс). Это любая программа, которая может выполняться на сервере и динамически генерировать контент для отображения на сайте. Явно определяя скрипты Python как скрипты CGI, мы разрешаем серверу их выполнять, а не просто отображать содержимое в браузере или позволять пользователю его скачивать. Напишите скрипт Python, загрузите его на сервер и определите права доступа к файлу как 755, то есть разрешите выполнять этот файл как программу. Для выполнения скрипта перейдите в тот каталог, в который вы его загрузили, через браузер (или, что еще лучше, напишите веб-скрапер, который будет делать это вместо вас). Если вы не хотите, чтобы скрипт попал в открытый доступ и его мог выполнить любой желающий, то есть два варианта этого избежать. • Храните скрипт под нелогичным или скрытым URL и следите за тем, чтобы никогда не указывать ссылку на скрипт с какого-либо другого доступного URL во избежание его индексации поисковыми системами. • Защитите скрипт паролем или потребуйте, чтобы перед выполнением скрипта ему передавался пароль или секретный маркер. Конечно, запуск скрипта Python из сервиса, изначально предназначенного для отображения сайтов, напоминает хакерский прием. В частности, вы, вероятно, заметите, что ваш «веб-скрапер через сайт» загружается немного медленно. На самом деле страница вообще будет отображаться лишь после выполнения всего веб-скрапинга (и только тогда произойдет вывод данных, который вы запрограммировали с помощью операторов print). Это может занять несколько минут, часов или вообще не завершится никогда, в зависимости от того, как написан скрипт. Несмотря на то что он, безусловно, выполняет свою работу, вам может потребоваться более подробный вывод результатов в реальном времени. Для этого понадобится сервер, предназначенный не только для сайтов. Запуск из облака На заре компьютерных технологий программисты платили за машинное время или резервировали его для выполнения кода. С появлением персональных компьютеров такая необходимость отпала: вы просто пишете и выполняете код на своей машине. Но сейчас амбиции приложений опережают разработку микропроцессоров до такой степени, что программисты снова стали возвращаться к почасовой плате за вычисления. Однако на сей раз пользователи платят не за время одной физической машины, а за эквивалентную вычислительную мощность, которая часто распределяется между несколькими компьютерами. Облачная структура этой системы позволяет определять стоимость вычислительной мощности по времени пикового спроса. Например, Amazon позволяет делать наценку на «точечные вычислительные узлы», когда низкая цена важнее реагирования в реальном времени. Виртуальные вычислительные узлы также являются более специализированными, их можно выбирать в зависимости от потребностей приложения — в большем объеме оперативной памяти или высокой скорости вычислений. Хотя веб-скраперы обычно не используют много памяти, возможно, при размещении приложения веб-скрапера стоит выбрать не универсальный вычислительный узел, а вариант с большим хранилищем для данных или более быстрыми вычислениями. Если вам предстоит обработка больших объемов текстов на естественном языке, распознавание текста или поиск путей в графах (например, при решении задачи «Шесть шагов по “Википедии”»), то вам может подойти вычислительный узел с высокой скоростью вычислений. При сборе больших объемов данных, сохранении файлов или выполнении обширной аналитики, возможно, стоит выбрать вариант с оптимизацией хранилища. Хоть нас не ограничивает ничто, кроме денег, на момент написания этой книги стоимость аренды вычислительного узла начиналась всего с 1,3 цента в час (для микроузла Amazon EC2), а самый дешевый вычислительный узел Google стоил 4,5 цента в час с минимальным временем аренды всего десять минут. Благодаря экономии на масштабе арендовать небольшой вычислительный узел в крупной компании стоит почти столько же, сколько собственная физическая выделенная машина, за исключением того, что не придется нанимать IT-специалиста, который будет за ней присматривать. Конечно, пошаговые инструкции по настройке и запуску вычислительных узлов для облачных вычислений несколько выходят за рамки этой книги, но вы, скорее всего, обнаружите, что пошаговые инструкции и не нужны. Поскольку Amazon и Google (не говоря уже о бесчисленных мелких компаниях в данной индустрии) борются за доллары облачных вычислений, они упростили настройку новых вычислительных узлов, так что вам остается лишь следовать простым подсказкам, придумать имя приложения и предоставить номер кредитной карты. Кроме того, на момент написания этой книги Amazon и Google предлагали бесплатное машинное время на сотни долларов для дальнейшего привлечения новых клиентов. Настроив вычислительный узел, вы станете гордым владельцем IP-адреса, имени пользователя, а также открытого и закрытого ключей, которые можно будет применять для подключения к вашему вычислительному узлу через SSH. С этого момента все будет аналогично работе на сервере, которым вы физически владеете, за исключением того, что вам, естественно, больше не придется беспокоиться о техническом обслуживании оборудования или использовании многочисленных собственных инструментов мониторинга. Я обнаружила, что если нужно что-то сделать «дешево и сердито», особенно при отсутствии большого опыта работы с SSH и парами ключей, то проще наладить и сразу запустить вычислительные узлы Google Cloud Platform. У них есть простой загрузчик и даже кнопка, доступная сразу после запуска, которая позволяет просматривать терминал SSH прямо в браузере, как показано на рис. 17.1. Рис. 17.1. Открытый в браузере терминал работающего вычислительного узла виртуальной машины Google Cloud Platform Дополнительные ресурсы Много лет назад в облаке работали главным образом те, кто захотел и смог пробраться сквозь дебри документации и уже имел опыт администрирования серверов. Однако сегодня благодаря возросшей популярности и конкуренции среди поставщиков облачных вычислений инструменты стали гораздо лучше. Но все же для создания крупномасштабных или более сложных веб-скраперов и краулеров вам могут понадобиться дополнительные рекомендации по созданию платформы для сбора и хранения данных. Книга Google Compute Engine Марка Коэна (Marc Cohen), Кэтрин Херли (Kathryn Hurley) и Пола Ньюсона (Paul Newson) (издательство O’Reilly) (http://oreil.ly/1FVOw6y) — это простой источник информации о применении облачных вычислений Google на Python и JavaScript. В ней рассматривается не только пользовательский интерфейс Google, но и инструменты командной строки и скрипты, которые можно задействовать для повышения гибкости приложений. Если вы предпочитаете работать с Amazon, то обратите внимание на книгу Python and AWS Cookbook Митча Гарната (Mitch Garnaat) (издательство O’Reilly) (http://oreil.ly/VSctQP) — краткое, но чрезвычайно полезное руководство, которое поможет начать работу с Amazon Web Services и покажет, как настроить и запустить масштабируемое приложение. 28 Технически IP-адреса можно подделать в исходящих пакетах. Этот метод используется в распределенных атаках типа «отказ в обслуживании», когда злоумышленникам неважно получить ответные пакеты (которые если и будут отправлены, то доставятся по неправильному адресу). Но веб-скрапинг по определению является действием, в котором ожидается ответ от веб-сервера, поэтому для нас IP-адрес — то, что подделать невозможно. |