Интернет |
Сервис парсинга Wordpress сайтов (указываете донора, логин/пароль акцептора и сайт наполнен) + бесплатные лицензии
Здравствуйте!
Был у меня клиент, который практически каждые 3 дня заказывали парсинг Wordpress сайтов.
Ничего нестандартного - обычный блог, комментарии.
Я подошел к делу очень абстрактно и создал плагин, который может импортировать практически любой Wordpress сайт.
Единственное требование к донору - включенный REST API (встроен и включен по умолчанию в Wordpress начиная с версии 4.7).
Плагин может парсить данные в уже наполненный рабочий Wordpress сайт, а также из множества доноров
(никаких прямых записей в базу данных + созданию уникальный хешей на основе ID REST сущности на стороне донора + хост донора в качестве префикса)
Основные особенности плагина:
Вытягивает содержимое Wordpress сайтов через встроенный в Wordpress REST API, соответственно, экономит ресурсы (время, трафик, ОЗУ) по сравнению с парсингом HTML страниц с использованием регулярных выражений или simplehtmldom.
Среднее время копирования блога (500 публикаций, 2000 комментариев, 2000 медиафайлов) - 15 минут
Плагин не требует установки дополнительных библиотек на сервер, типа Curl, потому, что работает исключительно за счет встроенного в ядро функционала Wordpress, например, WP HTTP для сетевых запросов, WP CRON для планировщика, WP Transient Cache для кеширования.
Плагин поддерживает обновление уже импортированных данных по расписанию (WP CRON - не требует настройки на сервере), а также опрос новых комментариев, обновлений.
В отличии от стандартных решений, парсер, который работает по REST API узнает об обновлениях без повторной проверки и сравнения документов (просто передав HTTP GET параметр after=ДАТА ПОСЛЕДНЕГО ЗАПУСКА ПАРСЕРА в REST запросе).
Соответственно, если по сравнению с предыдущим запуском есть обновления, в ответ парсер получает эти обновления, если нет - ошибку 400.
Парсер импортирует ВСЕ СТАНДАРТНЫЕ СУЩНОСТИ WORDPRESS, а именно
публикации,
страницы,
комментарии,
медиафайлы (скачивает на сервер),
категории,
метки,
мета данные медиафайлов,
аватары и мета данные комментаторов
Плагин заменяет URL донора на URL акцептора в содержимом публикаций, страниц и комментариев используя simplehtmldom,
угадывает шорткоды WPBakery (большинство шорткодов Wordpress отдает в оригинале по REST API, вам нужно только загуглить и установить соответствующие плагины для их обработки на стороне акцептора).
Плагин импортирует данные используя стандартные функции Wordpress, такие как - wp_insert_post, add_post_meta, ... соответственно, плагин совместим с другими плагинами, например, Yoast SEO.
Плагин работает из под чистой инсталляции Wordpress (акцептор), плавно заполняя ваш сайт, поддерживает планирование расписаний в WP CRON, умные интервалы (для обхода автоматических блокировок), а также, приятный бонус - если ваш сайт работает из под Cloudflare, вы практически неуязвимы блокировке со стороны донора (благодаря динамическому адресу сервера).
Вы можете сами протестировать плагин бесплатно и неограниченно (плагин с поддержкой Woocommerce получает каждый спонсор)
http://167.71.82.159/wp-rest-api-import.zip
Разархивируйте содержимое архива в папку wp-content/plugins чистой инсталляции Wordpress, откройте wp-rest-api-import.php и укажите константы WP_REST_API_IMPORT_SCHEME (http либо https) и WP_REST_API_IMPORT_HOST (домен Wordpress сайта с открытым REST API).
Активируйте плагин в консоли Wordpress.
Инструменты - Импорт Wordpress REST API - Запустить задачу немедленно и наблюдайте за плавным наполнением сайта
Наполненный сайт будет работать с любой Wordpress темой, так, как использует исключительно стандартный функционал Wordpress
Соответственно, вы можете выводить содержимое донора (или доноров) на оптимизированном более современном фронтэнде (например, установив оптимизированную премиум-тему) обойдя по качеству финального сайта даже донора.
Данный плагин в виде Wordpress плагина не будет обновляться, поэтому, его будущее сейчас зависит от спроса.
На данный момент я работаю над сервисом, который упростит процесс копирования Wordpress сайта до того, что вам будет достаточно указать адрес донора, адрес акцептора, логин/пароль Wordpress пользователя на стороне акцептора с правами администратора и сервис сам будет добавлять содержимое используя тот же REST API.
Каждый параметр, который импортируется можно пропустить через неограниченное количество встроенных в сервис функций, в том числе, автоматический перевод/синонимизация на phpmorphy.
Какие возможности процессинга хотели бы увидеть вы в первую очередь?
Лицензирование скорее всего за количество REST запросов к донору (больше содержимого - дороже парсинг).
На данный момент, я ищу спонсоров, которые получают доступ к ранним версиям сервиса, а также бесплатные годовые+ лицензии.
Вступить в ряды ожидающих, получить первые неограниченные годовые+ лицензии
Яндекс кошелек 410011404826845 (в комментариях указывайте REST + электронная почта)
Для обратной связи используйте данную тему
media.galer@gmail.com
Telegram @arturkohut
Также, публикую участки исходного кода на случай заинтересованных в написании более специфичного Wordpress плагина/функционала
(контакты выше)
Инкрементальная пауза с привязкой к вызывающей функции/ID итерации с использованием последнего успешного интервала для обхода/предотвращения блокировок со стороны донора
Импорт найденных в содержимом публикации/страницы медиафайлов на сервер акцептора, а также их метаданных (title, alt) в Wordpress медиатеку акцептора (возвращает ID добавленного медиафайла)
Принудительная остановка рабочего процесса парсера после завершения текущей транзакции
Был у меня клиент, который практически каждые 3 дня заказывали парсинг Wordpress сайтов.
Ничего нестандартного - обычный блог, комментарии.
Я подошел к делу очень абстрактно и создал плагин, который может импортировать практически любой Wordpress сайт.
Единственное требование к донору - включенный REST API (встроен и включен по умолчанию в Wordpress начиная с версии 4.7).
Плагин может парсить данные в уже наполненный рабочий Wordpress сайт, а также из множества доноров
(никаких прямых записей в базу данных + созданию уникальный хешей на основе ID REST сущности на стороне донора + хост донора в качестве префикса)
Основные особенности плагина:
Вытягивает содержимое Wordpress сайтов через встроенный в Wordpress REST API, соответственно, экономит ресурсы (время, трафик, ОЗУ) по сравнению с парсингом HTML страниц с использованием регулярных выражений или simplehtmldom.
Среднее время копирования блога (500 публикаций, 2000 комментариев, 2000 медиафайлов) - 15 минут
Плагин не требует установки дополнительных библиотек на сервер, типа Curl, потому, что работает исключительно за счет встроенного в ядро функционала Wordpress, например, WP HTTP для сетевых запросов, WP CRON для планировщика, WP Transient Cache для кеширования.
Плагин поддерживает обновление уже импортированных данных по расписанию (WP CRON - не требует настройки на сервере), а также опрос новых комментариев, обновлений.
В отличии от стандартных решений, парсер, который работает по REST API узнает об обновлениях без повторной проверки и сравнения документов (просто передав HTTP GET параметр after=ДАТА ПОСЛЕДНЕГО ЗАПУСКА ПАРСЕРА в REST запросе).
Соответственно, если по сравнению с предыдущим запуском есть обновления, в ответ парсер получает эти обновления, если нет - ошибку 400.
Парсер импортирует ВСЕ СТАНДАРТНЫЕ СУЩНОСТИ WORDPRESS, а именно
публикации,
страницы,
комментарии,
медиафайлы (скачивает на сервер),
категории,
метки,
мета данные медиафайлов,
аватары и мета данные комментаторов
Плагин заменяет URL донора на URL акцептора в содержимом публикаций, страниц и комментариев используя simplehtmldom,
угадывает шорткоды WPBakery (большинство шорткодов Wordpress отдает в оригинале по REST API, вам нужно только загуглить и установить соответствующие плагины для их обработки на стороне акцептора).
Плагин импортирует данные используя стандартные функции Wordpress, такие как - wp_insert_post, add_post_meta, ... соответственно, плагин совместим с другими плагинами, например, Yoast SEO.
Плагин работает из под чистой инсталляции Wordpress (акцептор), плавно заполняя ваш сайт, поддерживает планирование расписаний в WP CRON, умные интервалы (для обхода автоматических блокировок), а также, приятный бонус - если ваш сайт работает из под Cloudflare, вы практически неуязвимы блокировке со стороны донора (благодаря динамическому адресу сервера).
Вы можете сами протестировать плагин бесплатно и неограниченно (плагин с поддержкой Woocommerce получает каждый спонсор)
http://167.71.82.159/wp-rest-api-import.zip
Разархивируйте содержимое архива в папку wp-content/plugins чистой инсталляции Wordpress, откройте wp-rest-api-import.php и укажите константы WP_REST_API_IMPORT_SCHEME (http либо https) и WP_REST_API_IMPORT_HOST (домен Wordpress сайта с открытым REST API).
Активируйте плагин в консоли Wordpress.
Инструменты - Импорт Wordpress REST API - Запустить задачу немедленно и наблюдайте за плавным наполнением сайта
Наполненный сайт будет работать с любой Wordpress темой, так, как использует исключительно стандартный функционал Wordpress
Соответственно, вы можете выводить содержимое донора (или доноров) на оптимизированном более современном фронтэнде (например, установив оптимизированную премиум-тему) обойдя по качеству финального сайта даже донора.
Данный плагин в виде Wordpress плагина не будет обновляться, поэтому, его будущее сейчас зависит от спроса.
На данный момент я работаю над сервисом, который упростит процесс копирования Wordpress сайта до того, что вам будет достаточно указать адрес донора, адрес акцептора, логин/пароль Wordpress пользователя на стороне акцептора с правами администратора и сервис сам будет добавлять содержимое используя тот же REST API.
Каждый параметр, который импортируется можно пропустить через неограниченное количество встроенных в сервис функций, в том числе, автоматический перевод/синонимизация на phpmorphy.
Какие возможности процессинга хотели бы увидеть вы в первую очередь?
Лицензирование скорее всего за количество REST запросов к донору (больше содержимого - дороже парсинг).
На данный момент, я ищу спонсоров, которые получают доступ к ранним версиям сервиса, а также бесплатные годовые+ лицензии.
Вступить в ряды ожидающих, получить первые неограниченные годовые+ лицензии
Яндекс кошелек 410011404826845 (в комментариях указывайте REST + электронная почта)
Для обратной связи используйте данную тему
media.galer@gmail.com
Telegram @arturkohut
Также, публикую участки исходного кода на случай заинтересованных в написании более специфичного Wordpress плагина/функционала
(контакты выше)
Инкрементальная пауза с привязкой к вызывающей функции/ID итерации с использованием последнего успешного интервала для обхода/предотвращения блокировок со стороны донора
Код:
function wp_rest_api_import_incremental_sleep($function, $id = 0) {
$usleep_delays = array(
200,
500,
1000,
2000,
5000
);
if (!isset($GLOBALS[__FUNCTION__]))
$GLOBALS[__FUNCTION__] = array();
if (!isset($GLOBALS[__FUNCTION__]['last_used_usleep_delay']))
$GLOBALS[__FUNCTION__]['last_used_usleep_delay'] = 0;
if (!isset($GLOBALS[__FUNCTION__][$function]))
$GLOBALS[__FUNCTION__][$function] = array();
if (!isset($GLOBALS[__FUNCTION__][$function][$id])) {
if ($GLOBALS[__FUNCTION__]['last_used_usleep_delay'] > 0)
$GLOBALS[__FUNCTION__]['last_used_usleep_delay']--;
$GLOBALS[__FUNCTION__][$function][$id] = $GLOBALS[__FUNCTION__]['last_used_usleep_delay'];
}
if ($GLOBALS[__FUNCTION__][$function][$id] >= sizeof($usleep_delays)) {
return false;
}
usleep(1000 * $usleep_delays[$GLOBALS[__FUNCTION__][$function][$id]]);
$GLOBALS[__FUNCTION__][$function][$id]++;
$GLOBALS[__FUNCTION__]['last_used_usleep_delay']++;
return true;
}
Код:
function wp_rest_api_import_prepare_media($id, $src = '', $alt = '', $skip_rest = false) {
die_if_wp_rest_api_import_task_is_expired();
$wp_query = new WP_Query(array(
'post_type' => 'attachment',
'post_status' => 'inherit',
'meta_key' => 'wp_rest_api_import_prepare_media_id',
'meta_value' => $id,
'meta_compare' => '='
));
if ($wp_query->have_posts()) {
$wp_query->the_post();
$attachid = get_the_ID();
wp_reset_postdata();
}
$wp_query->wp_reset_query();
if (isset($attachid)) return $attachid;
if (!$skip_rest) {
$url = WP_REST_API_IMPORT_BASE . '/media/'.$id;
$body = wp_rest_api_import_wp_remote_retrieve_body($url, __FUNCTION__, $id);
if (is_wp_error($body))
return call_user_func(__FUNCTION__, $id, $src, $alt, true);
if ((!$media_json = json_decode($body)))
return call_user_func(__FUNCTION__, $id, $src, $alt, true);
$src = $media_json->source_url;
}
require_once(__DIR__.DIRECTORY_SEPARATOR.'wp_insert_attachment_from_url.php');
if (!$attachid = crb_insert_attachment_from_url($src))
return false;
update_post_meta($attachid, 'wp_rest_api_import_prepare_media_id', $id);
if (!empty($alt))
update_post_meta($attachid, '_wp_attachment_image_alt', $alt);
return $attachid;
}
Код:
function die_if_wp_rest_api_import_task_is_expired() {
if ($GLOBALS['job_timestamp'] != ($get_transient = wp_cache_get('wp_rest_api_import_job_timestamp', 'transient', true )))
wp_rest_api_import_die(__FUNCTION__, __LINE__, array('job_timestamp' => $GLOBALS['job_timestamp'], 'get_transient' => $get_transient));
set_transient(__FUNCTION__, time());
}