Heim  >  Artikel  >  Backend-Entwicklung  >  PHP und phpSpider: Wie gehe ich mit der JS-Herausforderung des Website-Anti-Crawlings um?

PHP und phpSpider: Wie gehe ich mit der JS-Herausforderung des Website-Anti-Crawlings um?

WBOY
WBOYOriginal
2023-07-21 14:13:101561Durchsuche

PHP und phpSpider: Wie gehe ich mit der JS-Herausforderung des Website-Anti-Crawlings um?

Mit der Entwicklung der Internettechnologie wird die Abwehr von Websites gegen Crawler-Skripte immer leistungsfähiger. Websites verwenden häufig Javascript-Technologie zum Anti-Crawling, da Javascript Seiteninhalte dynamisch generieren kann, was es für einfache Crawler-Skripte schwierig macht, vollständige Daten zu erhalten. In diesem Artikel wird erläutert, wie Sie PHP und phpSpider verwenden, um die JS-Herausforderung des Website-Anti-Crawlings zu bewältigen.

phpSpider ist ein leichtes Crawler-Framework, das auf PHP basiert. Es bietet eine einfache und benutzerfreundliche API und umfangreiche Funktionen, die für die Abwicklung verschiedener Webseiten-Crawling-Aufgaben geeignet sind. Sein Vorteil besteht darin, dass es das Browserverhalten simulieren kann, einschließlich der Ausführung von Javascript-Code, wodurch wir den JS-Anti-Crawler-Mechanismus der Website umgehen können.

Zuerst müssen wir phpSpider installieren. Es kann über Composer installiert werden und den folgenden Befehl im Projektverzeichnis ausführen:

composer require dungsit/php-spider

Nach Abschluss der Installation können wir mit phpSpider Crawler-Skripte im Projekt schreiben.

Zuerst müssen wir eine neue phpSpider-Instanz erstellen und die gecrawlte Ziel-URL, HTTP-Header-Informationen usw. festlegen. Das Folgende ist ein Beispiel:

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

Im obigen Beispiel geben wir die zu crawlende Startseiten-URL an, indem wir das Feld scan_urls festlegen, und geben die Liste an, indem wir den list_url_regexesfestlegen >-Feld Der reguläre URL-Ausdruck der Seite. Das Feld content_url_regexes gibt den regulären URL-Ausdruck der Inhaltsseite an. Im nächsten Feld fields können wir den zu erfassenden Feldnamen, die Feldauswahl und festlegen, ob es sich um ein Pflichtfeld handelt. 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

Da es unser Ziel ist, den JS-Anti-Crawler-Mechanismus der Website zu umgehen, müssen wir ein Plugin in phpSpider verwenden, um Javascript-Code auszuführen. Sie können das Plug-in ExecuteJsPlugin verwenden, um diese Funktion zu erreichen, die auf der Browser-Paketbibliothek Goutte zum Ausführen von Javascript-Code basiert. Hier ist ein Beispiel für die Verwendung des Plugins ExecuteJsPlugin in phpSpider:

rrreee

Im obigen Beispiel haben wir zuerst das Plugin execute_jsExecuteJsPlugin eingeführt. Anschließend legen wir den Domänennamen und den Benutzeragenten (UA) der Zielwebsite fest, der es phpSpider ermöglichen soll, Browseranfragen beim Besuch der Zielwebsite zu simulieren. Als Nächstes haben wir die Instanz ExecuteJsPlugin im Feld plugins hinzugefügt. 🎜🎜Nach der Verwendung dieses Plugins können wir Javascript-Ausdrücke im Feldselektor verwenden, um Elemente zu finden. Zum Beispiel setzen wir den Selektor auf '//div[@class="content"]/q', was bedeutet, dass wir das untergeordnete Element q auswählen, dessen Klassenattribut des div-Elements „ Inhalt". Auf diese Weise kann phpSpider diesen Javascript-Code ausführen, um die Daten zu erhalten. 🎜🎜Zusammenfassend lässt sich sagen, dass wir das phpSpider-Framework und das Plug-in ExecuteJsPlugin verwenden können, um die JS-Herausforderung des Anti-Crawlings auf der Website zu bewältigen. Durch die Simulation des Browserverhaltens können wir den JS-Anti-Crawler-Mechanismus der Website umgehen und problemlos die erforderlichen Daten erhalten. Ich hoffe, dass dieser Artikel für Ihre Crawler-Entwicklung hilfreich sein kann. 🎜🎜Codebeispielquelle: https://github.com/nmred/phpspider🎜

Das obige ist der detaillierte Inhalt vonPHP und phpSpider: Wie gehe ich mit der JS-Herausforderung des Website-Anti-Crawlings um?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn