クローラーと言えば、多くの人は Python クローラーを思い浮かべるでしょう。Python クローラーには大きな利点があるからです。しかし、実は PHP を使用してデータを非同期にクロールすることもできるので、PHP を使用してデータを非同期にクロールする方法を紹介します。
Web クローラーとは何ですか?
Web クローラーは、Web ページを自動的に抽出するプログラムです。検索エンジンのために World Wide Web から Web ページをダウンロードし、検索エンジンの重要なコンポーネントです。従来のクローラーは、1 つまたは複数の最初の Web ページの URL から開始し、最初の Web ページ上の URL を取得します。Web ページをクロールするプロセス中、現在のページから新しい URL を継続的に抽出し、特定の URL が得られるまでキューに入れます。システムの停止条件が満たされています。
クローラーの用途は何ですか?
一般的な検索エンジンの Web ページ コレクターとして。 (google、baidu)
垂直型検索エンジンを構築します。
科学研究: オンライン人間行動、オンライン コミュニティ進化、人間動態研究、計量社会学、複雑なネットワーク、データマイニングなどの分野における実証研究はすべて大量のデータを必要とし、Web クローラーは関連データを収集するための強力なツールです。
QueryList の概要と機能 #QueryList は、phpQuery に基づいた、シンプルでエレガント、スケーラブルな PHP 収集ツール (クローラー) のセットです。
機能:
#プロフェッショナルな Q&A コミュニティとコミュニケーション グループを備えています
Through
マルチスレッド コレクション
画像のローカリゼーション
次のようなブラウザの動作をシミュレートします: フォームフォームの送信
Web クローラー
PHP >= 7.0
PHP バージョンがまだ PHP5 のままである場合、または Composer の使用方法がわからない場合は、QueryList3 の使用を選択できます。QueryList3 は php5 をサポートします。 3および手動インストール。 QueryList3 ドキュメント: http://v3.querylist.ccインストール
Composer によるインストール:composer require jaeger/querylist
要素操作「Nitu.com」のすべての画像アドレスを収集
QueryList::get('http://www.nipic.com')->find('img')->attrs('src');
Baidu 検索結果を収集
$ql = QueryList::get('http://www.baidu.com/s?wd=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>追加内容</div>')->find('div')->htmls(); $ql->find('.two')->children('img')->attrs('alt'); //获取class为two元素下的所有img孩子节点 //遍历class为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')->...
百度検索結果リストのタイトルとリンクを収集:$data = QueryList::get('http://www.baidu.com/s?wd=QueryList')
// 设置采集规则
->rules([
'title'=>array('h3','text'),
'link'=>array('h3>a','href')
])
->query()->getData();
print_r($data->all());
Array ( [0] => Array ( [title] => QueryList|基于phpQuery的无比强大的PHP采集工具 [link] => http://www.baidu.com/link?url=GU_YbDT2IHk4ns1tjG2I8_vjmH0SCJEAPuuZN ) [1] => Array ( [title] => PHP 用QueryList抓取网页内容 - wb145230 - 博客园 [link] => http://www.baidu.com/link?url=zn0DXBnrvIF2ibRVW34KcRVFG1_bCdZvqvwIhUqiXaS ) [2] => Array ( [title] => 介绍- QueryList指导文档 [link] => http://www.baidu.com/link?url=pSypvMovqS4v2sWeQo5fDBJ4EoYhXYi0Lxx ) //... )
エンコード変換
// 输出编码:UTF-8,输入编码:GB2312 QueryList::get('https://top.etao.com')->encoding('UTF-8','GB2312')->find('a')->texts(); // 输出编码:UTF-8,输入编码:自动识别 QueryList::get('https://top.etao.com')->encoding('UTF-8')->find('a')->texts();
Cookie を使用して Sina Weibo にログイン//采集新浪微博需要登录才能访问的页面
$ql = QueryList::get('http://weibo.com','param1=testvalue & params2=somevalue',[
'headers' => [
//填写从浏览器获取到的cookie
'Cookie' => 'SINAGLOBAL=546064; wb_cmtLike_2112031=1; wvr=6;....'
]
]);
//echo $ql->getHtml();
echo $ql->find('title')->text();
//输出: 我的首页 微博-随时随地发现新鲜事
$urlParams = ['param1' => 'testvalue','params2' => 'somevalue']; $opts = [ // 设置http代理 'proxy' => 'http://222.141.11.17:8118', //设置超时时间,单位:秒 'timeout' => 30, // 伪造http头 '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();
模擬ログイン
// 用post登录 $ql = QueryList::post('http://xxxx.com/login',[ 'username' => 'admin', 'password' => '123456' ])->get('http://xxx.com/admin'); //采集需要登录才能访问的页面 $ql->get('http://xxx.com/admin/page'); //echo $ql->getHtml();
フォーム フォームの操作
GitHub へのログインをシミュレートする// 获取QueryList实例
$ql = QueryList::getInstance();
//获取到登录表单
$form = $ql->get('https://github.com/login')->find('form');
//填写GitHub用户名和密码
$form->find('input[name=login]')->val('your github username or email');
$form->find('input[name=password]')->val('your github password');
//序列化表单数据
$fromData = $form->serializeArray();
$postData = [];
foreach ($fromData as $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();
if($userName)
{
echo '登录成功!欢迎你:'.$userName;
}else{
echo '登录失败!';
}
myHttp メソッドをカスタマイズする: $ql = QueryList::getInstance();
//绑定一个myHttp方法到QueryList对象
$ql->bind('myHttp',function ($url){
$html = file_get_contents($url);
$this->setHtml($html);
return $this;
});
//然后就可以通过注册的名字来调用
$data = $ql->myHttp('https://toutiao.io')->find('h3 a')->texts();
print_r($data->all());
$ql->bind('myHttp',function ($url){ return new MyHttp($this,$url); });
CURL マルチスレッド プラグインを使用します。マルチスレッド コレクション GitHub ランキング :$ql = QueryList::use(CurlMulti::class);
$ql->curlMulti([
'https://github.com/trending/php',
'https://github.com/trending/go',
//.....more urls
])
// 每个任务成功完成调用此回调
->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());
})
// 每个任务失败回调
->error(function ($errorInfo,CurlMulti $curl){
echo "Current url:{$errorInfo['info']['url']} \r\n";
print_r($errorInfo['error']);
})
->start([
// 最大并发数
'maxThread' => 10,
// 错误重试次数
'maxTry' => 3,
]);
推奨学習: "
PHP ビデオ チュートリアル"
以上がPHP を使用してデータを非同期的にクロールする方法の簡単な分析の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。