Maison  >  Article  >  développement back-end  >  Une brève analyse de la façon d'utiliser PHP pour explorer les données de manière asynchrone

Une brève analyse de la façon d'utiliser PHP pour explorer les données de manière asynchrone

青灯夜游
青灯夜游avant
2023-01-12 20:02:333777parcourir

En parlant de robots d'exploration, beaucoup de gens penseront aux robots d'exploration Python, car ils présentent de grands avantages. Mais en fait, PHP peut également être utilisé pour explorer des données de manière asynchrone. Laissez-moi vous présenter comment utiliser PHP pour explorer des données de manière asynchrone.

Une brève analyse de la façon d'utiliser PHP pour explorer les données de manière asynchrone

Qu'est-ce qu'un robot d'exploration Web ?

Un robot d'exploration Web est un programme qui extrait automatiquement des pages Web. Il télécharge des pages Web du World Wide Web pour les moteurs de recherche et constitue un composant important des moteurs de recherche. Le robot d'exploration traditionnel part de l'URL d'une ou plusieurs pages Web initiales et obtient l'URL sur la page Web initiale. Pendant le processus d'exploration de la page Web, il extrait en permanence de nouvelles URL de la page actuelle et les met dans la file d'attente jusqu'à ce qu'elles soient certaines. les conditions d'arrêt du système sont remplies.

A quoi servent les robots ?

  • Agit comme un collecteur de pages Web de moteur de recherche universel. (google, baidu)

  • Créer un moteur de recherche vertical

  • Recherche scientifique : comportement humain en ligne, évolution de la communauté en ligne, recherche sur la dynamique humaine, sociologie économétrique, réseaux complexes, exploration de données et autres domaines de recherche empirique. nécessitent une grande quantité de données et les robots d’exploration Web sont un outil puissant pour collecter des données pertinentes.

  • Regarder, pirater, envoyer du spam...

Introduction et fonctionnalités de QueryList

QueryList est un ensemble d'outils de collecte PHP (crawlers) simples, élégants et évolutifs, basés sur phpQuery.

Caractéristiques :

  • Possède exactement le même sélecteur DOM CSS3 que jQuery

  • Possède exactement la même API d'opération DOM que jQuery

  • Possède une solution universelle de collecte de listes

  • Possède un puissant kit de requête HTTP, implémentez facilement des requêtes réseau complexes telles qu'une connexion simulée, un faux navigateur, un proxy HTTP, etc.

  • a une solution tronquée

  • a une puissante fonction de filtrage de contenu, vous pouvez utiliser le sélecteur jQuey pour filtrer le contenu

  • A une conception hautement modulaire et une forte évolutivité

  • Possède une API expressive

  • Possède une documentation de haute qualité

  • Possède une multitude de plug-ins

  • Possède une communauté de questions-réponses professionnelle et un groupe de communication

Grâce aux plug-ins, vous pouvez facilement réaliser des choses telles que :

  • Collection multithread

  • Localisation d'images

  • Simulation du comportement du navigateur, telles que : Soumettre un formulaire

  • Web crawler

Exigences environnementales

PHP >= 7.0

Si votre version de PHP est toujours bloquée sur PHP5, ou si vous ne savez pas comment utiliser Composer, vous pouvez choisir d'utiliser QueryList3, qui prend en charge php5.3 et installation manuelle. Document QueryList3 : http://v3.querylist.cc

Installation

Installation via Composer :

composer require jaeger/querylist

Utilisez

opération d'élément

pour collecter toutes les adresses d'image de "NiTu.com"

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

Collecter les résultats de recherche 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属性
});

Plus d'utilisations

$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;)->...

Collection de listes

Collecter les titres et les liens de la liste des résultats de recherche 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());

Résultats de la collection:

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
        )
        //...
)

Conversion d'encodage

// 输出编码: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();

Fonctionnement du réseau HTTP

Porter cookies Connectez-vous à Sina Weibo

//采集新浪微博需要登录才能访问的页面
$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();
//输出: 我的首页 微博-随时随地发现新鲜事

Utilisez le proxy 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();

Simulez la connexion

// 用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();

Opération de formulaire de formulaire

Simulez la connexion à 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;;
}

Extension de fonction de liaison

Personnalisez une extension de la méthode myHttp :

$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());

or put Le corps d'implémentation est encapsulé dans une classe, puis lié comme ceci :

$ql->bind(&#39;myHttp&#39;,function ($url){
    return new MyHttp($this,$url);
});

Utilisation du plug-in

Utiliser le plug-in multi-thread CURL, collection multi-thread Classement GitHub :

$ql = QueryList::use(CurlMulti::class);
$ql->curlMulti([
    &#39;https://github.com/trending/php&#39;,
    &#39;https://github.com/trending/go&#39;,
    //.....more urls
])
 // 每个任务成功完成调用此回调
 ->success(function (QueryList $ql,CurlMulti $curl,$r){
    echo "Current url:{$r[&#39;info&#39;][&#39;url&#39;]} \r\n";
    $data = $ql->find(&#39;h3 a&#39;)->texts();
    print_r($data->all());
})
 // 每个任务失败回调
->error(function ($errorInfo,CurlMulti $curl){
    echo "Current url:{$errorInfo[&#39;info&#39;][&#39;url&#39;]} \r\n";
    print_r($errorInfo[&#39;error&#39;]);
})
->start([
    // 最大并发数
    &#39;maxThread&#39; => 10,
    // 错误重试次数
    &#39;maxTry&#39; => 3,
]);

Pour pour plus de détails, veuillez consulter GitHub : https://github.com /jae-jae/QueryList

Apprentissage recommandé : "Tutoriel vidéo PHP"

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer