引言:为什么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你需要PHP 7.4或更高版本,并安装curl和dom扩展。可以通过以下命令检查:
php -m | grep -E "curl|dom"\n\n如果输出为空,通过包管理器安装:
\n\nsudo 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自动跟随重定向。
示例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,