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

OSCHINA-MIRROR/jae-QueryList

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать

A short and simple permissive license with conditions only requiring preservation of copyright and license notices. Licensed works, modifications, and larger works may be distributed under different terms and without source code.

Permissions
  • Commercial use
  • Modification
  • Distribution
  • Private use
Limitations
  • Liability
  • Warranty
Conditions
  • License and copyright notice
README.md 14 КБ
Копировать Редактировать Web IDE Исходные данные Просмотреть построчно История
gitlife-traslator Отправлено 26.11.2024 22:06 b258901

QueryList

QueryList — это простой, элегантный и расширяемый веб-скребок (краулер/паук) на PHP, основанный на phpQuery.

Документация API.

Китайская документация.

Особенности

  • Имеет тот же селектор CSS3 DOM, что и jQuery.
  • Имеет такой же API манипулирования DOM, как и jQuery.
  • Имеет универсальную программу для обхода списков.
  • Обладает мощным набором HTTP-запросов, с помощью которого легко выполнять такие задачи, как имитация перехода по ссылке, поддельный браузер, HTTP-прокси и другие сложные сетевые запросы.
  • Предлагает решение для грязного кода.
  • Предоставляет мощные возможности фильтрации контента, вы можете использовать селекторы jQuey для фильтрации содержимого.
  • Отличается высокой степенью модульности, масштабируемости и надёжности.
  • Имеет выразительный API.
  • Располагает множеством плагинов.

С помощью плагинов можно легко реализовать:

  • Многопоточный обход.
  • Обход динамически отображаемых страниц JavaScript (PhantomJS/headless WebKit).
  • Скачивание изображений на локальный компьютер.
  • Имитацию поведения браузера, такого как отправка форм.
  • Веб-краулер.
  • ...

Требования

PHP >= 7.0.

Установка

Через Composer:

composer require jaeger/querylist

Использование

Обход DOM и манипуляции

  • Просмотрите все ссылки на изображения на GitHub:
QueryList::get('https://github.com')->find('img')->attrs('src');
  • Просканируйте результаты поиска Google:
$ql = QueryList::get('https://www.google.co.jp/search?q=QueryList');

$ql->find('title')->text(); //Заголовок страницы
$ql->find('meta[name=keywords]')->content; //Ключевые слова страницы

$ql->find('h3>a')->texts(); //Получить список заголовков результатов поиска
$ql->find('h3>a')->attrs('href'); //Получить список ссылок результатов поиска

$ql->find('img')->src; //Получает адрес ссылки первого изображения
$ql->find('img:eq(1)')->src; //Получает адрес ссылки второго изображения
$ql->find('img')->eq(2)->src; //Получает адрес ссылки третьего изображения
// Перебираем все изображения
$ql->find('img')->map(function($img){
    echo $img->alt;  //Выводим атрибут alt изображения
});
  • Другие варианты использования:
$ql->find('#head')->append('<div>Append content</div>')->find('div')->htmls();
$ql->find('.two')->children('img')->attrs('alt'); // Получить элемент класса «two» под всеми дочерними узлами img
// Перебрать элементы класса «two» под всеми дочерними элементами
$data = $ql->find('.two')->children()->map(function ($item){
    // Использовать «is», чтобы определить тип узла
    if($item->is('a')){
        return $item->text();
    }elseif($item->is('img'))
    {
        return $item->alt;
    }
});

$ql->find('a')->attr('href', 'newVal')->removeClass('className')->html('newHtml')->...
$ql->find('div > p')->add('div > ul')->filter(':has(a)')->find('p:first')->nextAll()->andSelf()->...
$ql->find('div.old')->replaceWith( $ql->find('div.new')->clone())->appendTo('.trash')->prepend('Deleted')->...

Обход списка

Просмотрите заголовок и ссылку в списке результатов поиска Google:

$data = QueryList::get('https://www.google.co.jp/search?q=QueryList')
    // Устанавливаем правила обхода
    ->rules([ 
        'title'=>array('h3','text'),
        'link'=>array('h3>a','href')
    ])
    ->query()->getData();

print_r($data->all());

Результаты:

Array
(
    [0] => Array
        (
            [title] => Angular - QueryList
            [link] => https://angular.io/api/core/QueryList
        )
    [1] => Array
        (
            [title] => QueryList | @angular/core - Angularリファレンス - Web Creative Park
            [link] => http://www.webcreativepark.net/angular/querylist/
        )
    [2] => Array
        (
            [title] => QueryListにQueryを追加したり、追加されたことを感知する | TIPS ...
            [link] => http://www.webcreativepark.net/angular/querylist_query_add_subscribe/
        )
        //...
)

Преобразование кодировки

// Out charset :UTF-8
// In charset :GB2312
QueryList::get('https://top.etao.com')->encoding('UTF-8','GB2312')->find('a')->texts();

// Out charset:UTF-8
// In charset:Automatic Identification
QueryList::get('https://top.etao.com')->encoding('UTF-8')->find('a')->texts();

HTTP-клиент (GuzzleHttp)

  • Переносит файлы cookie для входа в GitHub. Запрос 1:
//Crawl GitHub content
$ql = QueryList::get('https://github.com','param1=testvalue & params2=somevalue',[
  'headers' => [
      // Fill in the cookie from the browser
      'Cookie' => 'SINAGLOBAL=546064; wb_cmtLike_2112031=1; wvr=6;....'
  ]
]);
//echo $ql->getHtml();
$userName = $ql->find('.header-nav-current-user>.css-truncate-target')->text();
echo $userName;

Перевод:

Ползание по содержимому GitHub

$ql = QueryList::get ('https://github.com' 'param1=testvalue&params2=somevalue', [headers => [Cookie => 'SINAGLOBAL=546064;wb_cmtLike_2112031=1;wvr=6;...']]);

// echo $ql->getHtml();

$userName = $ql->find (.header-nav-current-user> .css-truncate-target )->text;

echo $userName;

Запрос 2:

$urlParams = ['param1' => 'testvalue','params2' => 'somevalue'];
$opts = [
    // Set the http proxy
    'proxy' => 'http://222.141.11.17:8118',
    //Set the timeout time in seconds
    'timeout' => 30,
     // Fake HTTP headers
    'headers' => [
        'Referer' => 'https://querylist.cc/',
        'User-Agent' => 'testing/1.0',
        'Accept'     => 'application/json',
        'X-Foo'      => ['Bar', 'Baz'],
        'Cookie'    => 'abc=111;xxx=222'
    ]
];
$ql->get('http://httpbin.org/get',$urlParams,$opts);
// echo $ql->getHtml();

Перевод:

$urlParams = ['param1' => 'testvalue','params2' => 'somevalue'];

$opts = [proxy => 'http://222.141.11.17:8118',timeout => 30,

'headers' => [Referer => 'https://querylist.cc/',User-Agent => 'testing/1.0',Accept => 'application/json',X-Foo => [Bar, Baz],

'Cookie' => 'abc=111;xxx=222']];

$ql->get ('http://httpbin.org/get', $urlParams, $opts);

Запрос 3:

// Post login
$ql = QueryList::post('http://xxxx.com/login',[
    'username' => 'admin',
    'password' => '123456'
])->get('http://xxx.com/admin');
// Crawl pages that need to be logged in to access
$ql->get('http://xxx.com/admin/page');
//echo $ql::getHtml();

Перевод:

Постлогин

$ql = QueryList::post ('http://xxxx.com/login', [username => 'admin',password => '123456']);

->get ('http://xxx.com/admin');

Сканирование страниц, для доступа к которым требуется авторизация

$ql->get ('http://xxx.com/admin/page');

Запрос 4:

Вход на GitHub

// Get the QueryList instance
$ql = QueryList::getInstance();
// Get the login form
$form = $ql->get('https://github.com/login')->find('form');

// Fill in the GitHub username and password
$form->find('input[name=login]')->val('your github username or email');
$form->find('input[name=password]')->val('your github password');

// Serialize the form data
$fromData = $form->serializeArray();
$postData = [];
foreach ($fromData as $item) {
    $postData[$item['name']] = $item['value'];
}

// Submit the login form
$actionUrl = 'https://github.com'.$form->attr('action');
$ql->post($actionUrl,$postData);
// To determine whether the login is successful
// echo $ql->getHtml();
$userName = $ql->find('.header-nav-current-user>.css-truncate-target')->text();
if($userName)
{
    echo 'Login successful ! Welcome:'.$userName;
}else{
    echo 'Login failed !';
}

Перевод:

Вход в GitHub

Получить экземпляр QueryList

$ql = QueryList::getInstance();

Получить форму входа

$form = $ql->get ('https://github.com/login')->find ('form');

Заполнить имя пользователя и пароль GitHub

$form->find ('input[name=login]')->val ('ваш адрес электронной почты или имя пользователя GitHub');

$form->find ('input[name=пароль]')->val ('ваш пароль GitHub');

Сериализовать данные формы

$fromData = $form->serializeArray();

$postData = [];

foreach ($fromData как $item) {

$postData[$item['name']] = $item['value'];

}

Отправить форму входа

$actionUrl = 'https://github.com'.$form->attr ('action');

$ql->post ($actionUrl, $postData);

Определить успешность входа

// echo $ql->getHtml();

$userName = $ql->find (.header-nav-current-user>.css-truncate-target)->text ();

если ($userName)

{

эхо 'Вход выполнен успешно! Добро пожаловать:'.$userName;

} еще {

эхо 'Ошибка входа!';

}

Запрос 5:

$ql = QueryList::use(PhantomJs::class,'/usr/local/bin/phantomjs');

// Crawl「500px」all picture links
$data = $ql->browser('https://500px.com/editors')->find('img')->attrs('src');
print_r($data->all());

Перевод:

Использовать PhantomJS

$ql = QueryList::use (PhantomJs::class,'/usr/local/bin/phantomjs');

Сканировать все ссылки на изображения на «500 пикселей»

$data = $ql->browser ('https://500px.com/editors')->find ('img')->attrs ('src');

print_r ($data->all());

Запрос 6:

$ql = QueryList::use(CurlMulti::class);
$ql->curlMulti([
    'https://github.com/trending/php',
    'https://github.com/trending/go',
    //.....more urls
])
 // Called if task is success
 ->success(function (QueryList $ql,CurlMulti $curl,$r){
    echo "Current url:{$r['info']['url']} \r\n";
    $data = $ql->find('h3 a')->texts();
    print_r($data->all());
})
 // Task fail callback
->error(function ($errorInfo,CurlMulti $curl){
    echo "Current url:{$errorInfo['info']['url']} \r\n";
    print_r($errorInfo['error']);
})
->start([
    // Maximum number of threads
    'maxThread' => 10,
    // Number of error retries
    'maxTry' => 3,
]);

Перевод:

Использовать плагин CurlMulti

$ql = QueryList::use (CurlMulti::class);

$ql->curlMulti ([

'https://github.com/trending/php',https://github.com/trending/go',//.....больше URL-адресов]);

Вызов при успешном выполнении задачи

->success (функция (QueryList $ql, CurlMulti $curl, $r) {

эхо `"Текущий URL:"`{$`r`[`'info'`][`'url'`]} `\r\n`;`

`$data` = `$ql->find` (`'h3 a'`)->`texts`();

`print_r`($`data`->`all`);

})

Обратный вызов при сбое задачи

->error (функция ($errorInfo, CurlMulti $curl) {

эхо `"Текущий URL:"` {$`errorInfo`[`'info'`][`'url'`]} `\r\n`;`

`print_r` ($`errorInfo` [`'error'`]);

})

->start ([

// Максимальное количество потоков

`'maxThread'` => `10`,

// Количество попыток повтора при ошибке

`'maxTry'` => `3`,

]); ФантомJS используется для обхода динамически отображаемой страницы с помощью JavaScript.

Подробнее о плагинах QueryList и продуктах на основе QueryList: Сообщество QueryList.

Вклад

Приглашаем внести свой вклад в код QueryList. О внесении вклада в плагины можно узнать: Руководство по внесению вклада в QueryList.

Автор

Джагер JaegerCode@gmail.com.

Если эта библиотека вам полезна, скажите спасибо, купив мне пива :beer:!

Лицензия

QueryList лицензирован по лицензии MIT. Подробнее см. в файле LICENSE.

Опубликовать ( 0 )

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

1
https://api.gitlife.ru/oschina-mirror/jae-QueryList.git
git@api.gitlife.ru:oschina-mirror/jae-QueryList.git
oschina-mirror
jae-QueryList
jae-QueryList
master