PHP数据解析与抓取:从入门到精通

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

引言:为什么PHP是解析的理想工具

\n\n

当谈到网站解析时,很多人首先想到的是Python及其BeautifulSoup或Scrapy。但让我们坦诚地说:PHP几乎存在于每两台服务器中,如果你的项目已经基于PHP——为了一个解析任务而引入整套Python技术栈并不明智。PHP在处理数据收集方面表现出色,尤其是需要快速处理HTML或JSON、调用API或从十几个页面提取内容时。

\n\n

在pythonlib.ru网站上,我们习惯谈论Python,但今天破个例。因为PHP不仅仅是用于“名片网站”的语言。它是一个强大的网页抓取工具,能够处理cURL、DOMDocument、XPath,甚至模拟浏览器行为。在本文中,我们将通过真实示例讲解如何使用PHP解析网站、避免封禁以及处理动态内容。

\n\n

如果你曾想自动收集竞争对手的价格、新闻或联系方式——你来对地方了。让我们开始吧!

\n\n

解析与抓取:有什么区别?

\n\n

在编写代码之前,我们先理清术语。PHP数据解析是从HTML、XML或JSON中提取结构化信息的过程。而PHP数据抓取是一个更广泛的概念,包括页面加载、绕过防护和提取数据。简单来说:解析是“读取”,抓取是“挖掘”。

\n\n

在PHP中,抓取需要两个主要工具:

\n
    \n
  • cURL — 用于发送HTTP请求并获取服务器响应
  • \n
  • DOMDocument或SimpleXML — 用于解析获取的HTML/XML
  • \n
\n\n

此外,还可以使用库(稍后讨论),但开始时使用内置函数就足够了。

\n\n

环境安装与准备

\n\n

你需要PHP 7.4或更高版本,并安装curl和dom扩展。可以通过以下命令检查:

\n\n
php -m | grep -E "curl|dom"
\n\n

如果输出为空,通过包管理器安装:

\n\n
sudo apt install php-curl php-xml
\n\n

一切就绪。现在创建第一个解析脚本。

\n\n

示例1:使用cURL和DOMDocument进行简单解析

\n\n

假设我们要从博客收集文章标题。编写一个简单但可用的代码:

\n\n
<?php\n// 要解析的URL\n$url = 'https://example-blog.com';\n\n// 初始化cURL\n$ch = curl_init($url);\ncurl_setopt($ch, CURLOPT_RETURNTRANSFER, true);\ncurl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);\ncurl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36');\n\n$html = curl_exec($ch);\ncurl_close($ch);\n\n// 创建DOMDocument并加载HTML\n$dom = new DOMDocument();\nlibxml_use_internal_errors(true); // 忽略HTML解析错误\n$dom->loadHTML($html);\nlibxml_clear_errors();\n\n// 使用XPath查找h2标题\n$xpath = new DOMXPath($dom);\n$titles = $xpath->query('//h2');\n\nforeach ($titles as $title) {\n    echo $title->nodeValue . "\\n";\n}\n?>
\n\n

注意:我们设置了User-Agent——这是最基本的防封禁措施。没有它,网站经常返回403错误。同时使用CURLOPT_FOLLOWLOCATION自动跟随重定向。

\n\n

示例2:处理表单和POST请求

\n\n

数据通常隐藏在搜索表单或登录后面。PHP解析允许模拟表单提交:

\n\n
<?php\n$url = 'https://example.com/search';\n$postData = http_build_query([\n    'query' => 'PHP scraping',\n    'submit' => 'Search'\n]);\n\n$ch = curl_init($url);\ncurl_setopt($ch, CURLOPT_RETURNTRANSFER, true);\ncurl_setopt($ch, CURLOPT_POST, true);\ncurl_setopt($ch, CURLOPT_POSTFIELDS,                

博客

书籍推荐