如何使用Curl提取网页指定内容?以获取FIFA球员名称为例
如何从Sofifa页面提取特定球员信息?
嘿,我来帮你搞定这个问题!你现在的代码是直接输出整个页面的HTML,但要拿到球员名称这类特定内容,得用DOM解析来精准抓取,而不是一股脑把整个页面打出来。下面给你两种靠谱的实现方式:
方法一:用PHP的DOMDocument + DOMXPath(推荐)
这是最稳定的方案,能正确解析HTML结构,哪怕页面有轻微的代码不规范也能处理。
<?php // 整理请求URL(你原来的URL里有重复的pn参数,我帮你合并成逗号分隔的格式了) $url = "https://sofifa.com/players?aeh=22&ptl=84&pth=99&pn=27,25,23"; // 初始化curl,加上User-Agent避免被网站拦截 $ch = curl_init($url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'); $output = curl_exec($ch); curl_close($ch); // 处理HTML解析,忽略页面不规范导致的警告 libxml_use_internal_errors(true); $dom = new DOMDocument(); $dom->loadHTML($output); libxml_clear_errors(); // 用XPath定位球员名称元素(根据Sofifa当前页面结构,球员名在class为"bp3-text-overflow-ellipsis"的a标签里) $xpath = new DOMXPath($dom); $playerNodes = $xpath->query('//a[@class="bp3-text-overflow-ellipsis"]'); // 遍历输出提取到的球员名称 if ($playerNodes->length > 0) { echo "提取到的球员名称:<br>"; foreach ($playerNodes as $node) { echo "- " . $node->nodeValue . "<br>"; } } else { echo "没找到球员名称,可能是页面结构更新了,需要调整XPath表达式"; } ?>
关键点说明
- 加了
User-Agent:很多网站会拦截没有标识的爬虫请求,加个浏览器UA能大幅提高请求成功率。 - DOM解析:相比正则,DOM能准确识别HTML的层级结构,就算页面小幅度更新,只需要调整XPath路径就行。
- 忽略解析警告:网页的HTML经常不严格符合规范,用
libxml_use_internal_errors(true)可以避免解析时抛出一堆无关警告。
方法二:用正则表达式(临时应急用)
正则的缺点是一旦页面结构变动就会失效,所以只适合临时抓取,不建议长期用:
<?php // 前面的curl请求部分和上面一致,省略重复代码... // 用正则匹配球员名称(示例表达式,需根据实际页面结构调整) preg_match_all('/<a class="bp3-text-overflow-ellipsis"[^>]*>([^<]+)<\/a>/', $output, $matches); if (!empty($matches[1])) { echo "提取到的球员名称:<br>"; foreach ($matches[1] as $name) { echo "- " . htmlspecialchars($name) . "<br>"; } } else { echo "未匹配到球员名称,请检查正则表达式是否匹配当前页面"; } ?>
额外注意事项
- 遵守网站规则:不要频繁发送请求给服务器施压,最好加个请求间隔;同时查看目标网站的
robots.txt,确认是否允许抓取这类内容。 - 动态内容处理:如果页面是滚动加载更多球员,单纯curl只能拿到初始加载的内容,这时候可能需要用PhantomJS或Selenium这类工具来模拟浏览器渲染。
内容的提问来源于stack exchange,提问作者James Tyreece
相关产品推荐
相关产品推荐

