首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 綜合知識

PHP 采集腾讯微博内容的实现代码详解

     編輯:PHP 綜合知識

前言

在早期的 PHP 开发中,采集第三方平台数据是常见需求。本文分享一段用于采集腾讯微博(现已停运)公开排行榜页面内容的 PHP 代码,展示如何通过正则表达式提取目标数据并清洗 HTML 标签。

核心代码实现

<?php
header("Content-type:text/html;charset=utf-8");
// 获取腾讯微博排行榜页面源码
$weibo = file_get_contents('https://t.qq.com/starank');
// 正则匹配微博正文内容区块
$preg = '/<div class="msgCnt">(.*)<\/div><div class="mediaWrap">/Uis';
preg_match_all($preg, $weibo, $string);

// 遍历结果并清洗 HTML 标签
foreach ($string[1] as $key => $value) {
    echo delhtml($value) . "<br/><br/><br/>";
}

/**
 * 移除字符串中的 HTML 标签及特殊实体
 * @param string $str 待处理字符串
 * @return string 纯文本内容
 */
function delhtml($str) {
    $st = -1; // 标签开始位置
    $et = -1; // 标签结束位置
    $stmp = array(" "); // 需移除的实体数组
    $len = strlen($str);

    for ($i = 0; $i < $len; $i++) {
        $ss = substr($str, $i, 1);
        // 检测到 '<' 记录开始位置
        if (ord($ss) == 60) { // ord("<") == 60
            $st = $i;
        }
        // 检测到 '>' 记录结束位置并截取标签
        if (ord($ss) == 62) { // ord(">") == 62
            $et = $i;
            if ($st != -1) {
                $stmp[] = substr($str, $st, $et - $st + 1);
            }
        }
    }
    // 批量替换移除标签与实体
    return str_replace($stmp, "", $str);
}
?>

代码逻辑解析

  1. 页面获取:使用 file_get_contents 直接抓取目标 URL 的 HTML 源码。
  2. 正则提取:利用 preg_match_all 配合非贪婪模式(Uis 修饰符)精准定位微博正文所在的 <div class="msgCnt"> 区块。
  3. 标签清洗:自定义 delhtml 函数通过 ASCII 码判断(< 为 60,> 为 62)遍历字符串,记录所有 HTML 标签位置并存入数组,最后用 str_replace 一次性清除,同时处理 &nbsp; 等实体。

注意事项与现代替代方案

⚠ 代码局限性:

  • 腾讯微博已于 2020 年停止服务,该代码仅供学习参考。
  • 正则解析 HTML 脆弱且难以维护,页面结构变动即失效。
  • file_get_contents 无法处理动态渲染、反爬验证码或需登录的页面。

✅ 现代最佳实践:

  • 使用 Guzzle 或 cURL 处理复杂 HTTP 请求(Cookie、Header、代理)。
  • 配合 DOMDocument / XPath 或 Symfony DomCrawler 进行结构化解析。
  • 动态页面建议采用 Puppeteer / Selenium 等无头浏览器方案。
  • 务必遵守目标站点 robots.txt 与服务条款,控制采集频率。

总结

这段代码展示了早期 PHP 采集的基本思路:获取源码 → 正则提取 → 文本清洗。虽然简单直接,但在生产环境中建议采用更健壮的解析库与请求组件,并加入异常处理、重试机制及日志记录。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved