Парсинг веб-страниц на Python с использованием Scrapy
Данные являются неотъемлемой частью любого приложения для iOS, Android или веб-сайта. С учетом взрывного роста профессий Data Scientist, Data Analyst, Data Engineer и т. д., данные становятся еще более важными. Так как получить эти данные? Конечно, когда вы сталкиваетесь с какой-либо проблемой, вы всегда обращаетесь к поисковой системе. И эти поисковые системы всегда приводят вас к веб-страницам с большим количеством плотных данных, которые нельзя скопировать вручную и сохранить в файл Excel. Это пустая трата времени. Начните обращать внимание на термин "парсинг данных". Парсинг данных - это полезное занятие, которое позволяет вам оптимизировать время поиска данных. Действительно, вам просто нужно написать небольшой код, отправить запросы на веб-сайты и ждать результатов.
Возможно, вы не знаете, но уже существует множество приложений для парсинга данных: Google Scraping Tool, JSOUP, BeautifulSoup, ... Сегодня я расскажу вам о Scrapy. Scrapy известен как бесплатный и открытый фреймворк для сбора данных с веб-страниц, написанный на Python. Он также может извлекать данные через API.
Как установить scrapy?
Scrapy работает на Python версии 2.7 или выше 3.4.
Прежде всего, рекомендуется использовать виртуальное окружение, созданное с помощью Virtualenv или Anaconda, чтобы избежать конфликтов версий пакетов Python при работе с проектом Scrapy.
Используйте следующую команду для установки scrapy: pip install scrapy
Создание проекта scrapy
Используйте следующую команду для создания проекта scrapy: scrapy startproject имя_вашего_проекта
Как работает процесс парсинга данных?
Перейдем к первому парсингу данных
Прежде чем приступить к парсингу данных, нужно понять, что такое Spiders в Scrapy. Spiders - это классы, которые определяют, как веб-страницы будут парситься и как извлекаться структура данных. Другими словами, Spiders - это место, где вы определяете пользовательские задачи для парсинга и анализа любой веб-страницы.
В папке имя_проекта/spiders
создайте произвольный файл .py:
**import **scrapy**class **ExampleSpider1(scrapy.Spider):
name = **'examplespider1' **allowed_domains = [**'www.familug.org'**]
start_urls = [**'https://www.familug.org/search/label/Python'**,
**'https://www.familug.org/search/label/Command'**]
**def **parse(self, response):
self.logger.info(**'A response from {} just arrived'**.format(response.url))
self.logger.debug(**'Nothing wrong in {}'**.format(response.url))
Вышеуказанный код создает паука для парсинга данных с веб-страниц, перечисленных в start_urls. Я объясню атрибуты scrapy.Spider.
**name: **имя вашего паука. Вы можете выбрать любое имя, но оно не должно совпадать с именем другого паука, чтобы избежать конфликтов.**allowed_domains: **список доменных имен веб-сайтов, с которых вы хотите парсить данные.**start_urls: **список URL-адресов, с которых вы хотите парсить данные.**parse: **важный и основной метод паука scrapy для анализа ответов, полученных от веб-страниц. Кроме того, обратите внимание, что сам scrapy.Spider предоставляет полезный метод logger в Python. Метод logger поможет вам создать структуру системы регистрации https://docs.python.org/3/library/logging.html
Как запустить паука?
Вернитесь в папку вашего проекта и откройте терминал.
Просто используйте следующую команду: scrapy crawl examplespider1
Парсинг данных и сохранение данных
Вы уже знаете основы работы простого паука :) Теперь давайте немного углубимся. Предположим, мы хотим написать код для парсинга данных на веб-сайте и сохранения их в файл json. Как это сделать? Добавьте следующий код под кодом вашего первого паука:
class ExampleSpider2(scrapy.Spider):
name = 'examplespider2'
allowed_domains = ['www.familug.org']
start_urls = ['https://www.familug.org/search/label/Python',
'https://www.familug.org/search/label/Command']
def parse(self, response):
for title in response.css('h3.post-title.entry-title a::text').getall():
self.logger.info('Welcome ' + title)
yield {'title': title}
for href in response.css('h3.post-title.entry-title a::attr(href)').getall():
yield scrapy.Request(href, self.parse)
Помимо атрибутов и методов, похожих на паука examplespider1, examplespider2 имеет небольшое отличие в методе parse. response.css: это простой и удобный метод для анализа ответов, полученных от веб-сайта. Но как он работает? Просто. Возьмите приведенный выше пример. Он будет искать html-код веб-страницы с тегом h3, классом 'post-title entry-title' и следующим тегом a с содержимым в виде текста. Как же узнать, как выглядит этот html-код, чтобы мы могли искать нужное содержимое? Важная часть парсинга данных - зайти на сам веб-сайт, нажать ctrl+U, чтобы посмотреть html-код. Искать нужное содержимое. И лучше всего, если вы также просмотрите html-код связанных ссылок на этом веб-сайте, чтобы увидеть структуру html-кода. yield: это знакомый метод в Python. Он будет полезен, если вы хотите возвращать значения по одному и контролировать их. Кроме того, yield поможет избежать прерывания кода при возникновении ошибки. Как я уже упоминал выше, мы ищем связанные ссылки на другие веб-страницы внутри этого веб-сайта. Зачем? Цель парсинга данных - найти как можно больше данных со всех веб-страниц и использовать их по назначению. response.css('h3.post-title.entry-title a::attr(href)'): ищет связанные ссылки на следующие веб-страницы, также известные как пагинация. Затем отправляет запросы для следующих веб-страниц. И так далее, метод parse продолжает работу с ними.
Хранение данных в файле JSON
Просто запустите следующий код в терминале: scrapy crawl examplespider2 -o data.json
Обратите внимание, что файл data.json появится в папке вашего проекта. Félicitations!
Вот и все.