欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  php教程

抓取微博热词,使用simple_html_dom来操作html数据

程序员文章站 2023-12-22 15:11:52
...

一直以来使用php解析html文档树都是一个难题。 Simple HTML DOM parser ?很好地解决了这个问题。可以通过这个php类来解析html文档,对其中的html元素进行操作 (PHP5+以上版本)。解析器不仅仅只是帮助我们验证html文档;更能解析不符合W3C标准的html文档。它

一直以来使用php解析html文档树都是一个难题。Simple HTML DOM parser?很好地解决了这个问题。可以通过这个php类来解析html文档,对其中的html元素进行操作 (PHP5+以上版本)。 解析器不仅仅只是帮助我们验证html文档;更能解析不符合W3C标准的html文档。它使用了类似jQuery的元素选择器,通过元素的id,class,tag等等来查找定位;同时还提供添加、删除、修改文档树的功能。和jq一样的操作还是很方便的。 有三种方式调用这个类: 从url中加载html文档 从字符串中加载html文档 从文件中加载html文档
load_file('http://www.xxx.com');
// 从字符串中加载
$html->load('从字符串中加载html文档演示');
//从文件中加载
$html->load_file('path/file/test.html');
?>
 

查找html元素

可以使用find函数来查找html文档中的元素。返回的结果是一个包含了对象的数组。我们使用HTML DOM解析类中的函数来访问这些对象,下面给出几个示例
find('a');
//查找文档中第(N)个超链接,如果没有找到则返回空数组.
$a = $html->find('a', 0);
// 查找id为main的div元素
$main = $html->find('div[id=main]',0);
// 查找所有包含有id属性的div元素
$divs = $html->find('div[id]');
// 查找所有包含有id属性的元素
$divs = $html->find('[id]');
?>
 
find('#container');
// 找到所有class=foo的元素
$ret = $html->find('.foo');
// 查找多个html标签
$ret = $html->find('a, img');
// 还可以这样用
$ret = $html->find('a[title], img[title]');
?>
 
parent;
// 返回子元素数组
$e->children;
// 通过索引号返回指定子元素
$e->children(0);
// 返回第一个资源速
$e->first_child ();
// 返回最后一个子元素
$e->last _child ();
// 返回上一个相邻元素
$e->prev_sibling ();
//返回下一个相邻元素
$e->next_sibling ();
?>
 

元素属性操作

使用简单的正则表达式来操作属性选择器。 [attribute] – 选择包含某属性的html元素 [attribute=value] – 选择所有指定值属性的html元素 [attribute!=value]- 选择所有非指定值属性的html元素 [attribute^=value] -选择所有指定值开头属性的html元素 [attribute$=value] 选择所有指定值结尾属性的html元素 [attribute*=value] -选择所有包含指定值属性的html元素  

如何避免解析器消耗过多内存

有时候可能Simple HTML DOM解析器消耗内存过多。如果php脚本占用内存太多,会导致网站停止响应等一系列严重的问题。解决的方法也很简单,在解析器加载html文档并使用完成后,记得清理掉这个对象就可以了。
clear();
?>
  下面看看微博热词抓取的源码示例
memcache = new Memcache;
        foreach ($cluster['memcached'] as $server) {
            $this->memcache->addServer($server['host'], $server['port']);
        }
    }
    function fetch($cache_key) {
        return $this->memcache->get($cache_key);
    }
    function store($cache_key, $val, $expire = 7200) {
        $this->memcache->set($cache_key, $val, MEMCACHE_COMPRESSED, $expire);
    }
    function flush() {
        $this->memcache->flush();
    }
    function delete($cache_key, $timeout = 0) {
        $this->memcache->delete($cache_key, $timeout);
    }
}
function unicode_hex_2_gbk($name) {
    $a = json_decode('{"a":"' . $name . '"}');
    if (isset($a) && is_object($a)) {
        return iconv('UTF-8', 'GBK//IGNORE', $a->a);
        return $a->a;
    }
    return null;
}
function curl_fetch($url, $time = 3) {
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_TIMEOUT, $time);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    $data = curl_exec($ch);
    $errno = curl_errno($ch);
    if ($errno > 0) {
        $err = "[CURL] url:{$url} ; errno:{$errno} ; info:" . curl_error($ch) . ";";
        echo $err;
        $data = false;
    }
    curl_close($ch);
    return $data;
}
$cluster["memcached"] = array(
    array("host" => "10.11.1.1", "port" => 11211),
);
//$memcache = new Tmemcache($cluster);
$url = "http://s.weibo.com/top/summary?cate=total&key=event";
$cache_key = md5("weibo" . $url);
//$str = $memcache->fetch($cache_key);
//if (!isset($_GET["nocache"]) && !empty($str)) {
//    echo $str;
//    exit;
//}
$content = curl_fetch($url);
if ($content === false)
    exit;
$html = str_get_html($content);
$a = $html->find('script', 8);
//测试
$a = str_replace(array('\\"', '\\/', "\\n", "\\t"), array('"', '/', "", ""), $a);
$pos = strpos($a, '');
$a = substr($a, $pos);
////////
//echo "";
//echo ($a);
//echo "";
$html = str_get_html($a);
$arr = array();
foreach ($html->find('table[id=event]', 0)->find('.rank_content') as $element) {
    $arr[] = unicode_hex_2_gbk($element->find("a", 0)->plaintext);
}
$html->clear();
$str = implode(",", $arr);
//if (!isset($_GET["nocache"]))
//    $memcache->store($cache_key, $str, 3600);
echo $str;
 

上一篇:

下一篇: