CoderCastrov logo
CoderCastrov
Парсер

Парсинг веб-сайтов: Как извлечь всю Покедекс с помощью Python

Парсинг веб-сайтов: Как извлечь всю Покедекс с помощью Python
просмотров
5 мин чтение
#Парсер
Table Of Content

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

    Сегодня я хочу показать вам, как извлечь весь Покедекс с https://pokemon.fandom.com/wiki/List_of_Pok%C3%A9mon. Мы соберем данные, такие как номер в Покедексе, имя и типы.

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

    Итак, давайте начнем.

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

    pip install scrapy

    Теперь мы можем создать наш первый проект Scrapy (не забудьте перейти в папку, где вы хотите разместить свой проект Scrapy, в моем случае я хочу, чтобы этот проект был в моих документах, поэтому мне нужно выполнить команду "cd Documents"). Я назову этот проект "POKEDEX".

    scrapy startproject POKEDEX

    Отлично. Теперь вы можете открыть свой любимый редактор кода и открыть папку POKEDEX, которую создал для нас Scrapy. Структура папки будет выглядеть примерно так:

    Мы сосредоточимся только на папке spiders и файле items.py. Так что вы помните, я сказал вам, что мы собираемся собирать данные, такие как номер в Покедексе, имя и типы? Нам нужно создать эти поля в нашем проекте, и мы делаем это в файле items.py.

    Что мы делаем здесь: сначала мы импортируем scrapy (очевидно, поэтому мы его установили), и у нас есть класс PokedexItem, который наследуется от scrapy.Item. Да, я знаю, вы задаетесь вопросом, что такое Item в Scrapy, и позвольте мне сказать вам, что в основном Item - это шаблон или структура, которую мы собираемся использовать для сохранения информации. Итак, у нас есть наш элемент, и у этого элемента есть некоторые поля, вот и все! Мы закончили с файлом items.py.

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

    scrapy genspider pokedex_list [https://pokemon.fandom.com/wiki/List_of_](https://pokemon.fandom.com/wiki/List_of_Pok%C3%A9mon)Pokémon

    Если вы перейдете в папку spiders, вы увидите новый файл с названием pokedex_list.py, и он будет выглядеть примерно так:

    Что у нас здесь: класс PokedexListSpider, который наследуется от scrapy.Spider, и у него есть некоторые обязательные поля, такие как имя и start_urls. allowed_domains не является обязательным, поэтому вы можете избавиться от него.

    Метод parse здесь важен, потому что мы собираемся поместить наш код туда, так что давайте начнем с интересной части. Если вы перейдете по адресу https://pokemon.fandom.com/wiki/List_of_Pok%C3%A9mon, вы увидите, что там есть таблица для каждого поколения Покемонов. Итак, если мы щелкнем правой кнопкой мыши по таблице и перейдем к элементу "Инспектировать", мы увидим, что эти таблицы используют CSS-класс "wikitable".

    Как вы можете видеть в таблице, у нас есть теги <tr>, которые соответствуют каждому покемону. Так что я думаю, что вы знаете, что нам нужно сделать здесь. Да, вы правы! Нам нужно извлечь всю информацию внутри тегов <tr>. Например, если мы посмотрим на тег <tr> для Bulbasaur, у нас будет что-то вроде этого:

    Итак, нам нужно извлечь номер, имя и два типа. Здесь CSS-селекторы делают свою работу. Сначала нам нужно извлечь все теги <tr> из таблиц, у которых есть класс "wikitables".

    def parse(self, response):
        all_tables = response.css('table.wikitable tr')

    Переменная all_tables - это объект, который содержит список всех тегов <tr>, поэтому мы можем перебирать этот список и получать информацию для каждого покемона. Но сначала нам нужны CSS-селекторы для каждого поля, которое нам нужно.

    queries = {
        'number': 'td:nth-child(1)::text',
        'name': 'td:nth-child(3) a::text',
        'type_1': 'td:nth-child(4) span::text',
        'type_2': 'td:nth-child(5) span::text'
    }

    Это CSS-селекторы или "запросы", которые нам нужны для получения информации из all_tables. Теперь с помощью цикла мы можем переходить к каждому покемону (каждому тегу <tr>) и собирать информацию с помощью наших CSS-селекторов.

    Но нам нужно сохранить эту информацию где-то, и вот почему мы создали поля в нашем PokedexItem, верно? Чтобы сохранить данные в этих полях, сначала мы создаем экземпляр нашего PokedexItem (строка 8). и чтобы сохранить что-то в поле, мы можем сделать что-то вроде:

    self.item["name"] = pokemon.css(queries["name"])

    Очень просто, не так ли? Мы перебираем все теги <tr> и в каждом теге <tr> мы перебираем наш словарь запросов, чтобы сохранить данные в его конкретное поле. Наконец, нам нужно вернуть наш элемент. Итак, мы закончили, и мы можем запустить наш паук pokedex_list и сохранить данные в CSV-файл с помощью следующей команды:

    scrapy crawl pokedex_list -o pokedex.csv

    Я знаю, что это довольно запутанно, и мне нужно объяснить более конкретные моменты в этом коде. Но я просто хотел показать вам, насколько легко и быстро можно сделать парсинг веб-сайтов. Если вы хотите стать экспертом в парсинге веб-сайтов, я могу порекомендовать плейлист Scrapy Tutorial от builwithpython на YouTube: https://www.youtube.com/watch?v=ve_0h4Y8nuI&list=PLhTjy8cBISEqkN-5Ku_kXG4QW33sxQo0t

    Я узнал о парсинге веб-сайтов с помощью этих видео, и я знаю, что и вы сможете это сделать :)