Recommandé : "Tutoriel vidéo PHP"
Pratique du robot d'exploration Web PHP : explorez les résultats de recherche Baidu et analysez la structure des données
Le moteur de recherche de Baidu dispose d'un mécanisme anti-crawler. Je vais d'abord l'essayer directement avec guzzle. Le code est le suivant :
<?php /** * Created by Benjiemin * Date: 2020/3/5 * Time: 14:58 */ require ('./vendor/autoload.php'); use QL\QueryList; //进入网页 $jar = new \GuzzleHttp\Cookie\CookieJar; $client = new GuzzleHttp\Client(['cookies' => true]); $ql = $client->request('GET', 'https://www.baidu.com', [ 'cookies' => $jar ]); if($ql->getStatusCode()!=200){ echo '网站状态不正常';die; } echo $ql->getBody();
Baidu l'a directement intercepté et est entré dans la page de saut. Je vais essayer d'ajouter un fichier d'en-tête de navigateur et réessayer.
L'en-tête modifié est le suivant :
$ql = $client->request('GET', 'https://www.baidu.com', [ 'cookies' => $jar, 'headers' => [ 'Accept-Encoding' => 'gzip, deflate, br', 'Accept' => 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8', 'Accept-Language' => 'zh-CN,zh;q=0.9,en;q=0.8', 'Cache-Control' => 'no-cache', 'Connection' => 'keep-alive', 'User-Agent' => 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36', ] ]);
Je l'ai testé et le site s'est ouvert.
Continuons, saisissons des mots-clés et recherchons, et avons découvert qu'il avait été intercepté par la sécurité, j'ai donc senti que je ne pouvais pas le faire directement avec GuzzleHttp, alors j'ai continué avec mon artefact : jaeger /querylist et jaeger/querylist-puppeteer.
Étapes d'installation :
1. Installer les dépendances
Avant cela, vous devez activer la fonction proc_open de php, sinon l'installation complète ne peut pas être terminée
composer install jaeger/querylist composer install jaeger/querylist-puppeteer
2. Installez nodejs
yum install nodejs
3. Installez npm
4 Installez @nesk/puphpeteer
npm install @nesk/puphpeteer
5. PHP active proc_open
Le code est comme suit :
<?php /** * Created by Benjiemin * Date: 2020/3/5 * Time: 14:58 */ require ('./vendor/autoload.php'); use QL\QueryList; use QL\Ext\Chrome; $ql = QueryList::getInstance(); // 注册插件,默认注册的方法名为: chrome $ql->use(Chrome::class); $ql->chrome(function ($page,$browser) { $page->goto('https://www.baidu.com'); // 这里故意设置一个很长的延长时间,让你可以看到chrome浏览器的启动 sleep(3); //输入关键词 $wd = '简庆旺博客'; $page->type("input[id='kw']",$wd); sleep(1); //点击搜索 $page->click("input[type='submit']"); //等待搜索结果 sleep(3); //获取结果 $html = $page->content(); //用jquery选择器抽取结果 $rules = array( 'title'=>['#content_left h3 a','text'],//标题 'url'=>['#content_left h3 a','href'],//跳转网址 'description'=>['div .c-abstract','text'],//描述 ); $ql = QueryList::html($html); $rt = $ql->rules($rules)->query()->getData(); //如果有需要,可以把$rt入库,以及做其他操作 sleep(10); $browser->close(); // 返回值一定要是页面的HTML内容 return $html; },[ 'headless' => false, // 启动可视化Chrome浏览器,方便调试 'devtools' => false, // 打开浏览器的开发者工具 ])->find('title')->text();
$rt est mon ensemble de résultats, imprimez-le comme suit
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!