1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/zhenyangze-SpiderX

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
В этом репозитории не указан файл с открытой лицензией (LICENSE). При использовании обратитесь к конкретному описанию проекта и его зависимостям в коде.
Клонировать/Скачать
Внести вклад в разработку кода
Синхронизировать код
Отмена
Подсказка: Поскольку Git не поддерживает пустые директории, создание директории приведёт к созданию пустого файла .keep.
Loading...
README.md

Скрипт-паук PHP


  • Фреймворк выполняет только распространение, не обрабатывает данные, необходимо настроить самостоятельно в обратном вызове.
  • Не ограничивает способ сбора данных, можно использовать регулярные выражения, Xpath, извлечение подстроки.
  • Сбор данных неограниченного уровня вложенности, можно реализовать сбор данных по схеме список → подробности, список → список → подробности и т. д.
  • Очередь с удалением дубликатов, поддерживает инкрементный сбор и полный сбор.
  • Поддерживает режим отладки, режим реального времени для составления отчётов и сторожевой режим.

Установка зависимостей

Среда Описание
PHP > 5.6, предпочтительно PHP 7 или выше
Redis очередь данных

Быстрый старт

Онлайн-генерация кода: SpiderX Generator

1. Скопируйте код в файл index.php

if (!is_file('./vendor/autoload.php')) {
    exec("composer require yangze/spiderx");
}

include_once __DIR__ . '/vendor/autoload.php';

$config = [
    'name' => 'sina',
    'tasknum' => 1,
    'start' => [
        'http://roll.news.sina.com.cn/news/gnxw/gdxw1/index.shtml',
    ],
    'rule' => [
        [
            'name' => 'list',
            'type' => 'list',
            'url' => '#gdxw1/index_\d+.shtml#',
            'data' => [
                'title' => function ($pageInfo, $html, $data) {
                    preg_match_all('/<li><a href=".*?" target="_blank">(.*?)<\/a><span>/i', $html, $matches);
                    return $matches[1];
                }
            ]
        ],
    ]
];

$spider = new SpiderX\SpiderX($config);
$spider->on_fetch_list = function ($pageInfo, $html, $data) {
    file_put_contents(__DIR__ . '/data.txt', implode("\n", $data['title']) . "\n", FILE_APPEND | LOCK_EX);
};
$spider->start();

2. Выполнение команды (требуется загрузка зависимостей через Composer, время зависит от скорости интернета)

php index.php run

Конфигурация

Поле Тип Описание
name string Название задачи, на основе значения name создаётся имя очереди. Если требуется распределённая система, можно выбрать одинаковое значение name
tasknum int Количество задач, по умолчанию 1
start array Входные URL
rule array Правила сбора, см. подробное описание ниже

Описание поля rule

Поле rule имеет формат массива, каждый элемент второго уровня представляет собой отдельную единицу.

Поле Тип Описание
name string Имя задачи, на основе имени создаётся имя очереди. Для распределённой системы можно выбрать одинаковое имя
type string Тип страницы, варианты list или detail
url string Входной URL, может быть представлен в виде регулярного выражения, например #article_\d+#, для извлечения данных со страниц, или в виде значения другого элемента единицы, например news_list.url, для объединения с данными текущей единицы
data array Данные для сбора, задаются в формате обратного вызова, например key => function ($pageInfo, $html, $data) { return '';}

Обратные вызовы

Общие обратные вызовы

Начало задачи

on_start = function() use($spiderx) {
    // Можно добавить действия пользователя, такие как вход в систему, добавление данных в очередь
    //$spiderx->addUrl([]);
}

Завершение задачи

on_finish = function() {
    // Задача выполнена, можно отправить уведомление, импортировать данные в базу, удалить файлы журнала и т.д.
}

Добавление URL в очередь

on_add_url = function($pageInfo) {
    // Если вызвать этот обратный вызов, нужно вернуть true, чтобы добавить данные в очередь
}

Повторная попытка при неудачном запросе, по умолчанию три попытки

on_retry_page = function($pageInfo) {
    // Возвращает true для повторной попытки
}

Если не удаётся получить данные HTML, можно переопределить метод setGetHtml

setGetHtml = function($pageInfo) {
    return file_get_contents($pageInfo['url']);
}

Аналогично существует метод setGetLinks для извлечения ссылок со страницы или других способов хранения URL.

setGetLinks = function($html) {

}

Обратные вызовы загрузки страницы

Зависит от пользовательских настроек каждого элемента rule. Предположим, что мы установили значение name как news. Соответствующие методы обратного вызова:

Обратный вызов перед загрузкой URL

on_loadding_{news, заменить на другое значение name} = function($pageInfo) {
    // pageInfo содержит информацию о текущей странице
    // возвращает true для загрузки этой страницы
}

Обратный вызов после загрузки HTML

on_loaded_{news, заменить на другое значение name} = function($pageInfo, $html) {
    // html содержит текущие данные HTML
}

Обратные вызовы после анализа данных страницы, обычно используются для сохранения данных

on_fetch_{news, заменить на другое значение name} = function($pageInfo, $html, $data) {
    // data содержит проанализированные данные
}

Расширенные возможности

Имитация входа в систему

Необходимо добавить логику автоматического входа в обратный вызов on_start

Некоторые страницы могут потребовать сначала получения параметров с помощью метода get, а затем отправки POST-запроса

$spider->on_start = function () use ($spider) {
    $pageInfo = [
        'type' => 'index',
        'name' => 'login',
        'method' => 'post', // Отправить POST-запрос
        'url' => 'http://127.0.0.1:3200/index.php/action/login?_=b0fd8734e0687a6cfe352e3f0fcbc5f6',
        'query' => [
            'name' => 'admin',
            'password' => 'admin',
            'referer' => 'http://127.0.0.1:3200/admin/',
        ], // Параметры запроса
        'cookie' => true, // Использовать общие cookie
        'extra' => [
            'headers' => [
                'User-Agent' => 'testing/1.0',
                'Accept'     => 'application/json',
            ]
        ]// Дополнительные параметры, см.
    ];
    $spider->addUrl($pageInfo);
    return true;
};

Бесконечный сбор данных

Реализуется путём установки значения URL в поле data в виде имени предыдущего элемента и поля DataField, например, news.DataField.

См. демонстрационный каталог sina.

Отправка формы POST, сбор данных постранично

Реализуется путём добавления URL в очередь вручную, метод запроса устанавливается как post, параметры запроса задаются в виде массива или строки:

$spider->addUrl([
    'type' => 'detail', // Сохранять соответствие с именем элемента name и type
    'name' => 'detail',
    'url' =>

Комментарии ( 0 )

Вы можете оставить комментарий после Вход в систему

Введение

Описание недоступно Развернуть Свернуть
Отмена

Обновления

Пока нет обновлений

Участники

все

Недавние действия

Загрузить больше
Больше нет результатов для загрузки
1
https://api.gitlife.ru/oschina-mirror/zhenyangze-SpiderX.git
git@api.gitlife.ru:oschina-mirror/zhenyangze-SpiderX.git
oschina-mirror
zhenyangze-SpiderX
zhenyangze-SpiderX
master