CoderCastrov logo
CoderCastrov
Парсер веб-страниц

Как написать конвейер данных Scrapy для MySQL

Как написать конвейер данных Scrapy для MySQL
просмотров
3 мин чтение
#Парсер веб-страниц

Вот пример того, как можно создать конвейер данных Scrapy, который проверяет, существует ли таблица в базе данных MySQL, и если нет, то создает ее:

import mysql.connector
from mysql.connector import errorcode
from scrapy.exceptions import DropItem

class MySqlPipeline:

    def __init__(self, host, user, password, database, table):
        self.host = host
        self.user = user
        self.password = password
        self.database = database
        self.table = table

    @classmethod
    def from_crawler(cls, crawler):
        return cls(
            host=crawler.settings.get('MYSQL_HOST'),
            user=crawler.settings.get('MYSQL_USER'),
            password=crawler.settings.get('MYSQL_PASSWORD'),
            database=crawler.settings.get('MYSQL_DATABASE'),
            table=crawler.settings.get('MYSQL_TABLE')
        )

    def open_spider(self, spider):
        self.conn = mysql.connector.connect(
            host=self.host,
            user=self.user,
            password=self.password,
            database=self.database
        )
        self.cursor = self.conn.cursor()

        # Проверяем, существует ли таблица
        self.cursor.execute(f"SHOW TABLES LIKE '{self.table}'")
        if not self.cursor.fetchone():
            # Создаем таблицу
            self.cursor.execute(f'''                CREATE TABLE {self.table} (                    airport_id INT NOT NULL,                    day BIGINT NOT NULL,                    sumdepartures INT,                    sumcancellations INT,                    sumdepdelay INT,                    avgdepdelay FLOAT,                    recorded_datetime DATETIME,                    PRIMARY KEY (airport_id, day)                )            ''')
            self.conn.commit()

    def close_spider(self, spider):
        self.cursor.close()
        self.conn.close()

    def process_item(self, item, spider):
        try:
            self.cursor.execute(f'''                INSERT INTO {self.table}                 (airport_id, day, sumdepartures, sumcancellations, sumdepdelay, avgdepdelay, recorded_datetime)                 VALUES                 (%s, %s, %s, %s, %s, %s, NOW())            ''', (item['airport_id'], item['day'], item['sumdepartures'], item['sumcancellations'], item['sumdepdelay'], item['avgdepdelay']))

            self.conn.commit()
            return item
        except mysql.connector.Error as e:
            raise DropItem(f'Error inserting item: {e}')

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

  • host: Имя хоста или IP-адрес сервера MySQL.
  • user: Имя пользователя для подключения к серверу MySQL.
  • password: Пароль для подключения к серверу MySQL.
  • database: Имя базы данных на сервере MySQL, в которой должна быть создана таблица.
  • table: Имя таблицы в базе данных MySQL, в которую будут сохраняться данные, полученные в результате парсинга.

У конвейера есть три основных метода:

  • open_spider: Этот метод вызывается при открытии паука. Он подключается к серверу MySQL, используя свойства host, user, password и database, и создает курсор для выполнения запросов. Затем он проверяет, существует ли уже таблица, и если нет, то создает таблицу с заданной структурой.
  • process_item: Этот метод вызывается для каждого элемента, полученного в результате парсинга. Он использует курсор для выполнения оператора INSERT INTO, который вставляет данные, полученные в результате парсинга, в указанную таблицу базы данных MySQL. Функция NOW() используется для установки значения столбца recorded_datetime в текущую дату и время.
  • close_spider: Этот метод вызывается при закрытии паука. Он закрывает курсор и соединение с сервером MySQL.

Конвейер также имеет классовый метод from_crawler, который позволяет передавать настройки в класс конвейера. Он использует настройку ITEM_PIPELINES в файле settings.py проекта Scrapy для указания конвейера, а настройки MYSQL_HOST, MYSQL_USER, MYSQL_PASSWORD, MYSQL_DATABASE и MYSQL_TABLE используются для установки соответствующих значений для вашего сервера MySQL и таблицы.

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

Наймите меня:

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

@MrAsimZahid | Прикладной ученый

Эксперт Kaggle | Бывший лидер группы Google Developer Student Club и посол AWS Educate

mrasimzahid.github.io

Об авторе:

Асим - научный сотрудник с увлечением разработкой значимых продуктов. Он обладает экспертизой в создании платформ для данных и имеет успешный опыт работы в качестве дважды эксперта Kaggle. Асим занимал руководящие должности, такие как лидер группы Google Developer Student Club (GDSC) и посол облачной платформы AWS Educate, что позволило ему отточить свои навыки в достижении бизнес-успеха.

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

Asim Zahid - Medium

Читайте записи от Asim Zahid на Medium. Я могу создавать алгоритмы с немного математики, унцией Python и кучами...

mrasimzahid.medium.com

Читать далее

Как реализовать буферную логику MySQL в веб-парсере Scrapy

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

mrasimzahid.medium.com

20 лучших инструментов для парсинга данных и веб-парсинга

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

mrasimzahid.medium.com