PHP实现简单爬虫的方法

yizhihongxing

下面我来详细讲解一下在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 pthreads v3下的Volatile简介与使用方法示例

    PHP pthreads是PHP中的多线程扩展库,在多线程编程中使用较为方便。在pthread v3版本中,引入了Volatile关键字,允许多线程之间有序访问共享数据,实现线程间数据同步。下面我们来详细讲解一下“PHP pthreads v3下的Volatile简介与使用方法示例”。 什么是Volatile Volatile 是一种类型修饰符,在多线程编程…

    PHP 2023年5月27日
    00
  • PHP7引入的”??”和”?:”的区别讲解

    当PHP7引入的”??”和”?:”这两个操作符都用于在特定情况下进行短路求值,以简化代码并提高性能。 ??操作符 “??”操作符表示当左边的操作数为空或未定义时,使用右侧的默认值。例如,以下代码片段展示了如何使用”?”?”操作符: $username = $_GET[‘username’] ?? ‘Anonymous’; echo $username; 在上…

    PHP 2023年5月26日
    00
  • PHP循环与分支知识点梳理

    以下是“PHP循环与分支知识点梳理”的完整使用攻略,包括循环和分支的基本概念、常见语句和示例说明等内容。 循和分支基本概念 循环和支是编程中常用的两种控制结构,它们可以帮助程序实现复杂的逻辑和流程控制。在PHP中循环和分支语句可以帮助程序实现重复执行和条件判断等功能。 常见语句 以下是循环和分支的常见语句: 1. 循环语句 for循环 for循环是一种常见的…

    PHP 2023年5月12日
    00
  • PHP 数组操作详解【遍历、指针、函数等】

    PHP 数组操作详解 在 PHP 中,数组是一种非常常用的数据类型,因此对于数组的操作也是开发者必须熟练掌握的技能之一。本文将详细讲解 PHP 数组操作的相关知识点,包括如何创建数组、数组遍历、数组指针、数组函数等,帮助开发者更好地理解和使用 PHP 数组。 创建数组 在 PHP 中,可以使用array()函数创建数组,也可以使用方括号[]来创建数组,两种方…

    PHP 2023年5月25日
    00
  • PHP递归算法的简单实例

    让我为你详细讲解“PHP递归算法的简单实例”的完整攻略。 什么是递归算法 递归是一种算法方法,是指函数自己调用自己,直到满足某个条件时停止调用。递归算法是解决许多问题的强大工具,如搜索、排序、遍历等。 在递归算法中,需要解决以下两个问题: 递归终止条件:必须有终止条件,否则递归会一直执行下去,直到栈溢出。 递归递推公式:将大问题拆解成小问题,并通过递归调用自…

    PHP 2023年5月27日
    00
  • PHP文件读写操作之文件写入代码

    下面是关于PHP文件读写操作之文件写入的完整攻略。 什么是文件写入? 文件写入是指向指定文件中写入内容。在PHP中,可以通过文件句柄函数和文件内容函数来进行文件写入操作。 PHP文件写入操作流程 PHP文件写入的一般流程如下: 打开文件:使用PHP的fopen()函数打开一个文件,并返回一个文件指针,文件指针指向文件的开头。 写入内容:使用PHP的fwrit…

    PHP 2023年5月23日
    00
  • php面向对象全攻略 (十六) 对象的串行化

    下面是我对“PHP面向对象全攻略(十六)对象的串行化”的完整攻略: 什么是对象的串行化? 对象的串行化是将对象的状态转化为可以存储或传输的格式,在适当的时候可以将其重新还原为原来的状态。具体来说,它包括对象的序列化和反序列化两个过程。在PHP中,对象的串行化可以通过PHP提供的序列化和反序列化函数来实现。 对象的序列化 对象的序列化是将对象的状态表示为可存储…

    PHP 2023年5月26日
    00
  • 小程序实现登录功能

    小程序实现登录功能需要进行以下步骤: 步骤一:前端页面设计 在小程序前端页面上添加登录按钮,并通过 JS 代码实现以下功能: 点击登录按钮后,调用小程序提供的 wx.login() 接口,获取到需要向服务器发送登录请求的 code; 将获取到的 code 发送给服务器,通过服务器获取到 sessionKey 和 openId; 将获取到的 sessionKe…

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