Скрипт-паук PHP
Среда | Описание |
---|---|
PHP | > 5.6, предпочтительно PHP 7 или выше |
Redis | очередь данных |
Онлайн-генерация кода: SpiderX Generator
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();
php index.php run
Поле | Тип | Описание |
---|---|---|
name | string | Название задачи, на основе значения name создаётся имя очереди. Если требуется распределённая система, можно выбрать одинаковое значение name |
tasknum | int | Количество задач, по умолчанию 1 |
start | array | Входные URL |
rule | array | Правила сбора, см. подробное описание ниже |
Поле 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.
Реализуется путём добавления URL в очередь вручную, метод запроса устанавливается как post, параметры запроса задаются в виде массива или строки:
$spider->addUrl([
'type' => 'detail', // Сохранять соответствие с именем элемента name и type
'name' => 'detail',
'url' =>
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Комментарии ( 0 )