- В 15 годах писал похожий парсер, используя node, fetch и axios, но сейчас часть сайтов возвращает html без таблиц с ценами, почему?
- Для чего нужны selenium, playwright и puppeteer, если я могу через fetch и axios все получить?
- Если все же использовать selenium, playwright и puppeteer, что из них лучше на данный момент?
Можно ли их с nodejs использовать?
- Часто вижу о упоминание CDP в контексте парсинга, это зачем и для чего нужно?
- Что использовать для отправки сообщений в телегу?
const https = require('https');
const fs = require('fs');
const path = require('path');
const { URL } = require('url');
async function downloadFile(url, outputPath) {
// Парсим URL для получения компонентов
const parsedUrl = new URL(url);
// Если путь для сохранения не указан, используем имя файла из URL
if (!outputPath) {
outputPath = path.basename(parsedUrl.pathname);
}
return new Promise((resolve, reject) => {
const file = fs.createWriteStream(outputPath);
https.get(url, (response) => {
// Проверяем статус код ответа
if (response.statusCode !== 200) {
reject(new Error(`Ошибка загрузки: ${response.statusCode}`));
return;
}
// Получаем общий размер файла для прогресса
const totalSize = parseInt(response.headers['content-length'], 10);
let downloadedSize = 0;
response.pipe(file);
// Опционально: отслеживание прогресса загрузки
response.on('data', (chunk) => {
downloadedSize += chunk.length;
if (totalSize) {
const percent = (downloadedSize / totalSize * 100).toFixed(2);
console.log(`Загружено: ${percent}%`);
}
});
file.on('finish', () => {
file.close();
resolve({ path: outputPath, size: downloadedSize });
});
}).on('error', (err) => {
fs.unlink(outputPath, () => reject(err));
});
file.on('error', (err) => {
fs.unlink(outputPath, () => reject(err));
});
});
}
// Пример использования
downloadFile('https://example.com/file.zip', './downloaded-file.zip')
.then((result) => console.log(`Файл сохранен: ${result.path} (${result.size} байт)`))
.catch((err) => console.error('Ошибка загрузки:', err));
Xen — на порядок сложнее и функциональнее, имеет помимо режима паравиртуализации (как openvz) режим полной виртуализации (в т.ч. поддержка соответствующих фич процессоров), есть механизмы переброса железа внутрь виртуалки (например, поддержка не самых слабых intel видеокарт), снапшоты, миграция,… много много вкусных фич.
VMWare — как и xen, сложен, наворочен, приправлен соответствующей инфраструктурой и хорошими забористыми ценами :) режима полноценной паравиртуализации не имеет
kvm/qemu — полная эмуляция процессора (а так же виртуализация через поддержку процессорами), есть вкусности от 'старших братьев' вида миграция запущенной виртуалки по сети, переброса железа (сильно хуже поддержка чем xen/vmware) и т.п. можно считать бакэндом, так как GUI в идеалогии не имеет, оно пилится желающим
VirtualBox — эмуляция процессора, в т.ч. использование поддержки виртуализации процессоров, идеален как отдельное десктопное приложение, миграции по сети нет, есть снапшоты, некоторые вкусности скрыты от GUI в коммандной строке
OpenVZ — это работа всех машин на одном ядре (патчи к нему так и зовутся openvz), нет виртуализации, максимальная скорость (так как фактически это расширенный chroot с изоляцией). Для запуска модуля ядра на поклон нужно идти к хост системе и ее администратору (например tun/tap адаптер у firstvds дают по запросу)
Снапшотов нет (но их реализуют через lvm), миграция есть, есть сброс состояния контейнера на диск и возобновление работы…
Lxc — еще проще чем openVZ, нет даже грамотной изоляции (если подсуетиться, можно, имея рут в контейнере, выйти в хост систему с рутовым доступом), прямой аналог jail во freebsd, имеет смысл для хитрых сетевых конфигураций, тестов и т.п.
Chroot — это даже не виртуалка, это просто простейшая изоляция в пределах файловой системы, подмена путей в вызовах функций работы с файлами.
p.s. lxc называют еще 'chroot на стероидах'
$_GET
и уж конечно никаких $cats=$site->qa("select * from categories where catid=0 order by name asc");
Тогда они будут простыми и ошибку будет сложнее совершить и гораздо легче найти. А если она случится в контроллере, то там уже трейс будет нормальный.import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
def send_email_mail_ru():
smtp_server = "smtp.mail.ru"
smtp_port = 587 # или 465 для SSL.
username = "*****@mail.ru" # Анонимный ящик.
password = "****************" # Пароль от приложения.
# Создаем сообщение:
msg = MIMEMultipart()
msg['From'] = username
msg['To'] = "************@mail.ru"
msg['Subject'] = "Тестовое письмо с Mail.ru"
# Текст письма:
body = """тест"""
msg.attach(MIMEText(body, 'plain', 'utf-8'))
try:
# Подключаемся к серверу:
server = smtplib.SMTP(smtp_server, smtp_port)
server.starttls()
server.login(username, password)
# Отправляем письмо:
server.sendmail(username, "*********@yahoo.com", msg.as_string())
print("Письмо успешно отправлено через Mail.ru!")
except Exception as e:
print(f"Ошибка при отправке: {e}")
finally:
server.quit()
send_email_mail_ru()
(?:[^/]|(?<!/)/(?!/))*МОСКВА(?:[^/]|(?<!/)/(?!/))*
[^\/]*
The jqXHR.success(), jqXHR.error(), and jqXHR.complete() callback methods are removed as of jQuery 3.0. You can use jqXHR.done(), jqXHR.fail(), and jqXHR.always() instead.
Основной контент загружается динамически через JavaScript. Появились сомнения, что поисковые системы (Googlebot и робот Яндекса) корректно видят и индексируют такой сайт.
Какими актуальными методами можно проверить это технически?
"ключевая фраза"
, затем копируем строку текста из динамики и вставляет ее в поисковик, если сайт найдется, то именно этот блок текста индексируется.Нужно ли делать SSR или пререндеринг, или современные поисковики уже справляются с рендерингом?