Maison  >  Article  >  développement back-end  >  PHP et phpSpider : Comment relever le défi JS de l'anti-crawling des sites Web ?

PHP et phpSpider : Comment relever le défi JS de l'anti-crawling des sites Web ?

WBOY
WBOYoriginal
2023-07-21 14:13:101509parcourir

PHP et phpSpider : Comment relever le défi JS de l'anti-crawling des sites Web ?

Avec le développement de la technologie Internet, la défense des sites Web contre les scripts de robots devient de plus en plus puissante. Les sites Web utilisent souvent la technologie Javascript pour anti-exploration, car Javascript peut générer dynamiquement le contenu des pages, ce qui rend difficile pour les simples scripts d'exploration d'obtenir des données complètes. Cet article explique comment utiliser PHP et phpSpider pour relever le défi JS de l'anti-exploration de sites Web.

phpSpider est un framework d'exploration léger basé sur PHP. Il fournit une API simple et facile à utiliser et des fonctions riches, adaptées à la gestion de diverses tâches d'exploration de pages Web. Son avantage est qu'il peut simuler le comportement du navigateur, y compris l'exécution de code Javascript, ce qui nous permet de contourner le mécanisme anti-crawler JS du site Web.

Tout d’abord, nous devons installer phpSpider. Il peut être installé via Composer et exécuter la commande suivante dans le répertoire du projet :

composer require dungsit/php-spider

Une fois l'installation terminée, nous pouvons utiliser phpSpider pour écrire des scripts de robot dans le projet.

Tout d'abord, nous devons créer une nouvelle instance de phpSpider et définir l'URL cible analysée, les informations d'en-tête HTTP, etc. Voici un exemple :

<?php
require 'vendor/autoload.php';

use phpspidercorephpspider;

$configs = array(
    'name' => 'example',
    'log_show' => true,
    'domains' => array(
        'example.com',
    ),
    'scan_urls' => array(
        'http://www.example.com'
    ),
    'list_url_regexes' => array(
        "http://www.example.com/w+",
    ),
    'content_url_regexes' => array(
        "http://www.example.com/[a-z]+/d+",
    ),
    'fields' => array(
        array(
            'name' => 'title',
            'selector' => '//h1',
            'required' => true,
        ),
        array(
            'name' => 'content',
            'selector' => '//div[@class="content"]',
            'required' => true,
        ),
    ),
);

$spider = new phpspider($configs);

$spider->start();

Dans l'exemple ci-dessus, nous spécifions l'URL de la page de démarrage à explorer en définissant le champ scan_urls, et spécifions la liste en définissant le list_url_regexes champ L'expression régulière URL de la page, le champ content_url_regexes spécifie l'expression régulière URL de la page de contenu. Dans le champ fields suivant, nous pouvons définir le nom du champ à capturer, le sélecteur de champ et s'il s'agit d'un champ obligatoire. scan_urls字段来指定需要抓取的起始页面URL,通过list_url_regexes字段来指定列表页的URL正则表达式,content_url_regexes字段来指定内容页的URL正则表达式。接下来的fields字段中,我们可以设置需要抓取的字段名、字段的选择器以及是否为必须字段。

由于我们的目标是绕过网站的JS反爬虫机制,我们需要在phpSpider中使用一个插件来执行Javascript代码。可以使用ExecuteJsPlugin插件来实现这个功能,它基于浏览器封装库Goutte来执行Javascript代码。以下是如何在phpSpider中使用ExecuteJsPlugin插件的示例:

<?php
require 'vendor/autoload.php';

use phpspidercorephpspider;
use phpspidercoreequests;
use phpspidercoreselector;
use phpspiderpluginsexecute_jsExecuteJsPlugin;

// 设置目标网站的域名和UA
requests::set_global('domain', 'example.com');
requests::set_global('user_agent', 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3');

$configs = array(
    'name' => 'example',
    'log_show' => true,
    'domains' => array(
        'example.com',
    ),
    'scan_urls' => array(
        'http://www.example.com'
    ),
    'list_url_regexes' => array(
        "http://www.example.com/w+",
    ),
    'content_url_regexes' => array(
        "http://www.example.com/[a-z]+/d+",
    ),
    'fields' => array(
        array(
            'name' => 'title',
            'selector' => '//h1',
            'required' => true,
        ),
        array(
            'name' => 'content',
            'selector' => '//div[@class="content"]',
            'required' => true,
        ),
    ),
    'plugins' => array(
        new ExecuteJsPlugin(),
    ),
);

$spider = new phpspider($configs);

$spider->start();

在上述示例中,我们首先引入了execute_jsExecuteJsPlugin插件。然后,我们设置了目标网站的域名和用户代理(UA),这是为了让phpSpider在访问目标网站时,模拟浏览器的请求。接下来,我们在plugins字段中添加了ExecuteJsPlugin实例。

使用这个插件后,我们可以在字段的选择器中使用Javascript表达式来定位元素。例如,我们将选择器设置为'//div[@class="content"]/q',表示我们将选择div元素的class属性为"content"的子元素q。这样,phpSpider就可以执行这段Javascript代码来获取数据了。

综上所述,我们可以使用phpSpider框架和ExecuteJsPlugin

Étant donné que notre objectif est de contourner le mécanisme anti-crawler JS du site Web, nous devons utiliser un plugin dans phpSpider pour exécuter du code Javascript. Vous pouvez utiliser le plug-in ExecuteJsPlugin pour réaliser cette fonction, qui est basée sur la bibliothèque d'empaquetage du navigateur Goutte pour exécuter du code Javascript. Voici un exemple d'utilisation du plugin ExecuteJsPlugin dans phpSpider :

rrreee

Dans l'exemple ci-dessus, nous avons d'abord présenté le plugin execute_jsExecuteJsPlugin. Ensuite, nous définissons le nom de domaine et l'agent utilisateur (UA) du site Web cible, ce qui doit permettre à phpSpider de simuler les requêtes du navigateur lors de la visite du site Web cible. Ensuite, nous avons ajouté l'instance ExecuteJsPlugin dans le champ plugins. 🎜🎜Après avoir utilisé ce plugin, nous pouvons utiliser des expressions Javascript dans le sélecteur de champ pour localiser les éléments. Par exemple, nous définissons le sélecteur sur '//div[@class="content"]/q', ce qui signifie que nous sélectionnerons l'élément enfant q dont l'attribut de classe de l'élément div est " contenu". De cette façon, phpSpider peut exécuter ce code Javascript pour obtenir les données. 🎜🎜Pour résumer, nous pouvons utiliser le framework phpSpider et le plug-in ExecuteJsPlugin pour relever le défi JS de l'anti-crawling sur le site Web. En simulant le comportement du navigateur, nous pouvons contourner le mécanisme anti-crawler JS du site Web et obtenir facilement les données requises. J'espère que cet article pourra être utile pour le développement de votre robot. 🎜🎜Source d'exemple de code : https://github.com/nmred/phpspider🎜

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:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn