0


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

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

一、Selenium和ChromeDriver的安装

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

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

1

  1. composer
  1. require
  1. facebook/webdriver

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

1

2

3

  1. $webdriver
  1. = FacebookWebDriverRemoteRemoteWebDriver::create(
  1. 'http://localhost:9515'
  1. , FacebookWebDriverChromeChromeOptions::
  1. class
  1. );

二、构建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

  1. class
  1. Selenium
  1. {
  1. private
  1. static
  1. $driver
  1. ;
  1. private
  1. static
  1. $selenium
  1. ;
  1. public
  1. static
  1. function
  1. getInstance()
  1. {
  1. if
  1. (null === self::
  1. $selenium
  1. ) {
  1. $options
  1. =
  1. new
  1. ChromeOptions();
  1. $options
  1. ->addArguments([
  1. '--no-sandbox'
  1. ,
  1. '--disable-extensions'
  1. ,
  1. '--headless'
  1. ,
  1. '--disable-gpu'
  1. ]);
  1. self::
  1. $driver
  1. = RemoteWebDriver::create(
  1. 'http://localhost:9515'
  1. ,
  1. DesiredCapabilities::chrome()->setCapability(
  1. ChromeOptions::CAPABILITY,
  1. $options
  1. )
  1. );
  1. self::
  1. $selenium
  1. =
  1. new
  1. self();
  1. }
  1. return
  1. self::
  1. $selenium
  1. ;
  1. }
  1. public
  1. function
  1. __destruct()
  1. {
  1. self::
  1. $driver
  1. ->quit();
  1. self::
  1. $selenium
  1. = null;
  1. }
  1. public
  1. function
  1. getDriver()
  1. {
  1. return
  1. self::
  1. $driver
  1. ;
  1. }
  1. }

注意,参数中的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

  1. class
  1. PageParser
  1. {
  1. private
  1. $pageSource
  1. ;
  1. public
  1. function
  1. __construct(string
  1. $pageSource
  1. )
  1. {
  1. $this
  1. ->pageSource =
  1. $pageSource
  1. ;
  1. }
  1. public
  1. function
  1. parse(string
  1. $expression
  1. ,
  1. $list
  1. = false)
  1. {
  1. if
  1. (
  1. $list
  1. ) {
  1. return
  1. $this
  1. ->parseList(
  1. $expression
  1. );
  1. }
  1. return
  1. $this
  1. ->parseSingle(
  1. $expression
  1. );
  1. }
  1. private
  1. function
  1. parseList(string
  1. $expression
  1. )
  1. {
  1. $domXpath
  1. =
  1. new
  1. DOMXPath(@DOMDocument::loadHTML(
  1. $this
  1. ->pageSource));
  1. $items
  1. =
  1. $domXpath
  1. ->query(
  1. $expression
  1. );
  1. $result
  1. = [];
  1. foreach
  1. (
  1. $items
  1. as
  1. $item
  1. ) {
  1. array_push
  1. (
  1. $result
  1. ,trim(
  1. $item
  1. ->nodeValue));
  1. }
  1. return
  1. $result
  1. ;
  1. }
  1. private
  1. function
  1. parseSingle(string
  1. $expression
  1. )
  1. {
  1. $domXpath
  1. =
  1. new
  1. DOMXPath(@DOMDocument::loadHTML(
  1. $this
  1. ->pageSource));
  1. $item
  1. =
  1. $domXpath
  1. ->query(
  1. $expression
  1. )->item(0);
  1. if
  1. (
  1. $item
  1. ) {
  1. return
  1. trim(
  1. $item
  1. ->nodeValue);
  1. }
  1. return
  1. ''
  1. ;
  1. }
  1. }

这里主要用到了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

  1. class
  1. Spider
  1. {
  1. private
  1. $selenium
  1. ;
  1. private
  1. $url
  1. ;
  1. public
  1. function
  1. __construct(
  1. $url
  1. )
  1. {
  1. $this
  1. ->selenium = Selenium::getInstance();
  1. $this
  1. ->url =
  1. $url
  1. ;
  1. $this
  1. ->selenium->getDriver()->get(
  1. $url
  1. );
  1. sleep(1);
  1. }
  1. public
  1. function
  1. __destruct()
  1. {
  1. $this
  1. ->selenium->getDriver()->close();
  1. $this
  1. ->selenium = null;
  1. }
  1. public
  1. function
  1. getContent(
  1. $expression
  1. ,
  1. $list
  1. = false)
  1. {
  1. $pageSource
  1. =
  1. $this
  1. ->selenium->getDriver()->getPageSource();
  1. $parser
  1. =
  1. new
  1. PageParser(
  1. $pageSource
  1. );
  1. return
  1. $parser
  1. ->parse(
  1. $expression
  1. ,
  1. $list
  1. );
  1. }
  1. }

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

五、使用示例

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

1

2

3

4

5

6

7

8

  1. $spider
  1. =
  1. new
  1. Spider(
  1. 'https://www.example.com'
  1. );
  1. $aTags
  1. =
  1. $spider
  1. ->getContent(
  1. '//a'
  1. , true);
  1. foreach
  1. (
  1. $aTags
  1. as
  1. $a
  1. ) {
  1. $href
  1. =
  1. $a
  1. ->getAttribute(
  1. 'href'
  1. );
  1. $text
  1. =
  1. $a
  1. ->nodeValue;
  1. echo
  1. "
  1. $href
  1. ->
  1. $text
  1. ";
  1. }

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

六、总结

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

标签: php selenium 爬虫

本文转载自: https://blog.csdn.net/wx_19970108018/article/details/140046888
版权归原作者 IT数据小能手 所有, 如有侵权,请联系我们删除。

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

还没有评论