Как написать конвейер данных Scrapy для MySQL
Table Of Content
- **Наймите меня:**
- @MrAsimZahid | Прикладной ученый
- Эксперт Kaggle | Бывший лидер группы Google Developer Student Club и посол AWS Educate
- **Об авторе:**
- Asim Zahid - Medium
- Читайте записи от Asim Zahid на Medium. Я могу создавать алгоритмы с немного математики, унцией Python и кучами...
- Читать далее
- Как реализовать буферную логику MySQL в веб-парсере Scrapy
- В веб-парсерах буферная логика относится к набору правил или алгоритмов, используемых для управления и манипулирования URL-адресами, которые...
- 20 лучших инструментов для парсинга данных и веб-парсинга
- Данные - это новая нефть. В наше время каждому нужны данные, независимо от того, ведете ли вы бизнес электронной коммерции, выполняете...
Вот пример того, как можно создать конвейер данных 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, что позволило ему отточить свои навыки в достижении бизнес-успеха.
Помимо своих технических навыков, Асим является крепким коммуникатором и командным игроком. Он любит общаться с единомышленниками и всегда открыт для возможностей сетевого взаимодействия. Если вам нравится его работа и вы хотели бы связаться, не стесняйтесь обращаться.