CoderCastrov logo
CoderCastrov
Парсер

Парсинг вашего первого веб-сайта с помощью Scrapy

Парсинг вашего первого веб-сайта с помощью Scrapy
просмотров
7 мин чтение
#Парсер

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

Весь код будет находиться на GitHub.

(1) Обзор парсинга

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

(1.1) Установка

Просто перейдите на сайт и установите с помощью pip.

pip install scrapy

(2) Понимание основ HTML

Чтобы собирать информацию с веб-сайта, сначала нам нужно понять основную структуру HTML-кода. HTML расшифровывается как HyperText Markup Language, и, как следует из названия, это язык разметки для создания веб-страниц. Сначала нам нужно понять, как выглядит базовая структура HTML-страницы. Я написал простой код, чтобы проиллюстрировать это.

Теперь нам нужно понять теги и атрибуты. Теги - это вещи с <>. Один тег должен иметь свой "закрывающий тег", чтобы работать. Как вы можете видеть в <h1>, у него есть закрывающий тег </h1> в конце. Между этими тегами можно разместить информацию, как в случае с фразой "Привет". Атрибуты, с другой стороны, существуют для добавления дополнительной информации к тегу. В этом примере я использую атрибут style, чтобы задать цвет моей фразе. Весь процесс парсинга заключается в получении этих тегов и атрибутов для фильтрации и сбора данных.

(3) Понимание XPath

XPath - это язык для выбора информации из XML-документов, но в нашем случае мы будем использовать его для HTML. Основное использование довольно просто. Я использую свой код в качестве примера. Если я хочу выбрать тег h1, мне просто нужно написать //h1 и это выберет все теги h1 на этом веб-сайте. Если я хочу получить только тег с атрибутом style и цветом tomato, я просто напишу //h1[@style = 'color:Tomato;']. Шаблон такой: //тег[@атрибут = 'значение атрибута']. Если вы хотите получить один тег внутри другого тега, просто напишите //тег1/тег2 и вы получите тег2.

(4) Создание вашего первого парсера

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

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

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

Щелкните правой кнопкой мыши и выберите "Инспектировать элемент"

Откроется это.

В верхнем левом углу есть кнопка

Нажмите на нее, и вы увидите, что при наведении мышью на объект он будет окрашиваться в синий цвет.

Если нажать на него, вы увидите, что в той части, где находится код, будет изменяться отображение HTML-кода, соответствующего объекту, по которому вы щелкнули.

Чтобы создать выражение XPath, вы можете щелкнуть на этом HTML-коде, чтобы выбрать инструмент разработчика, а затем нажать Ctrl + F, и откроется локальный поиск.

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

python -m scrapy shell

Если вы используете Anaconda, просто введите

scrapy shell

Используйте функцию fetch(), чтобы получить доступ к веб-сайту

После использования fetch() у вас будет объект ответа. Чтобы использовать xpath, вы должны использовать атрибут с именем xpath(). Теперь я получу текст "All product"

Функция text() используется для получения всего текста между тегами, а функция get() - для получения первого элемента результата. Я покажу другие функции для получения информации в следующих примерах.

Я хочу получить 2 куска информации на этом веб-сайте.

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

Вы можете видеть, что название находится внутри атрибута с именем title в теге <a>. Поэтому я введу свой XPath на веб-странице, чтобы получить это.

Вы можете видеть, что есть один текст "1 of 20". Это означает, что на этой странице есть 20 элементов, соответствующих этому XPath-выражению, которое я написал. На странице 20 книг, поэтому я просто должен получить название с помощью этого XPath-выражения.

На этот раз в конце я добавил @title, потому что я хотел получить информацию из атрибута title. Каждый раз, когда вы хотите получить значение атрибута, вы можете добавить в конце @атрибут, и вы получите его. В конце я использовал функцию get-all, потому что я хотел получить все значения. Если бы я использовал функцию get, я бы получил только первое значение, как показано в этом примере.

Повторив тот же процесс для цены, вы получите это XPath-выражение.

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

В терминале вы введете это в окне терминала Windows.

python -m scrapy startproject books

если вы используете Anaconda, просто введите

scrapy startproject books

Эта команда создаст папку с вашим проектом. Перейдите в эту папку и введите эту команду в окне терминала Windows.

python -m scrapy genspider book books.toscrape.com/catalogue/page-1.html

Если вы используете Anaconda, просто введите

scrapy genspider book books.toscrape.com/catalogue/page-1.html

Эта команда создаст основной файл парсера. При создании проекта создаются множество файлов. (если вы хотите лучше понять, что делает каждый файл, прочтите эту страницу документации)

Это основной шаблон.

Просто объясняю код

name: это просто имя парсера

allowed_domains: содержит все домены, которые парсеру разрешено парсить. Когда парсер инициируется, он получает файл robot.txt с этой страницы и проверяет каждую часть веб-сайта, которую он не может парсить. Если веб-сайт не указан в этой переменной, код просто проигнорирует его.

start_urls: в основном это веб-сайт, который мы будем парсить.

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

Теперь мы получим переменные.

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

(5) Пагинация

На этом веб-сайте есть кнопка "Далее" в правом нижнем углу. Если вы нажмете на кнопку "Далее", вы будете перенаправлены на другую страницу с большим количеством книг для парсинга.

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

На каждой странице будет находиться кнопка "Далее".

Страница, на которой ее нет, будет последней страницей.

Поэтому после сбора всей информации вы можете получить ссылку на кнопке "Далее" и использовать объект Request для вызова функции parse и использования новой ссылки. Сначала посмотрим, какая ссылка находится на кнопке "Далее".

Итак, они не имеют полной ссылки. Мы будем объединять ссылку и передавать ее в метод Request.

Ссылка на кнопку будет находиться в переменной с именем button. Если эта переменная содержит ссылку, будет активирован метод Request, если нет, паук останавливается. Полный код приведен ниже.

Чтобы получить данные и поместить их в CSV-файл, вы можете использовать эту команду в командной строке Windows.

python -m scrapy crawl book -o books.csv

Если вы используете Anaconda, вы можете использовать это.

scrapy crawl book -o books.csv

(6) Заключение

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

Библиография

Scrapy

Html

Xpath