Rumah > pembangunan bahagian belakang > tutorial php > Analisis ringkas tentang cara menggunakan PHP untuk merangkak data secara tidak segerak

Analisis ringkas tentang cara menggunakan PHP untuk merangkak data secara tidak segerak

Lepaskan: 2023-04-11 10:00:01
ke hadapan
3882 orang telah melayarinya

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.

Analisis ringkas tentang 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
Salin selepas log masuk

Gunakan

operasi elemen

untuk mengumpul semua alamat imej "Nitu.com"

QueryList::get('http://www.nipic.com')->find('img')->attrs('src');
Salin selepas log masuk

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属性
});
Salin selepas log masuk

Lebih Pelbagai Penggunaan

$ql->find(&#39;#head&#39;)->append(&#39;<div>追加内容</div>&#39;)->find(&#39;div&#39;)->htmls();
$ql->find(&#39;.two&#39;)->children(&#39;img&#39;)->attrs(&#39;alt&#39;); //获取class为two元素下的所有img孩子节点
//遍历class为two元素下的所有孩子节点
$data = $ql->find(&#39;.two&#39;)->children()->map(function ($item){
    //用is判断节点类型
    if($item->is(&#39;a&#39;)){
        return $item->text();
    }elseif($item->is(&#39;img&#39;))
    {
        return $item->alt;
    }
});

$ql->find(&#39;a&#39;)->attr(&#39;href&#39;, &#39;newVal&#39;)->removeClass(&#39;className&#39;)->html(&#39;newHtml&#39;)->...
$ql->find(&#39;div > p&#39;)->add(&#39;div > ul&#39;)->filter(&#39;:has(a)&#39;)->find(&#39;p:first&#39;)->nextAll()->andSelf()->...
$ql->find(&#39;div.old&#39;)->replaceWith( $ql->find(&#39;div.new&#39;)->clone())->appendTo(&#39;.trash&#39;)->prepend(&#39;Deleted&#39;)->...
Salin selepas log masuk

Senaraikan koleksi

Kumpulkan tajuk dan pautan senarai hasil carian Baidu:

$data = QueryList::get(&#39;http://www.baidu.com/s?wd=QueryList&#39;)
    // 设置采集规则
    ->rules([ 
        &#39;title&#39;=>array(&#39;h3&#39;,&#39;text&#39;),
        &#39;link&#39;=>array(&#39;h3>a&#39;,&#39;href&#39;)
    ])
    ->query()->getData();

print_r($data->all());
Salin selepas log masuk

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
        )
        //...
)
Salin selepas log masuk

Penukaran pengekodan

// 输出编码:UTF-8,输入编码:GB2312
QueryList::get(&#39;https://top.etao.com&#39;)->encoding(&#39;UTF-8&#39;,&#39;GB2312&#39;)->find(&#39;a&#39;)->texts();

// 输出编码:UTF-8,输入编码:自动识别
QueryList::get(&#39;https://top.etao.com&#39;)->encoding(&#39;UTF-8&#39;)->find(&#39;a&#39;)->texts();
Salin selepas log masuk

operasi rangkaian HTTP

Log masuk ke Sina Weibo dengan kuki

//采集新浪微博需要登录才能访问的页面
$ql = QueryList::get(&#39;http://weibo.com&#39;,&#39;param1=testvalue & params2=somevalue&#39;,[
    &#39;headers&#39; => [
        //填写从浏览器获取到的cookie
        &#39;Cookie&#39; => &#39;SINAGLOBAL=546064; wb_cmtLike_2112031=1; wvr=6;....&#39;
    ]
]);
//echo $ql->getHtml();
echo $ql->find(&#39;title&#39;)->text();
//输出: 我的首页 微博-随时随地发现新鲜事
Salin selepas log masuk

Gunakan proksi Http

$urlParams = [&#39;param1&#39; => &#39;testvalue&#39;,&#39;params2&#39; => &#39;somevalue&#39;];
$opts = [
    // 设置http代理
    &#39;proxy&#39; => &#39;http://222.141.11.17:8118&#39;,
    //设置超时时间,单位:秒
    &#39;timeout&#39; => 30,
     // 伪造http头
    &#39;headers&#39; => [
        &#39;Referer&#39; => &#39;https://querylist.cc/&#39;,
        &#39;User-Agent&#39; => &#39;testing/1.0&#39;,
        &#39;Accept&#39;     => &#39;application/json&#39;,
        &#39;X-Foo&#39;      => [&#39;Bar&#39;, &#39;Baz&#39;],
        &#39;Cookie&#39;    => &#39;abc=111;xxx=222&#39;
    ]
];
$ql->get(&#39;http://httpbin.org/get&#39;,$urlParams,$opts);
// echo $ql->getHtml();
Salin selepas log masuk

Log masuk simulasi

// 用post登录
$ql = QueryList::post(&#39;http://xxxx.com/login&#39;,[
    &#39;username&#39; => &#39;admin&#39;,
    &#39;password&#39; => &#39;123456&#39;
])->get(&#39;http://xxx.com/admin&#39;);
//采集需要登录才能访问的页面
$ql->get(&#39;http://xxx.com/admin/page&#39;);
//echo $ql->getHtml();
Salin selepas log masuk

Kendalian borang borang

Log masuk simulasi ke GitHub

< . 🎜>
// 获取QueryList实例
$ql = QueryList::getInstance();
//获取到登录表单
$form = $ql->get(&#39;https://github.com/login&#39;)->find(&#39;form&#39;);

//填写GitHub用户名和密码
$form->find(&#39;input[name=login]&#39;)->val(&#39;your github username or email&#39;);
$form->find(&#39;input[name=password]&#39;)->val(&#39;your github password&#39;);

//序列化表单数据
$fromData = $form->serializeArray();
$postData = [];
foreach ($fromData as $item) {
    $postData[$item[&#39;name&#39;]] = $item[&#39;value&#39;];
}

//提交登录表单
$actionUrl = &#39;https://github.com&#39;.$form->attr(&#39;action&#39;);
$ql->post($actionUrl,$postData);
//判断登录是否成功
// echo $ql->getHtml();
$userName = $ql->find(&#39;.header-nav-current-user>.css-truncate-target&#39;)->text();
if($userName)
{
    echo &#39;登录成功!欢迎你:&#39;.$userName;
}else{
    echo &#39;登录失败!&#39;;
}
Salin selepas log masuk

Penggunaan pemalam

Gunakan pemalam berbilang benang CURL, koleksi berbilang benang Kedudukan GitHub:

$ql = QueryList::getInstance();

//绑定一个myHttp方法到QueryList对象
$ql->bind(&#39;myHttp&#39;,function ($url){
    $html = file_get_contents($url);
    $this->setHtml($html);
    return $this;
});

//然后就可以通过注册的名字来调用
$data = $ql->myHttp(&#39;https://toutiao.io&#39;)->find(&#39;h3 a&#39;)->texts();
print_r($data->all());
Salin selepas log masuk

Untuk butiran lanjut, sila semak GitHub: https://github.com /jae-jae/QueryList

$ql->bind(&#39;myHttp&#39;,function ($url){
    return new MyHttp($this,$url);
});
Salin selepas log masuk
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!

Label berkaitan:
sumber:PHP自学中心
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan