Rumah >pembangunan bahagian belakang >tutorial php >Analisis ringkas tentang cara menggunakan PHP untuk merangkak data secara tidak segerak
Bercakap tentang crawler, ramai orang akan memikirkan crawler python, kerana ia mempunyai kelebihan yang besar. Tetapi sebenarnya, PHP juga boleh digunakan untuk merangkak data secara tidak segerak. Biar saya memperkenalkan kepada anda cara menggunakan PHP untuk merangkak data secara tidak segerak.
Apakah perangkak web?
Perangkak web ialah program yang mengeluarkan halaman web secara automatik daripada World Wide Web untuk enjin carian dan merupakan komponen penting dalam enjin carian. Perangkak tradisional bermula dari URL satu atau beberapa halaman web awal dan memperoleh URL pada halaman web awal Semasa proses merangkak halaman web, ia terus mengekstrak URL baharu daripada halaman semasa dan meletakkannya ke dalam baris gilir sehingga tertentu. syarat berhenti sistem dipenuhi.
Untuk apa perangkak?
berfungsi sebagai pengumpul halaman web enjin carian universal. (google, baidu)
Bina enjin carian menegak.
Penyelidikan saintifik: tingkah laku manusia dalam talian, evolusi komuniti dalam talian, penyelidikan dinamik manusia , Penyelidikan empirikal dalam bidang seperti sosiologi ekonometrik, rangkaian kompleks dan perlombongan data semuanya memerlukan sejumlah besar data dan perangkak web ialah alat yang berkuasa untuk mengumpul data yang berkaitan.
Mengintip, menggodam, menghantar spam...
Pengenalan dan Ciri Senarai Pertanyaan
QueryList ialah satu set alat pengumpulan PHP yang ringkas, elegan dan boleh skala (crawler) berdasarkan phpQuery.
Ciri:
Mempunyai pemilih DOM CSS3 yang sama seperti jQuery
Mempunyai operasi DOM yang sama seperti API jQuery
mempunyai penyelesaian koleksi senarai universal
mempunyai suite permintaan HTTP yang berkuasa yang boleh dilaksanakan dengan mudah: log masuk simulasi, penyemak imbas palsu, kompleks Proksi HTTP permintaan rangkaian seperti
Ada penyelesaian yang kacau
Mempunyai fungsi penapisan kandungan yang berkuasa, anda boleh menggunakan pemilih jQuey untuk menapis kandungan
Mempunyai reka bentuk yang sangat modular dan kebolehskalaan yang kuat
Mempunyai API ekspresif
Mempunyai dokumen berkualiti tinggi
Mempunyai pemalam yang kaya
Mempunyai komuniti Soal Jawab profesional dan kumpulan komunikasi
Melalui pemalam , anda boleh mencapai perkara seperti:
Koleksi berbilang benang
Penyetempatan imej
Simulasikan tingkah laku penyemak imbas, seperti: Serahkan Borang
Perangkak web
Keperluan alam sekitar
PHP >= 7.0
Jika versi PHP anda masih tersekat pada PHP5, atau anda tidak tahu cara menggunakan Composer, anda boleh memilih untuk menggunakan QueryList3, yang menyokong php5.3 dan pemasangan manual . Dokumentasi QueryList3: http://v3.querylist.cc
Pemasangan
Pemasangan melalui Komposer:
composer require jaeger/querylist
Gunakan
operasi elemen
untuk mengumpul semua alamat imej "Nitu.com"
QueryList::get('http://www.nipic.com')->find('img')->attrs('src');
untuk mengumpul hasil carian 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属性 });
Lebih Pelbagai Penggunaan
$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')->...
Senaraikan koleksi
Kumpulkan tajuk dan pautan senarai hasil carian Baidu:
$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());
Kumpul keputusannya:
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 ) //... )
Penukaran pengekodan
// 输出编码: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();
operasi rangkaian HTTP
Log masuk ke Sina Weibo dengan kuki
//采集新浪微博需要登录才能访问的页面 $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(); //输出: 我的首页 微博-随时随地发现新鲜事
Gunakan proksi Http
$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();
Log masuk simulasi
// 用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();
Kendalian borang borang
Log masuk simulasi ke 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 '登录失败!'; }
Penggunaan pemalam
Gunakan pemalam berbilang benang CURL, koleksi berbilang benang Kedudukan GitHub:
$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());
Untuk butiran lanjut, sila semak GitHub: https://github.com /jae-jae/QueryList
$ql->bind('myHttp',function ($url){ return new MyHttp($this,$url); });Pembelajaran yang disyorkan: "
Tutorial Video PHP"
Atas ialah kandungan terperinci Analisis ringkas tentang cara menggunakan PHP untuk merangkak data secara tidak segerak. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!