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.
QueryList
QueryList — это простой, элегантный и расширяемый веб-скребок (краулер/паук) на PHP, основанный на phpQuery.
С помощью плагинов можно легко реализовать:
PHP >= 7.0.
Через Composer:
composer require jaeger/querylist
QueryList::get('https://github.com')->find('img')->attrs('src');
$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();
//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¶ms2=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:
// 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.
Если эта библиотека вам полезна, скажите спасибо, купив мне пива !
QueryList лицензирован по лицензии MIT. Подробнее см. в файле LICENSE.
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Опубликовать ( 0 )