当前位置: 首页 > news >正文

如何使用PHP和Selenium快速构建自己的网络爬虫系统

近年来,随着互联网的普及,网络爬虫逐渐成为了信息采集的主要手段之一,然而,常规的爬虫技术不稳定、难以维护,市面上的纯web网页爬虫也只能在静态页面上进行操作。而php结合selenium可达到动态爬虫的效果,具有稳定性高、数据采集全面等优点,被广泛应用于爬虫开发中。本文将介绍如何使用php和selenium快速构建自己的网络爬虫系统。

一、Selenium和ChromeDriver的安装

Selenium是一个自动化测试工具,可以对Web应用程序进行自动化测试,其中将浏览器与操作系统分离式地处理,无强制插入代码实现页面渲染。ChromeDriver则是Selenium中调用Chrome浏览器的驱动程序,可以使Selenium直接操作Chrome,从而实现动态页面的爬取。

首先需要在本地安装Chrome浏览器和PHP环境。接着,我们需要安装相应版本的Selenium和ChromeDriver,在命令行中输入以下代码即可安装:

1

composer require facebook/webdriver

然后将ChromeDriver二进制文件(根据自己的本地Chrome版本下载相应版本的ChromeDrive)置于系统Path变量环境中,代码如下:

1

2

3

$webdriver = FacebookWebDriverRemoteRemoteWebDriver::create(

    'http://localhost:9515', FacebookWebDriverChromeChromeOptions::class

);

二、构建Selenium和ChromeDriver的封装类

Selenium封装类主要用来维护Selenium和ChromeDriver,避免重复创建、销毁,代码如下:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

class Selenium

{

    private static $driver;

    private static $selenium;

    public static function getInstance()

    {

        if (null === self::$selenium) {

            $options = new ChromeOptions();

            $options->addArguments(['--no-sandbox','--disable-extensions','--headless','--disable-gpu']);

            self::$driver = RemoteWebDriver::create(

                'http://localhost:9515',

                DesiredCapabilities::chrome()->setCapability(

                    ChromeOptions::CAPABILITY,

                    $options

                )

            );

            self::$selenium = new self();

        }

        return self::$selenium;

    }

    public function __destruct()

    {

        self::$driver->quit();

        self::$selenium = null;

    }

    public function getDriver()

    {

        return self::$driver;

    }

}

注意,参数中的ChromeOptions主要是为了在无GUI(图形化界面)下仍能稳定运行,--no-sandbox参数是为了防止在linux系统下运行时报错。

三、创建网页源码解析类

爬虫系统的核心在于解析非静态页面,这里需要创建源码解析类,使用正则表达式或XPath表达式来定位和获取目标节点信息。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

class PageParser

{

    private $pageSource;

    public function __construct(string $pageSource)

    {

        $this->pageSource = $pageSource;

    }

    public function parse(string $expression, $list = false)

    {

        if ($list) {

            return $this->parseList($expression);

        }

        return $this->parseSingle($expression);

    }

    private function parseList(string $expression)

    {

        $domXpath = new DOMXPath(@DOMDocument::loadHTML($this->pageSource));

        $items = $domXpath->query($expression);

        $result = [];

        foreach ($items as $item) {

            array_push($result,trim($item->nodeValue));

        }

        return $result;

    }

    private function parseSingle(string $expression)

    {

        $domXpath = new DOMXPath(@DOMDocument::loadHTML($this->pageSource));

        $item = $domXpath->query($expression)->item(0);

        if ($item) {

            return trim($item->nodeValue);

        }

        return '';

    }

}

这里主要用到了DOMXPath类和DOMDocument类来解析页面中的HTML节点,分别通过parseList和parseSingle方法来定位和获取多个和一个目标节点的内容。

四、创建爬虫类

最后,我们需要构建一个专门爬取页面内容的爬虫类,代码如下:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

class Spider

{

    private $selenium;

    private $url;

    public function __construct($url)

    {

        $this->selenium = Selenium::getInstance();

        $this->url = $url;

        $this->selenium->getDriver()->get($url);

        sleep(1);

    }

    public function __destruct()

    {

        $this->selenium->getDriver()->close();

        $this->selenium = null;

    }

    public function getContent($expression, $list = false)

    {

        $pageSource = $this->selenium->getDriver()->getPageSource();

        $parser = new PageParser($pageSource);

        return $parser->parse($expression, $list);

    }

}

该类的getContent方法接收两个参数,一个是目标节点的XPath表达式,另一个是是否获取多个内容。 getModelContent函数请求URL并解析节点来获取所需内容,该函数获取结束后关闭浏览器进程。

五、使用示例

最后,我们使用实际例子来说明如何使用这个爬虫类。假设我们需要从一个拥有多个a标签的网页上,爬取a标签中的href属性和文本信息。我们可以通过以下代码来实现:

1

2

3

4

5

6

7

8

$spider = new Spider('https://www.example.com');

$aTags = $spider->getContent('//a', true);

foreach ($aTags as $a) {

    $href = $a->getAttribute('href');

    $text = $a->nodeValue;

    echo "$href -> $text

";

}

在以上代码中,首先使用Spider类获取页面源码,然后通过XPath表达式获取多个a标签的节点信息,最后通过getAttribute和nodeValue方法获取每个a标签的href属性和文本。

六、总结

综上所述,本文通过介绍如何使用PHP和Selenium构建网页爬虫系统,并通过实际示例说明如何获取页面中的节点信息,该爬虫具有稳定性高、数据采集全面等优点,具有一定的应用价值。但同时需要注意的是,爬取数据时需要注意合法性和道德性,并遵守相关法律法规。

相关文章:

  • mac上使用finder时候,显示隐藏的文件或者文件夹
  • IPython脚本加载秘籍:探索脚本魔法的艺术
  • MySQL 重新初始化实例
  • 【高考志愿】医学
  • Chapter9 更复杂的光照——Shader入门精要学习笔记
  • C盘清理和管理
  • charls抓包工具 mumu模拟器抓包apk
  • Kotlin中的类
  • 真的假不了,假的真不了
  • 动态规划——打家劫舍(C++)
  • 2024年【四川省安全员A证】试题及解析及四川省安全员A证模拟考试
  • SpringBoot3.3集成knif4j-swagger文档方式和使用案例
  • 前端初学java二(类、多态、接口、内部类、泛型)
  • 使用shell脚本进行clang-tidy静态代码分析
  • 【鸿蒙学习笔记】基础组件 Button
  • 【跃迁之路】【444天】程序员高效学习方法论探索系列(实验阶段201-2018.04.25)...
  • Apache Zeppelin在Apache Trafodion上的可视化
  • HTTP请求重发
  • java8-模拟hadoop
  • MobX
  • REST架构的思考
  • 基于Android乐音识别(2)
  • 基于遗传算法的优化问题求解
  • 自制字幕遮挡器
  • python最赚钱的4个方向,你最心动的是哪个?
  • shell使用lftp连接ftp和sftp,并可以指定私钥
  • ​​​​​​​​​​​​​​汽车网络信息安全分析方法论
  • ​iOS实时查看App运行日志
  • ​MySQL主从复制一致性检测
  • #WEB前端(HTML属性)
  • (2024,RWKV-5/6,RNN,矩阵值注意力状态,数据依赖线性插值,LoRA,多语言分词器)Eagle 和 Finch
  • (4) openssl rsa/pkey(查看私钥、从私钥中提取公钥、查看公钥)
  • (C语言)逆序输出字符串
  • (delphi11最新学习资料) Object Pascal 学习笔记---第8章第5节(封闭类和Final方法)
  • (LNMP) How To Install Linux, nginx, MySQL, PHP
  • (TOJ2804)Even? Odd?
  • (附源码)springboot 校园学生兼职系统 毕业设计 742122
  • (数位dp) 算法竞赛入门到进阶 书本题集
  • (四)docker:为mysql和java jar运行环境创建同一网络,容器互联
  • (一)项目实践-利用Appdesigner制作目标跟踪仿真软件
  • (译) 函数式 JS #1:简介
  • (转)从零实现3D图像引擎:(8)参数化直线与3D平面函数库
  • (转)我也是一只IT小小鸟
  • .h头文件 .lib动态链接库文件 .dll 动态链接库
  • .NetCore 如何动态路由
  • .NET平台开源项目速览(15)文档数据库RavenDB-介绍与初体验
  • .NET委托:一个关于C#的睡前故事
  • /etc/X11/xorg.conf 文件被误改后进不了图形化界面
  • @Autowired和@Resource装配
  • [ CTF ] WriteUp- 2022年第三届“网鼎杯”网络安全大赛(朱雀组)
  • [ Linux 长征路第五篇 ] make/Makefile Linux项目自动化创建工具
  • [ 云计算 | AWS ] AI 编程助手新势力 Amazon CodeWhisperer:优势功能及实用技巧
  • [1525]字符统计2 (哈希)SDUT
  • [AMQP Connection 127.0.0.1:5672] An unexpected connection driver error occured
  • [Bzoj4722]由乃(线段树好题)(倍增处理模数小快速幂)