Как установить scrapy на windows

Обновлено: 03.07.2024

Вы когда-нибудь хотели программно получить конкретную информацию с веб-сайта для дальнейшей обработки? Скажите что-нибудь вроде спортивных результатов, тенденций на фондовом рынке или последних мод, биткойнов и других цен на криптовалюту? Если необходимая информация доступна на веб-сайте, вы можете написать сканер (также известный как скребок или паук), чтобы перемещаться по сайту и извлекать именно то, что вам нужно. Давайте выясним, как это сделать в Python.

Обратите внимание, что некоторые сайты не рекомендуют использовать сканер для доступа к информации.

что сайт предоставляет. Поэтому, пожалуйста, ознакомьтесь с условиями и положениями сайта, прежде чем размещать сканер на любом сайте.

Установка Scrapy

Мы используем модуль Python под названием Scrapy для обработки фактического сканирования. Это быстрый, простой и может перемещаться по нескольким веб-страницам, как вы можете с помощью браузера.

Обратите внимание, однако, что Scrapy не имеет средств для обработки JavaScript при навигации по сайту. Таким образом, те веб-сайты и приложения, которые используют javascript для манипулирования пользовательским интерфейсом, не могут быть надлежащим образом сканированы с помощью этого подхода.

Давайте теперь установим scrapy. Мы используем virtualenv

установить скрап. Это позволяет нам устанавливать scrapy в каталог, не затрагивая другие установленные модули системы.

Создайте каталог и инициализируйте виртуальную среду в этом каталоге.

Теперь вы можете установить scrapy в этот каталог.

Проверьте правильность установки скрапа.

Создание сканера веб-сайтов (также называемого пауком)

Первым шагом в написании сканера является определение класса Python, который простирается от scrapy.Spider. Давайте назовем этот класс spider1.

Как минимум, класс паука требует следующее:

  • имя для идентификации паука, «Википедия» в этом случае.
  • переменная start_urls, содержащая список URL-адресов, с которых начинается сканирование. Мы используем URL Википедии, показанный выше, для нашего первого сканирования.
  • метод parse (), который, хотя пока и не используется, используется для обработки веб-страницы и извлечения того, что нам нужно.

Теперь мы можем запустить этого паука, чтобы убедиться, что все работает правильно. Это выполняется следующим образом.

Отключение регистрации

Как вы можете видеть, выполнение scrapy с нашим минимальным классом генерирует множество результатов, которые не имеют большого смысла для нас. Давайте установим уровень регистрации на предупреждение и повторите попытку. Добавьте следующие строки в начало файла.

Использование Chrome Inspector

Извлечение информации с веб-страницы состоит из определения позиции элемента HTML, из которого мы хотим получить информацию. Хороший и простой способ найти положение элемента

из веб-браузера Chrome использовать инспектор.

  • Перейдите на правильную страницу в Chrome.
  • Поместите мышь на элемент, для которого вы хотите информацию.
  • Щелкните правой кнопкой мыши, чтобы открыть контекстное меню.
  • Выбрать Осмотреть из меню.

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

Как мы объясним ниже, вам нужны некоторые или все части этой позиции.

Извлечение заголовка

Давайте теперь добавим некоторый код в метод parse (), чтобы извлечь заголовок страницы.

Аргумент ответа для метода поддерживает метод css (), который выбирает элементы со страницы, используя заданное местоположение. Для нашего случая элемент h1.firstHeading. Нам нужно текстовое содержимое элемента, поэтому мы добавляем ::текст на выбор. Наконец, метод extract () возвращает выбранный элемент.

При повторном запуске scrapy в этом классе мы получаем следующий вывод:

Это показывает, что заголовок был извлечен в список строк Unicode.

Как насчет описания?

Чтобы продемонстрировать еще некоторые аспекты извлечения данных из веб-страниц, давайте возьмем первый абзац описания со страницы Wikipedia выше.

Это место возвращается все p элементов соответствует, что включает в себя все описание. Поскольку нам нужен только первый элемент p, мы используем следующий экстрактор:

Чтобы извлечь только текстовое содержимое, мы добавляем CSS extractor :: text:

В последнем выражении используется extract (), который возвращает список строк Unicode. Мы используем функцию python join (), чтобы присоединиться к списку.

Сбор данных с использованием yield

Вот код, аналогичный приведенному выше, но который использует оператор yield для возврата списка элементов p в HTML.

Теперь вы можете запустить паука, указав выходной файл JSON следующим образом:

Сгенерированный вывод выглядит следующим образом:

Обработка нескольких битов информации

Мы извлекаем различные поля в каждой строке, используя следующий метод parse (). Снова местоположения CSS элемента были определены с помощью Chrome Developer Console, как описано выше:

Обратите внимание, что селектор изображений выше указывает, что img является потомком td.posterColumn, и мы извлекаем атрибут с именем src, используя выражение :: attr (src).

Запуск паука теперь возвращает следующий JSON:

Использование вашего сканера

Давайте завершим эту статью несколькими существенными моментами:

  • Использование python с scrapy упрощает написание сканеров веб-сайтов для извлечения любой необходимой информации.
  • Консоль разработчика Chrome (или инструмент Firefox Firefox) помогает находить расположения элементов для извлечения.
  • Оператор yield Python помогает извлекать повторяющиеся элементы данных.

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

Кредит изображения: dxinerz / Depositphotos | Lulzmango / Wikimedia Commons

Способ установки Scrapy в Windows и краткое описание типичных проблем установки - руководство по установке Scrapy

В последние несколько дней многие друзья задавали вопросы по установке Scrapy в группе. На самом деле, проблемы почти одинаковые. Сегодня я организую учебные пособия по установке Scrapy для всех. Я надеюсь, что другие друзья больше не будут шестью богами и не будут мастерами во время установки. следующим образом.

Scrapy - это фреймворк для веб-сканеров Python, он очень прост в использовании и заслужил всеобщее одобрение, его принцип работы здесь не повторяется.


1. Обычно, когда мы находимся в библиотеке Python, нам нужно всего лишь использовать команду cmd, чтобы открыть окно командной строки, а затем войти в библиотеку установки pip, которую вы можете установить нормально, но при установке Scrapy, после ввода scip install scrapy, мы часто встречаем следующий рисунок Эта проблема.


2. Эта проблема возникает из-за отсутствия установочного пакета libxml2. Теперь, пока мы устанавливаем этот пакет, мы можем беспрепятственно устанавливать scrapy. Дайте всем пользу, представьте вам очень полезный веб-сайт пакета Python, этот сайт просто потрясающий, пакет Python внутри специально используется для установки под Windows, как показано ниже.


3. После поиска lxml на сайте вы также можете нажать Ctrl + f, чтобы найти его.


4. Нажмите «lxml», чтобы найти установочный пакет lxml, как показано на рисунке ниже. Найдите установочный пакет lxml, соответствующий вашей версии Python. Компьютер является 64-разрядным, а версия Python - Python3.4, поэтому найдите установочный пакет в красном поле ниже и нажмите кнопку для загрузки. Точно так же другие установочные пакеты Python3.5, Python3.6 и Python3.7 могут соответствовать друг другу в соответствии с их собственными условиями.


5. Затем перейдите в загруженный каталог и установите lxml. Введите команду установки pip install lxml-4.2.1-cp34-cp34m-win_amd64.whl.


6. После установки среды lxml-4.2.1-cp34-cp34m-win_amd64.whl повторно введите scip install scrapy, чтобы установить ее гладко, и об ошибках больше не будет сообщено, как показано на рисунке ниже.


7. Введите список пипсов, чтобы просмотреть установленные пакеты Scrapy, как показано на рисунке ниже.


8. После этого мы можем использовать скрап как обычно, мы можем создавать скрап-проекты и так далее.


9. Проблема, с которой сталкиваются некоторые маленькие партнеры, заключается в следующем:

distutils.errors.DistutilsPlatformError: Microsoft Visual C++ 14.0 is required. Get it with "Microsoft Visual C++ Build Tools": Download the Visual C++ Build Tools (standalone C++ compiler, libraries and tools)

Command "python setup.py egg_info" failed with error code 1



Этот установочный пакет является относительно большим и может быть удален после установки scrapy.


Разве предыдущий установочный пакет lxml не устанавливался напрямую? Почему эта проблема возникает с этим установочным пакетом? В настоящее время сначала необходимо проверить, соответствует ли версия Python установочного пакета и количество битов компьютера локальному компьютеру. Если проблем нет, продолжайте чтение.

Редактор здесь вводит вас в небольшую хитрость, специально предназначенную для решения таких проблем. Введите загруженный установочный пакет.В качестве примера возьмите установочный пакет Twisted-18.7.0-cp34m-win_amd64.whl, введите каталог загрузки и, как правило, поместите его в папку site-packages виртуальной среды после загрузки. , И затем изменил суффикс .whl на .zip, изменил суффикс .whl на .zip и изменил суффикс .whl на .zip. Важно сказать три раза, есть ли древесина, которая кажется знакомой? Да, это сжатый файл. Теперь извлеките все содержимое сжатого пакета в текущую папку, как показано на рисунке ниже.


После ввода команды pip list в виртуальной среде для просмотра установочного пакета вы увидите, что установочный пакет Twisted уже находится внутри, как показано на следующем рисунке. Установочный пакет Twisted не был распакован во время первой команды списка пипсов, и в настоящее время нет библиотеки Twisted, вторая команда списка пипов выполняется после распаковки установочного пакета Twisted. Вы можете видеть, что библиотека Twisted уже находится внутри.


После установки библиотеки Twisted установите другие библиотеки, такие как Scrapy, Pandas и т. Д.

Синтаксический анализ (парсинг) сайтов хоть и не имеет прямого отношения к пространственным данным, но владение основами которого полезно любому, работающему с ними. В свете роста числа онлайн-ресурсов, публикующих открытые данные, ценность умения извлекать из них необходимую информацию многократно повышается. Приведём небольшой пример. Допустим, нам необходимо составить набор тематических карт, отражающих результаты Выборов Президента Российской Федерации 2012. Исходные данные можно получить на сайте ЦИК России. Однако, согласитесь, что непосредственно использовать данные, предоставляемые в таком виде, очень сложно. Плюс это усложняется тем, что данные по разным регионам расположены на разных страницах. Гораздо удобнее было бы, чтобы вся эта информация была представлена, например, в виде одного или нескольких структурированных CSV или XML файлов (в идеале, конечно было бы иметь еще и некоторый API, позволяющий выполнять запросы к таким ресурсам), однако зачастую формирование подобных файлов отдаётся на откуп конечному пользователю (почему так происходит - это вопрос отдельный). Именно проблеме создания таких вот аггрегированных наборов данных и посвещена данная статья. В связи с недавними событиями в качестве целевого сайта, который мы будем парсить, выбран сайт ДетскиеДомики.ру, а именно его раздел Детские учреждения. Предполагается, что информация, расположенная на этом сайте будет в ближайшее время очень востребованной.

В качестве инструмента, которым будет выполняться парсинг, выбран Scrapy - очень гибкий фреймворк, написанный на Python и позволяющий решать широкий спектр задач. Информации о Scrapy на русском языке не так много, например и ещё, но этот пробел компенсируется отличной документацией.

В *nix-системах установка Scrapy - тривиальная задача:

  1. Перейдите на страницу Win32 OpenSSL
  2. Скачайте и установите Visual C++ 2008 redistributables для вашей версии Windows и архитектуры
  3. Скачайте OpenSSL для вашей версии Windows и архитектуры (вам нужна обычная версия - не light)
  4. Добавьте путь c:\openssl-win32\bin (или тот куда вы установили OpenSSL) к переменной PATH
  5. Установите twisted отдельно (например для 2.7)
  6. Установите lxml отдельно (например для 2.7)
  7. если easy_install не установлен, установите сначала его самого, он ставится в C:\Python27\Scripts\ и запускается из cmd, а не из Python

После того, как Scrapy будет установлен, нужно создать каталог проекта. Для этого, находясь в каталоге

/projects/scrapy, выполните команду:

В результате чего будет создана директория orphanage (соответствует имени проекта), имеющая следующую структуру:

  • scrapy.cfg - настройки проекта;
  • orphanage/ - Python модуль проекта;
  • orphanage/items.py - классы, описывающие модель собираемых данных;
  • orphanage/pipelines.py - используется в основном для описания пользовательских форматов сохранения результатов парсинга;
  • orphanage/settings.py - пользовательские настройки паука;
  • orphanage/spiders/ - директория, в которой хранятся файлы с классами пауков. Каждого паука принято писать в отдельном файле.

Модель представляет собой отдельный класс, содержащий перечень атрибутивных полей собираемых данных. Прежде чем описывать модель, необходимо определиться во-первых с объектом парсинга, а во-вторых с набором его атрибутов, которые мы хотим извлечь из целевого ресурса. Объектом парсинга в нашем случае будут являться детские дома, а набором атрибутов - их характеристики (в случае если у каждого объекта перечень доступных атрибутов различный, то итоговым набором будет являться объединение множеств атрибутов всех объектов). Находим страницу, содержащую наиболее полный перечень атрибутов (в данном случае факт полноты был определён путём сопоставления представленных атрибутов и анкеты детского учреждения) и выписываем их: "Рег. номер", "Регион", "Район", "Тип учреждения", "Название", "Почтовый адрес" и т.д. (всего 34 атрибута). После того, как мы определились с перечнем атрибутов, отразим их в специальном классе. Для этого открываем файл items.py и описываем класс (название - произвольное):

Как можно увидеть представленный класс содержит записи вида имя атрибута = Field(), где в качестве имя атрибута рекомендуется использовать английский вариант названия соответствующего атрибута. Кроме того, в класс был добавлен ещё один атрибут url, который предназначен для хранения URL той страницы, из которой были извлечены данные.

Паук - это основная часть нашей системы, представляющий собой отдельный класс, описывающий способ обхода ресурса и собирающий необходимую информацию в соответствии с описанной на предыдущем этапе моделью.

Переходим в директорию orphanage/spiders/ и создаём файл с описанием паука detskiedomiki.py (название произвольное). Внутри файла описываем класс (имя класса - произвольное):

Прежде чем переходить к рассмотрению функции parse_item, сделаем небольшое техническое отступление. Существет несколько библиотек, предназначенных для извлечения данных из HTML-документов. Наиболее распространённые это BeautifulSoup (популярная, но при этом обладающая одним недостатком - очень медленная) и lxml. В Scrapy используется собственный механизм извлечения данных (основанный так же как и lxml на libxml2) из HTML-документов - селекторы (selectors). Фактически, селекторы - это отдельные классы, при создании экземпляров которых на вход передаётся объект класса Response (представляющий собой ответ сервера). В Scrapy доступно 2 селектора - HtmlXPathSelector и XmlXPathSelector, предназначенных для парсинга HTML и XML документов соответственно.

Для того, чтобы понять, как работают селекторы, перейдите в директорию

/projects/scrapy/orphanage и выполните команду:

В результате выполнения данной команды будет осуществлен запрос к указанной странице, после чего вы попадете в интерактивную консоль, в которой уже будет ряд созданных Scrapy объектов, в том числе и объект hxs класса HtmlXPathSelector. Данную консоль очень удобно использовать для составления XPath выражений - основного инструмента доступа к элементам HTML-документа, используемого в Scrapy. Например, мы хотим извлечь значение атрибута Рег. номер из нашей страницы, для этого в консоли вызываем метод select объекта hxs и в качестве аргумента используем соответствующую XPath-строку:

В результате получим массив, состоящий из списка объектов класса HtmlXPathSelector, то есть метод select объекта класса HtmlXPathSelector возвращает список объектов класса HtmlXPathSelector (что очень удобно в случае парсинга вложенных данных). Для извлечения непосредственно данных необходимо применить метод extract:

В результате мы получим список значений тех элементов, которые удовлетворяют XPath-выражению.

А теперь рассмотрим нашу функцию parse_item:

Загрузчики (Item Loaders) - специальные классы, облегчающие заполнение объекта класса модели данных (в нашем случае OrphanageItem). В данном случае мы расширяем базовый класс загрузчика XPathItemLoader путём создания нового класса OrphanLoader и устанавливаем свойство default_output_processor в значение TakeFirst, это сделано из следующих соображений. При извлечении данных из HTML-документа результат возвращается в виде массива значений (даже если этот массив состоит из одного элемента как в нашем случае), использование процессора TakeFirst позволяет из полученного массива значений извлекать первый элемент.

Следующей строкой мы создаём объект класса OrphanLoader:

Первый аргумент - объект класса модели данных OrphanageItem, второй класса HtmlXPathSelector. Следующая (и последующие) строка вида:

говорит о том, что атрибут id объекта класса нашей модели данных будет извлекаться в соответствии с переданным выражением XPath.

Метод add_value позволяет задать значение указанного (url) атрибута вручную. Следующая строка:

заполняет атрибуты объекта OrphanageItem в соответствии с настройками загрузчика.

Sep 20, 2016 22:47 · 1489 words · 7 minute read python tutorial

Пример будет несколько абстрактный - выгрузить в json файл названия статей вместе с именем автора, допустим, с Хабра. В реальной жизни у меня, конечно, совсем другая задача, но я бы не хотел выкладывать паука для сайта, к разработчикам которого испытваю большое уважение. Так что да простит меня Хабр :)

Структура habrahabr.ru

Сразу предупреждаю, что нет какого-либо универсального решения, потому что каждый сайт предоставляет информацию по-разному: например, генерацией целых страниц с сервера или ajax-пагинацией; в div или в table… Так что первое, что нужно сделать - изучить структуру сайта с помощью консоли разработчика. Из скриншота видно, что нас интересуют блоки article , у которых в header информация об авторе и дате публикации, а заголовок статьи в теге h2 . Все шаги можно покомитно посмотреть в репозитории на github.

Установка и создание проекта

Для начала установим scrapy. Он тянет довольно много сторонних зависимостей:

После этого создадим проект:

И ниже он предлагает создать первого паука:

В итоге в каталоге spiders появился первый алгоритм паука с вот таким содержимым:

У каждого такого паука есть имя, по которому мы будем его запускать, список доменов, на которые можно переходить и стартовый url.

Для запуска перейдём в каталог с scrapy.cfg и выполним scrapy crawl HabrSpider . Предлагаю полностью разобрать вывод, т.к. в нём представлен функционал, который уже идёт “из коробки”. Первым делом - версии пакетов и текущие настройки. По умолчанию Scrapy учитывает файл robots.txt из-за настройки ROBOTSTXT_OBEY :

Во-первых, это расширения, которые вешаются на внутренние события Scrapy и позволяют дополнять поведение по умолчанию. Например, сбор статистики и потребление памяти:

Во-вторых, список мидлварей, которые обеспечивают некоторые базовые вещи. Делятся на 2 типа: при скачивании и при обходе. Например, RedirectMiddleware выполняет расшифровку редиректов, а RetryMiddleware - повтор запроса в случае окончания таймаута. Вы можете дописать свои для установки JWT токена или эмуляции разных User-Agent, а ненужные - отключить. Кстати, по умолчанию в новом проекте создаётся пустой файл middlewares.py , в котором описаны методы для переопределения.

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

И вот после всех настроек Scrapy наконец запустился:

Сохранение результата

Саму страничку мы как-то получили. Теперь задача вытащить оттуда все данные. Для начала опишем модель того, что нам нужно в файле items.py:

То есть требуемый csv файл будет состоять из строк такой вот структуры. Проще всего раз получить пример страницы и подобрать соответствующие XPath для данных в response:

Модифицируем метод parse, чтобы он возвращал именно HabrItem. Для упрощения воспользуемся встроенным классом Selector, хотя не больно-то он и помогает - страдать от XPath всё равно придётся:

Работа с XPath местами неочевидна и явно выходит за рамки этого материала. В итоге в логах можно видеть что же именно скачалось. Но нам-то это надо видеть в файле, так что посмотрим на pipelines.py. Используется концепция пайплайнов unix - данные передаются из одного объекта в другой, проходя какую-нибудь обработку. Я приведу код сразу целиком, разве что обращу внимание на то, что process_item должен возвращать item для следующего pipeline:

Зачем так сложно? Почему нельзя сразу в методе parse сохранять результаты? Всё из-за гибкости - здесь нужно разделять способ получения данных от способа обработки, т.к. первый будет переписываться из-за адаптации к структуре сайта. Разработчики любят менять имена стилей, убирать html-элементы, так что данные могут оказаться совсем в другом месте, а то и вовсе подтягиваться ajax-запросами. Так что код, представленный здесь, скорее всего не заработает сразу, а потребует небольшого допиливания.

После подключения HabrPipeline в settings.py и запуска scrapy crawl HabrSpider -o habr.json -t json получаем файл habr.json, в котором содержатся элементы с главной Хабра.

Обрабатываем весь сайт

Итак, получилось скачать данные для одной страницы. Попробуем адаптировать это на все доступные. Самым примитивным способом было бы прописать их список в start_urls, но это не наш путь :) Для тех, кто работает с Django - не надо искать get_start_urls(), тут существует декларативный подход. Я сменил базовый класс на CrawlSpider, потому что у последнего есть переменная rules, которая используется для генерации списка следующих в очереди на обработку страниц. Проще это показать на примере, а потом объяснить:

Паук начинает свою работу с обработки start_urls (скачивании и передачи в parse()), после этого применяются правила для обхода в глубину - на каждой стартовой странице ищутся ссылки, которые описаны в rules и для них применяется callback. Таким образом работа конкретно этого паука будет следующей:

Авторизация

Заключение

Полный код проекта находится в репозитории на github. На этом же простейший паук готов, но это далеко не все возможности фреймворка. Я боюсь их даже перечислять, так что за подробностями отправляю на страницу документации.

Читайте также: