Сделать парсер с записью в СУБД? Это не так уж и сложно.
Сегодня я покажу как это легко и просто реализуется с помощью нашего сервиса компиляции.
Этап первый: подготовка.
Конфиг парсера для тестов. Вы можете использовать его как пример для обучения, он полностью работоспособен и не нарушает никаких ToS.
do:
- walk:
to: 'https://www.diggernaut.com/sandbox/'
do:
- find:
path: 'div:nth-child(6) .result-content'
do:
- find:
path: h3
do:
- parse
- variable_clear: name
- variable_set: name
- find:
path: p
do:
- parse
- variable_clear: description
- variable_set: description
- find:
path: 'tbody > tr'
do:
- parse
- object_new: item
- variable_get: name
- object_field_set:
object: item
field: name
- variable_get: description
- object_field_set:
object: item
field: descr
- object_new: date
- find:
path: '.col5 > .nowrap:nth-child(1)'
do:
- parse
- object_field_set:
object: date
field: date
- find:
path: '.col5 > .nowrap:nth-child(2)'
do:
- parse
- object_field_set:
object: date
field: date
joinby: " - "
- find:
path: .col6
do:
- parse
- normalize:
routine: replace_substring
args:
\s*(\d+)A: 's'
- object_field_set:
object: date
field: time
- object_save:
name: date
to: item
- object_save:
name: item
На выходе имеем вот такую структуру.
item: [
{
"name":"",
"descr":"",
"date": [
{
"date":"",
"time":""
}
...
...
]
},
...
...
]
Подготовим наши СУБД. Запись поддерживается для MS SQL, MYSQL, PostgreSQL.
Создадим базу данных и таблицы для наших данных.
MYSQL
CREATE DATABASE `digger`;
CREATE TABLE `items` (
`id` INT(11) NOT NULL AUTO_INCREMENT,
`name` VARCHAR(50) NULL DEFAULT NULL,
`descr` TEXT NULL,
PRIMARY KEY (`id`)
)
COLLATE='utf8_general_ci'
ENGINE=InnoDB;
CREATE TABLE `dates` (
`id` INT(11) NOT NULL AUTO_INCREMENT,
`item_id` INT(11) NOT NULL,
`date` VARCHAR(50) NULL DEFAULT NULL,
`time` VARCHAR(50) NULL DEFAULT NULL,
INDEX `Index 1` (`id`),
INDEX `FK__items` (`item_id`),
CONSTRAINT `FK__items` FOREIGN KEY (`item_id`) REFERENCES `items` (`id`) ON UPDATE NO ACTION ON DELETE NO ACTION
)
COLLATE='utf8_general_ci'
ENGINE=InnoDB;
MS SQL
CREATE DATABASE `digger`;
CREATE TABLE `items` (
id INT NOT NULL IDENTITY(1,1) CONSTRAINT pk_items_pid PRIMARY KEY,
`name` VARCHAR(50),
`descr` TEXT
);
CREATE TABLE `dates` (
id INT NOT NULL IDENTITY(1,1) CONSTRAINT pk_dates_pid PRIMARY KEY,
item_id int CONSTRAINT fk_item_id FOREIGN KEY(item_id) REFERENCES items(id),
date TEXT,
time TEXT
);
PostgreSQL
CREATE DATABASE digger;
CREATE TABLE items (
id SERIAL PRIMARY KEY,
name varchar(50),
descr text,
);
CREATE TABLE dates (
id SERIAL PRIMARY KEY,
date varchar(50),
time varchar(50),
item_id integer REFERENCES items (id),
);
Теперь скомпилириуем наш парсер.
Как вы могли заметить, все достаточно просто и не требует дополнительных телодвижений.