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 )