Scrapy shell виндовс как запустить

Обновлено: 01.07.2024

Синтаксический анализ (парсинг) сайтов хоть и не имеет прямого отношения к пространственным данным, но владение основами которого полезно любому, работающему с ними. В свете роста числа онлайн-ресурсов, публикующих открытые данные, ценность умения извлекать из них необходимую информацию многократно повышается. Приведём небольшой пример. Допустим, нам необходимо составить набор тематических карт, отражающих результаты Выборов Президента Российской Федерации 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 в соответствии с настройками загрузчика.

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

Базовые знания HTML и CSS помогут лучше и быстрее освоить материал.

Обзор Scrapy

Процесс веб-скрапинга (парсинга)

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

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

Scrapy предоставляет мощный фреймворк для извлечения, обработки и хранения данных.

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

Scrapy vs. Beautiful Soup

В этом разделе будет дан обзор одного из самых популярных инструментов для парсинга, BeautifulSoup, и проведено его сравнение со Scrapy.

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

BeautifulSoup также широко используется для веб-скрапинга. Это пакет Python для парсинга документов в форматах HTML и XML и извлечения данных из них. Он доступен для Python 2.6+ и Python 3.

Вот основные отличия между ними:

ScrapyBeautifulSoup
Функциональность
Scrapy — это самый полный набор инструментов для загрузки веб-страниц, их обработки и сохранения в файлы и базы данныхBeautifulSoup — это в принципе просто парсер HTML и XML, требующий дополнительных библиотек, таких как requests и urlib2 для открытия ссылок и сохранения результатов.
Кривая обучения
Scrapy — это движущая сила веб-сканирования, предлагающая массу способов парсинга страниц. Обучение тому, как он работает, требует много времени, но после освоения процесс сканирования превращается в одну строку кода. Потребуется время, чтобы стать экспертом в Scrapy и изучить все его особенностиBeautifulSoup относительно прост для понимания новичкам в программировании и позволяет решать маленькие задачи за короткий срок.
Скорость и нагрузка
Scrapy с легкостью выполняет крупную по объему работу. Он может сканировать несколько ссылок одновременно менее чем за минуту в зависимости от общего количества. Это происходит плавно благодаря Twister, который работает асинхронно (без блокировки)BeautifulSoup используется для простого и эффективного парсинга. Он работает медленнее Scrapy, если не использовать multiprocessing .
Расширяемость
Scrapy предоставляет функциональность Item pipelines , с помощью которой можно писать функции для веб-сканера. Они будут включать инструкции о том, как робот должен проверять, удалять и сохранять данные в базу данных. Spider Contracts используются для проверки парсеров, благодаря чему можно создавать как базовые, так и глубокие парсеры. Он же позволяет настраивать множество переменных: повторные попытки, перенаправление и т. д.Если проект не предполагает большого количества логики, BeautifulSoup отлично для этого подходит, но если нужна настраиваемость, например прокси, управление куки и распределение данных, то Scrapy справляется лучше.

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

Установка Scrapy

С установленным Python 3.0 (и новее) при использовании Anaconda можно применить команду conda для установки scrapy . Напишите следующую команду в Anaconda:

Чтобы установить Anaconda, посмотрите эти руководства PythonRu для Mac и Windows.

Также можно использовать установщик пакетов pyhton pip. Это работает в Linux, Mac и Windows:

Scrapy Shell

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

Откройте командную строку и напишите следующую команду:

При использовании Anaconda можете написать эту же команду прямо в anaconda prompt . Вывод будет выглядеть приблизительно вот так:

Примечание: всегда заключайте ссылку в кавычки, одинарные или двойные

Вывод будет следующий:

Парсер возвращает response (ответ), который можно посмотреть с помощью команды view(response) . А страница откроется в браузере по умолчанию.
С помощью команды print(response.text) можно посмотреть сырой HTML.

Отобразится скрипт, который генерирует страницу. Это то же самое, что вы видите по нажатию правой кнопкой мыши в пустом месте и выборе «Просмотр кода страница» или «Просмотреть код». Но поскольку нужна конкретная информация, а не целый скрипт, с помощью инструментов разработчика в браузере необходимо определить требуемый элемент. Возьмем следующие элементы:

  • Название планшета
  • Цена планшета
  • Количество заказов
  • Имя магазина

Нажмите правой кнопкой по элементу и кликните на «Просмотреть код».

Инструменты разработчика сильно помогут при работе с парсингом. Здесь видно, что есть тег <a> с классом item-title , а сам текст включает название продукта:

Использование CSS-селекторов для извлечения

Извлечь эту информацию можно с помощью атрибутов элементов или CSS-селекторов в виде классов. Напишите следующее в оболочке Scrapy, чтобы получить имя продукта:

extract_first() извлекает первый элемент, соответствующий селектору css. Для извлечения всех названий нужно использовать extract() :

Следующий код извлечет ценовой диапазон этих продуктов:

То же можно повторить для количества заказов и имени магазина.

Использование XPath для извлечения

XPath — это язык запросов для выбора узлов в документах типа XML. Ориентироваться по документу можно с помощью XPath. Scrapy использует этот же язык для работы с объектами документа HTML. Использованные выше CSS-селекторы также конвертируются в XPath, но в большинстве случаев CSS очень легко использовать. И тем не менее важно значить, как язык работает в Scrapy.

Откройте оболочку и введите fetch("https://www.aliexpress.com/category/200216607/tablets.html/") как и раньше. Попробуйте написать следующий код:

Он покажет весь код в теге <html> . / указывает на прямого потомка узла. Если нужно получить теги <div> в html , то необходимо писать:

Для XPath важно научиться понимать, как используются / и // , чтобы ориентироваться в дочерних узлах.

Если необходимо получить все теги <div> , то нужно написать то же самое, но без /html :

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

Используйте text() для извлечения всего текста в узлах

Создание проекта Scrapy и собственного робота (Spider)

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

Это создаст скрытую папку в директории с Python или Anaconda по умолчанию. Она будет называться aliexpress , но можно выбрать любое название. Структура директории следующая:

Структура проекта Scrapy

Файл/папкаНазначение
scrapy.cfg Файл настройки развертывания
aliexpress/ Модуль Python проекта, отсюда импортируется код
__init.py__ Файл инициализации
items.py Python файл с элементами проекта
pipelines.py Файл, который содержит пайплайн проекта
settings.py Файл настроек проекта
spiders/ Папка, в которой будут храниться роботы
__init.py__ Файл инициализации

После создания проекта нужно перейти в новую папку и написать следующую команду:

Это создает файл шаблона с названием aliexpress_tables.py в папке spiders , как и было описано выше. Вот код из этого файла:

В коде можно увидеть name, allowed_domains, start_urls и функцию parse .

можно использовать функцию parse() из BeautifulSoup в Scrapy для парсинга HTML-документа.

Примечание: извлечь данные можно с помощью css-селекторов, используя как response.css() , так и XPath (XML), что позволит получить доступ к дочерним элементам. Пример response.xpath() будет описан в коде функции pass() .

Добавим изменения в файл aliexpress_tablet.py . В start_urls теперь еще один URL. Логику извлечения можно указать в функции pass() :

zip() берет n элементов итерации и возвращает список кортежей. Элемент с индексом i в кортеже создается с помощью элемента с индексом i каждого элемента итерации.

yield используется каждый раз при определении функции генератора. Функция генератора — это обычная функция, отличие которой в том, что она использует yield вместо return . yield используется каждый раз, когда вызывающая функция требует значения. Функция с yield сохраняет свое локальное состояние при выполнении и продолжает исполнение с того момента, где остановилась после того, как выдала одно значение. В данном случае yield возвращает Scrapy сгенерированный словарь, который будет обработан и сохранен.

Теперь можно запустить робота и посмотреть результат:

Экспорт данных

Данные должны быть представлены в форматах CSV или JSON, чтобы их можно было анализировать. Этот раздел руководства посвящен тому, как получить такой файл из имеющихся данных.

Для сохранения файла CSV откройте settings.py в папке проекта и добавьте следующие строки:

После сохранения settings.py снова запустите scrapy crawl aliexpress_tablets в папке проекта. Будет создан файл aliexpress.csv .

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

  • FEED_FORMAT — настройка необходимого формата сохранения данных. Поддерживаются следующие:
  • FEED_URI — местоположение файла. Его можно сохранить в локальном хранилище или по FTP.

Feed Export также может добавить временную метку в имя файла. Или его можно использовать для выбора папки, куда необходимо сохранить данные.

  • %(time)s — заменяется на временную метку при создании ленты
  • %(name)s — заменяется на имя робота
  • Сохранить по FTP используя по одной папке на робота:

Изменения для FEED, сделанные в settings.py , будут применены ко всем роботам в проекте. Можно указать и отдельные настройки для конкретного робота, которые перезапишут те, что есть в settings.py .

response.url вернет URL страницы, с которой был сгенерирован ответ. После запуска парсера с помощью scrapy crawl aliexpress_tables можно просмотреть json-файл в каталоге проекта.

Следующие страницы, пагинация

Вы могли обратить внимание на две ссылки в start_urls . Вторая — это страница №2 результатов поиска планшетов. Добавлять все ссылки непрактично. Робот должен быть способен исследовать все страницы сам, а в start_urls указывается только одна стартовая точка.

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

Здесь видно, что тег <span> с классом .ui-pagination-active — это текущая страница, а дальше идут теги <a> со ссылками на следующие страницы. Каждый раз нужно будет получать тег <a> после тега <span> . Здесь в дело вступает немного CSS. В этом случае нужно получить соседний, а на дочерний узел, так что потребуется сделать CSS-селектор, который будет искать теги <a> после тега <span> с классом .ui-pagination-active .

Запомните! У каждой веб-страницы собственная структура. Нужно будет изучить ее, чтобы получить желаемый элемент. Всегда экспериментируйте с response.css(SELECTOR) в Scrapy Shell, прежде чем переходить к коду.

Измените aliexpress_tabelts.py следующим образом:

  • Сначала извлекается ссылка следующей страницы с помощью next_page = response.css(NET_PAGE_SELECTOR).extract_first() , а потом, если переменная next_page получает ссылку и она не пустая, запускается тело if .
  • response.urljoin(next_page) — метод parse() будет использовать этот метод для построения нового URL и получения нового запроса, который будет позже направлен вызову.
  • После получения нового URL он парсит ссылку, исполняя тело for и снова начинает искать новую страницу. Так будет продолжаться до тех пор, пока страницы не закончатся.

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

Scrapy сделает для вас все!

Из этого руководства вы узнали о Scrapy, о его отличиях от BeautifulSoup, о Scrapy Shell и о создании собственных проектов. Scrapy перебирает на себя весь процесс написания кода: от создания файлов проекта и папок до обработки дублирующихся URL. Весь процесс парсинга занимает минуты, а Scrapy предоставляет поддержку всех распространенных форматов данных, которые могут быть использованы в других программах.

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

Эта статья была первоначально опубликована в Pythongasm

Вступление

Установка

Убедитесь, что вы используете Python 3. Откройте терминал и выполните следующую команду:

Скребковая оболочка

Выполните эту команду, чтобы запустить оболочку scrapy:

Мы используем функцию fetch() для извлечения ответа из URL-адреса.

Это вернет a Html-ответ объект, хранящийся в переменной response .

Вы можете просмотреть этот ответ (который сохраняется локально на устройстве) в своем браузере:

Разбор HTML

Давайте рассмотрим этот пример:

Теперь давайте вернемся к браузеру и найдем название веб-страницы, которую мы только что загрузили. Щелкните правой кнопкой мыши на веб-странице и выберите Проверить. Заголовки обычно присутствуют внутри тега head .

Мы используем эту функцию css () (также называемую селектором CSS) для выбора элементов веб-страницы. Например, мы можем выбрать тег title следующим образом:

функция css() возвращает список (называемый Selector List ), и каждый элемент этого списка является объектом Selector . На веб-странице есть только один тег title , поэтому неудивительно, что длина этого списка равна 1.

Однако это не желаемый результат. Мы ищем текст внутри заголовка, а не весь HTML. Чтобы получить текст внутри тега, мы используем ::text :

Вы можете видеть , что данные в выходных данных теперь изменились на data='new york real estate' , что является текстом внутри тега title .

Мы можем получить строковые значения из Селектора объектов, вызвав для них функцию get () .

Интересно, что когда вы вызываете функцию get() непосредственно в списке ( Список селекторов ), она по-прежнему дает вам тот же результат.

Это связано с тем, что при вызове функции get() без указания индекса она возвращает строковое значение самого первого элемента в списке SelectorList . Другими словами, вы можете вызвать get() в списке селекторов , и вместо того, чтобы выдавать ошибку, он вызывает функцию get () для первого элемента в списке.

У нас есть еще один метод, называемый get all() . Эта функция просто вызывает функцию get() для каждого элемента в списке селекторов . Следовательно, функция getall() может быть вызвана в списке селекторов для получения списка строк.

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

Скраповый проект

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

Перейдите в каталог пауков. Именно здесь мы будем спасать наших пауков (краулеров). Вы можете создать там новый файл python и начать писать код. Однако мы также можем выполнить следующую команду, чтобы сгенерировать паука с некоторым начальным кодом.

Теперь откройте realestate.py файл в каталоге пауков. Это должно выглядеть так:

Когда мы запускаем паука, запрос отправляется на все URL-адреса внутри start_urls . Это специальная переменная, которая автоматически вызывает функцию parse() и передает ответ в качестве аргумента.

Сохраните файл и запустите паука с помощью этой команды:

Теперь давайте извлекем другие элементы на веб-странице. Проверьте HTML-код первого объявления. (Щелкните правой кнопкой мыши > Проверить элемент, который вы хотите проверить):

На веб-странице должно быть 120 (или равно количеству списков) таких фрагментов.

Это позволит выбрать все такие фрагменты и составить из них список Селекторов|/.

Давайте попробуем извлечь данные, цену, заголовок объявления и гиперссылку из первого объявления

Дата присутствует внутри тега time . Поскольку здесь есть только один тег time , нам не нужно указывать здесь имя класса CSS:

Теперь извлеките заголовок и гиперссылку из объявления, которые присутствуют внутри тега a . Нам нужно удалить пробелы в имени класса CSS с помощью . :

Кроме того, как вы можете видеть, мы добавляем ::attr() в аргумент для извлечения атрибутов, таких как src , href из тегов.

Давайте завершим функцию parse () . Нам просто нужно перебрать список Селекторов и получить подробную информацию из Селектора объектов внутри него , как мы сделали с первым Селектором объектом

Запустите этого паука еще раз, и вы увидите такой результат:

Мы успешно очистили нужные нам данные из Craigslist. Вы всегда можете включить дополнительную информацию, которую, возможно, захотите извлечь. С небольшими изменениями мы также можем очистить следующие несколько страниц Craigslist (2,3,4 и так Далее).

Экспорт данных

Теперь пришло время структурировать его, как только у нас будет готов скребок, и сделать полезный набор данных. Это довольно легко сделать.

Перейдите в Craigslist > Craigslist > items.py

Вам просто нужно определить новые атрибуты элемента Craigslist класса (это очень похоже на класс словаря Python):

Откройте realestate.py файл и импортируйте элемент Craigslist класс из items.py:

Создайте экземпляр этого класса, называемый items , и назначьте значения точно так же, как вы сделали бы со словарем.

Если вы не знакомы с ключевым словом yield , вы можете прочитать об этом здесь . На данный момент вы можете просто предположить, что он выполняет работу , аналогичную return , но с гораздо большей эффективностью.

Запустите паука с аргументом -o output.csv вот так:

Вы обнаружите, что выходные данные были сохранены в родительском каталоге (Craigslist). Помимо CSV, вы также можете экспортировать данные в другие форматы, такие как JSON, XML и т.д.

Настройки Scrapy

Перейдите в craigslist > craigslist > settings.py. Этот файл в основном позволяет вам настраивать множество вещей.

Аналогично, вы можете настроить пользовательский агент вашего искателя (строки пользовательского агента-это идентификаторы, с помощью которых веб-сайт распознает, какой запрос он получает). Вы можете прочитать больше о user-agent здесь . Допустим, вы хотите подделать пользовательский агент Google Chrome (работающий на macOS). Вы можете назначить строку агента пользователя USER_AGENT

Вывод

Это было знакомство со скрэпи. Как мы уже обсуждали, есть много других вещей, которые мы можем сделать с помощью scrapy (или веб-скребка в целом). Существует множество общедоступных веб-сайтов, которые вы, возможно, захотите очистить и преобразовать их содержимое в огромные наборы данных для последующего использования (визуализация, прогнозирование и т. Д.). Например, вы можете очистить все твиты, сделанные пользователем. Надеюсь, вам понравилось читать эту статью.


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

Если вы хотите перейти прямо в код, перейдите к этомуGitHub репо,

Рейтинги игроков FIFA 20 вышли, и, будучи фанатом футбола, я нахожу такие данные захватывающими Вы можете найти данные здесь наsofifa, Мы будем собирать данные и сохранять их в CSV-файле с помощью Scrapy.

Я буду использовать Python 3 и Scrapy 1.7 для этого поста. Установить scrapy довольно просто для Linux и Mac через pip с помощью следующей команды:

Пользователям Windows нужно будет установить Anaconda. Вы можете найти инструкции по установкеВот, После установки Anaconda откройте приглашение Anaconda и введите следующую команду для установки Scrapy:

Как только в нашей системе появится Scrapy, следующим шагом будет создание проекта. Откройте терминал / Anaconda и введите


По умолчанию Scrapy создаст кучу файлов и каталогов внутри fifa20.


внутри fifa20 найдешь другую fifa20 папка, которая содержит весь наш код. spiders Каталог содержит пауки Scrapy, отвечающие за извлечение данных из Интернета. Как правило, каждый паук отвечает за очистку одного конкретного сайта. Проект Scrapy может иметь несколько пауков. Например, если вы создаете систему мониторинга цен, вы можете очистить несколько веб-сайтов, таких как amazon, walmart, newegg и т. д. На каждом из этих сайтов будет выделенный паук для обработки логики очистки.

settings.py содержит настройки для проектов, такие как количество одновременно работающих потоков, задержки между 2 запросами, какое промежуточное программное обеспечение или конвейер использовать.

Для этого проекта мы установим настоящий пользовательский агент. Идите вперед и измените эти переменные в settings.py ,

Ваш settings.py файл будет выглядеть примерно так

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

Чтобы создать паука, перейдите во внешний fifa20 каталог и тип проекта

Это создаст паука внутри spiders каталог под названием софифа. Вот как выглядит файл

Давайте попробуем понять, что здесь происходит.

Мы будем использовать следующий URL в качестве нашего начального URL

Не беспокойтесь о беспорядочно выглядящем URL, он был сгенерирован путем выбора определенных столбцов, которые мы хотим получить в нашем последнем наборе данных.

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

Если вы хотите увидеть, как выглядит страница в браузере, введите

Вы сможете просмотреть страницу в браузере.

У нас есть возможность использовать css-селектор и / или xpath в Scrapy. Если вы новичок в концепции css и xpath, ознакомьтесь с этими руководствами, чтобы понять, как это работает.

Теперь давайте проверим веб-страницу и получим данные.


Мы можем видеть все данные внутри табличного тега, а информация о каждом игроке находится внутри tbody -> tr , Проход по всем тегам tr поможет нам приблизиться к данным.

Это напечатает список страны и имени игрока рядом. Давайте попробуем понять этот фрагмент.

Для простоты давайте проверим все с данными одного игрока и используем их в нашем скрипте. Так что в оболочке наберите

Разница между использованием > и пробел при прохождении через теги

  • > означает непосредственный дочерний тег, как в td.col-name>div>a
  • пространство означает любого ребенка, не обязательно непосредственного ребенка, как в td.col-name span.pos который содержит a тег между.

Давайте просто получим первую позицию, которая является основной позицией игрока.

extract () возвращает список, в то время как get () или extract_first () возвращает первый элемент

Точно так же мы можем получить другие поля как

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

Приведенная выше строка печатает неполный URL-адрес, который является относительным URL-адресом, который является обычной практикой на современных веб-сайтах Чтобы завершить это, scrapy предоставляет метод urljoin ,

Это напечатает полный URL. Теперь нажмите на следующую страницу и попробуйте проверить, работает ли наш CSS для всех страниц. Вы найдете 2 ссылки на страницы: Предыдущая и Следующая, а селектор, который мы использовали, получит ссылку на предыдущую страницу.

Решение:Используйте Xpath. До сих пор мы могли различать веб-элементы, используя класс, но так будет не всегда. Единственное различие между этими двумя ссылками на страницы состоит в текстовом содержании («Предыдущая» и «Следующая»). Xpath позволяет нам точно выбирать веб-элемент на основе текстового содержимого.

Давайте разберемся с этим:

  • //span[@class="bp3-button-text" and text()="Next"] выберет промежуток с классом bp3-button-text и текстСледующий.
  • parent::a/@href пройдут вверх по дереву и получат его родителя a атрибут тега href.

Опять мы можем использовать response.urljoin чтобы завершить URL. Так что наш код будет примерно таким.

Что это делает, это проверить, если next_page элемент присутствует или нет. Затем он отправляет запрос на эту страницу, присоединяясь к URL-адресу и вызывает parse метод снова. parse является обратным вызовом по умолчанию, поэтому вы можете удалить аргумент обратного вызова, если хотите. Теперь сканер рекурсивно сканирует каждую страницу, одновременно передавая данные.

Вот как будет выглядеть наш финальный код.

Scrapy имеет встроенную функцию для выгрузки данных непосредственно в файл json или csv. Помните name переменная в нашем SofifaSpider класс, мы будем использовать это, чтобы вызвать паука.

Если вы хотите данные в JSON

Scrapy предоставляет множество функций прямо из коробки, что позволяет легко писать скребки и собирать данные. Мы видели некоторые из них в этой статье. Под 40 строками кода нам удалось создать сканер, который будет обрабатывать данные размером более 18 КБ менее чем за 30 минут.

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

Вы можете скачать код и данные с этогоGitHub репо,

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

Далее мы увидим, как очистить данные и подготовить их к анализу.

Вот некоторые учебные материалы, которые вы можете найти полезными:

Дайте мне знать, если у вас есть путаница в коде или вам нужна помощь в определении селекторов xpath и css. Также, если у вас есть предложения по анализу этих данных на следующих этапах, дайте мне знать в комментариях.

Базовые знания HTML и CSS помогут вам лучше понять эту статью. Прочтите эту статью, чтобы узнать больше о HTML и CSS.


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

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

Scrapy предоставляет мощную основу для извлечения данных, их обработки и последующего сохранения.

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

В этом разделе вы познакомитесь с одним из самых популярных инструментов для просмотра веб-страниц под названием BeautifulSoup и сравните его с Scrapy.

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

BeautifulSoup также широко используется для парсинга. Это пакет Python для анализа документов HTML и XML и извлечения данных из них. Он доступен для Python 2.6+ и Python 3.

Scrapy - это полный пакет для загрузки веб-страниц, их обработки и сохранения в файлах и базах данных.
BeautifulSoup - это, в основном, анализатор HTML и XML, требующий дополнительных библиотек, таких как requests, urlib2 для открытия URL-адресов и сохранения результата.

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

С помощью Scrapy можно легко выполнить большую работу. Он может сканировать группу URL-адресов не более, чем за минуту, в зависимости от размера группы, и делает это очень плавно, так как использует Twister, который работает асинхронно. BeautifulSoup эффективно используется для простого парсинга. Это медленнее, чем Scrapy, если вы не используете многопроцессорность.

Scrapy предоставляет конвейеры Item, которые позволяют вам писать функции в вашем пауке, которые могут обрабатывать ваши данные, например выполнять проверку данных, удаление данных и сохранение данных в базе данных. Он предоставляет Contracts для тестирования ваших пауков, а также позволяет создавать типовые и глубокие сканеры. Это позволяет вам управлять множеством переменных, таких как повторные попытки, перенаправление и так далее.
Если проект не требует больших усложнений, подойдет BeautifulSoup, но если вам нужно много настроек, таких как прокси, управление файлами cookie и конвейерами данных, Scrapy - лучший вариант.

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


С установленным Python 3.0 (и выше), если вы используете anaconda, вы можете использовать conda для установки scrapy. В командной строке anaconda введите следующую команду:

Кроме того, вы можете использовать pip. Это работает для Linux, Mac и Windows:

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