PHP实现简单爬虫的方法

下面我来详细讲解一下在PHP中实现简单爬虫的方法。

1. 爬虫原理

爬虫是一种自动化的数据抓取程序,实现简单的爬虫需要了解如下基本步骤:

  1. 获取需要抓取的网页内容,可以使用Curlfile_get_contents等函数来获取;
  2. 解析网页内容,提取所需信息,可以使用正则表达式或XPath等方式;
  3. 把抓取到的数据进行处理,最后存储在数据库或文本文件中。

下面我们以一个实例来说明如何实现一个简单的爬虫。

2. 实例一:抓取博客内容并存储

例如,我们有一个博客网站http://www.example.com,现在我们想抓取其中的文章标题和文章链接,并存储到数据库中。

2.1 获取网页内容

我们可以使用Curl函数或file_get_contents函数来获取网页内容。其中Curl函数需要php.ini文件中启用Curl插件,但是相对来说对于数据的筛选会更加简单。file_get_contents函数是PHP自带的函数,更加简单,但是和Curl比,筛选数据要稍微复杂一些。

示例代码:

$url = "http://www.example.com";
$html = file_get_contents($url);

2.2 网页内容解析

使用正则表达式或XPath等方式提取所需信息。这里我们使用XPath。

假设我们要抓取的信息结构为:

<div class="article">
    <h1><a href="http://www.example.com/article1.html">Article Title</a></h1>
</div>

我们需要抓取的信息是文章标题和链接。我们可以使用XPath查询所有的h1标签下的a标签,并分别提取其中的texthref属性。示例代码:

$doc = new DomDocument();
$doc->loadHTML($html);
$xpath = new DomXPath($doc);
$articles = $xpath->evaluate('//div[@class="article"]');
foreach ($articles as $article) {
    $title = $xpath->evaluate('string(h1/a/text())', $article);
    $link = $xpath->evaluate('string(h1/a/@href)', $article);
}

2.3 存储数据

最后将得到的文章标题和链接存储到数据库中,以便快速索引和查询。

示例代码:

// 假设使用 MySQL 数据库
$db = new mysqli("localhost", "username", "password", "blog_db");
$db->query("SET NAMES UTF8");

// 删除已有数据
$db->query("DELETE FROM articles");

// 插入新数据
foreach ($articles as $article) {
    $title = $db->real_escape_string($xpath->evaluate('string(h1/a/text())', $article));
    $link = $db->real_escape_string($xpath->evaluate('string(h1/a/@href)', $article));
    $db->query("INSERT INTO articles (title, link) VALUES ('$title', '$link')");
}

这样,我们的爬虫程序就完成了。

3. 实例二:爬取百度百科词条内容

接下来我们再看一个实例。例如,我们要爬取百度百科词条中的概述、基本信息、正文等内容。

3.1 获取网页内容

百度百科的文章结构比较复杂,我们可以使用Curl函数来获取HTML页面。

示例代码:

$url = "https://baike.baidu.com/item/%E4%B8%AD%E5%9B%BD%E5%A4%A7%E9%99%86/408485";
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
$html = curl_exec($curl);
curl_close($curl);

3.2 网页内容解析

为了提取百度百科词条的概述、基本信息和正文,我们可以使用XPath表达式和CSS选择器。

$doc = new DomDocument();
$doc->loadHTML($html);
$xpath = new DomXPath($doc);

// 概述
$summary = $xpath->query('//div[@class="lemma-summary"]/div[@class="para"]')->item(0)->nodeValue;

// 基本信息
$info_items = $xpath->query('//div[@class="basic-info cmn-clearfix"]/dl/*');
$info = [];
$name = "";
for ($i = 0; $i < $info_items->length; $i++) {
    $item = $info_items->item($i);
    switch ($item->nodeName) {
        // 属性名称
        case "dt":
            $name = $item->nodeValue;
            break;
        // 属性值
        case "dd":
            $value = $item->nodeValue;
            // 删除注释
            $value = preg_replace('/<!--.*?-->/', "", $value);
            $info[$name] = trim($value);
            break;
    }
}

// 正文
$content = $doc->getElementById("lemmaContent-0")->ownerDocument->saveHTML($doc->getElementById("lemmaContent-0"));

3.3 存储数据

最后,我们可以把爬取到的结果存储到数据库或者其他文件中。

示例代码:

$db = new mysqli("localhost", "username", "password", "wiki_db");
$db->query("SET NAMES UTF8");

$insert_sql = "INSERT INTO baike_article (url, summary, content) VALUES ('{$url}', '{$summary}', '{$content}')";
$db->query($insert_sql);

$update_sql = "UPDATE baike_info SET name = ?, value = ? WHERE url = ? AND name = ?";
$stmt = $db->prepare($update_sql);

foreach ($info as $name => $value) {
    $stmt->bind_param("ssss", $url, $value, $url, $name);
    $stmt->execute();
}

这样,我们就完成了爬取百度百科词条的简单爬虫程序。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:PHP实现简单爬虫的方法 - Python技术站

(0)
上一篇 2023年5月23日
下一篇 2023年5月23日

相关文章

  • Php中文件下载功能实现超详细流程分析

    我来为你详细讲解“Php中文件下载功能实现超详细流程分析”的完整攻略。实现文件下载功能需要经历以下几个步骤: 1. 创建下载链接 在需要提供文件下载的页面中,添加一个超链接,用于触发文件下载。这个超链接的href属性需要指向一个下载文件的处理程序,比如download.php。 示例: <a href="download.php?file=e…

    PHP 2023年5月26日
    00
  • PHP 简单数组排序实现代码

    下面我来为您详细讲解 “PHP 简单数组排序实现代码” 的攻略。 标准解题思路 PHP 中提供了多种排序数组的函数,我们可以根据需要选择适合的方法排序数组。 下面是一些常用的 PHP 排序数组的函数: sort():按照升序对数组进行排序。 rsort():按照降序对数组进行排序。 asort():按照升序对数组进行排序,并保留原始键名。 arsort():…

    PHP 2023年5月23日
    00
  • PHP 多进程与信号中断实现多任务常驻内存管理实例方法

    下面是关于“PHP 多进程与信号中断实现多任务常驻内存管理实例方法”的完整攻略。 什么是多进程与信号中断? 多进程指的是在一个程序(或系统)中同时运行多个进程。信号中断则是指在一个进程中使用信号机制来实现中断处理。 在PHP中,使用多进程和信号中断可以实现多任务常驻内存管理。每个任务可以单独运行,相互独立,且可以随时停止或重新启动,非常方便实用。 如何实现多…

    PHP 2023年5月27日
    00
  • 浅谈PHP设计模式的装饰器模式

    简介 装饰器模式又叫做装饰者模式,属于结构型的设计模式。指的是在不改变原类文件和使用继承的情况下动态扩展这个对象的功能,从而修饰源数据。组成:抽象构件(Component)角色:定义一个抽象接口以规范准备接收附加责任的对象。具体构件(ConcreteComponent)角色:实现抽象构件,通过装饰角色为其添加一些职责。抽象装饰(Decorator)角色:继承…

    PHP 2023年4月19日
    00
  • 在windows平台上构建自己的PHP实现方法(仅适用于php5.2)

    在 Windows 平台上构建自己的 PHP 实现方法比在 Linux 平台上要复杂得多,但是它仍然是可能的。下面是一个适用于 PHP 5.2 的步骤。 下载 Windows 平台的 PHP 源代码 前往 PHP 官网 (https://www.php.net/downloads.php) 下载 PHP 5.2 的源代码压缩包,并解压到本地目录中。例如:D:…

    PHP 2023年5月23日
    00
  • PHP中array_merge和array相加的区别分析

    当使用PHP处理数组时,经常需要将两个或多个数组合并成一个更大的数组。在PHP中,我们有两个选项:使用array_merge()函数或使用“+”运算符来合并数组。这两种方法看起来很相似,但实际上它们有着不同的行为。下面是完整的攻略逐步说明其区别和示例演示。 使用array_merge()函数合并数组 array_merge()函数可以将两个或多个数组合并成一…

    PHP 2023年5月26日
    00
  • PHP获取数组最大值下标的方法

    获取PHP数组中最大值下标的方法如下: 使用PHP函数max()和array_keys() 首先使用max()函数获取数组中的最大值,然后再使用array_keys()函数获取对应的键名: <?php $array = array(1, 3, 5, 8, 2, 9); $maxValue = max($array); // 获取最大值 $keys = …

    PHP 2023年5月26日
    00
  • 分析php://output和php://stdout的区别

    当我们在PHP中使用echo或print输出内容时,输出的内容将被发送到标准输出流(stdout),然后发送到Web服务器或客户端浏览器。在PHP中有两个不同的I/O流,即php://output和php://stdout。这两个I/O流虽然看起来很类似,但它们的功能上有一些重要的区别。 分析php://output和php://stdout的区别 php:…

    PHP 2023年5月26日
    00
合作推广
合作推广
分享本页
返回顶部