PHP 获取百度百科真实链接

February 12th, 2013

2015/08/25:经测试,本文的方法现已经失效,建议有需要的朋友到网上找寻其他可用方法。

百度百科是百度公司推出的一部内容开放、自由的网络百科全书,其测试版于2006年4月20日上线,正式版在2008年4月21日发布。百度百科旨在创造一个涵盖各领域知识的中文信息收集平台。

今天本来想写个 php 脚本通过键入中文来获取指定词条的内容,却发现实现起来并不太简单。

百度百科词条的URL都是为 http://baike.baidu.com/view/数字.htm ,URL跟词条内容并无直接联系;而通过百度搜索获取到的都是 http://www.baidu.com/link?url=iigPGJqjJ4zBBpC8yDF8xDhiqDSn1JZjFWsHhEoSNd85PkV8Xil-wx2n0K 之类的URL,显然是被加密过的,百度的防抓取工作还做的挺充分。

上网找了下资料,发现可以对百度百科的 searchword.php 的这里入手。对 searchword.php 输入要搜索的字符(词条标题),而指定的词条存在时,它就会自动跳转到词条的真实地址。

<?php
function geturl($string){
    $string = iconv('utf-8', 'gbk', $string); // 将字符转换成GBK编码,若文件为GBK编码可去掉本行
    $encode = urlencode($string); // 对字符进行URL编码
    $url = 'http://baike.baidu.com/list-php/dispose/searchword.php?word=' .$encode. '&pic=1';
    $get_contents = file_get_contents($url); // 获取跳转页内容
    $get_contents = iconv('gbk', 'utf-8', $get_contents); // 将获取的网页转换成UTF-8编码,若文件为GBK编码可去掉本行
    preg_match("/URL=(\S+)'>/s", $get_contents, $out); // 获取跳转后URL
    $real_link = 'http://baike.baidu.com' .$out[1];
    return $real_link; // 输出真实地址
}

echo geturl('互动百科'); // 输出 http://baike.baidu.com/view/1466380.htm
?>

运行上面的代码,脚本就会自动获取到词条的真实地址,即可接着进行抓取词条内容或其他的操作了。

本文共有 22 则回复
  1. 龙龙Fred 龙龙Fred 回复

    searchword.php这个主意不错啊~

  2. 张煊同学 张煊同学 回复

    很强大,希望可以延伸出某个小程序来

    1. Wis Wis

      @张煊同学
      这个还有点难度呢 xd

  3. 我要发芽 我要发芽 回复

    爬取百度百科,做一个搞基百科~

  4. 酱爆灵梦 酱爆灵梦 回复

    效率低了点,不过不懂算法,帮不了乃

  5. hostgator hostgator 回复

    其实百度太强大了,不得不佩服啊

  6. ixwebhosting ixwebhosting 回复

    这个我一点都搞不懂的,再说百度好可怕的

    1. Wis Wis

      可能是获取步骤比较烦琐吧~

    2. 影浅 影浅

      和小偷程序的原理差不多,
      话说“代码让人害怕。。。”,是什么意思?求教育

    3. 第三人称 第三人称

      原理简单,不过代码让人害怕。。。

    4. Wis Wis

      其实原理挺简单的

  7. 诛仙 诛仙 回复

    百度的不是很好抓啊

  8. ivy ivy 回复

    算法大概就是十六进制 ascii互换

    1. Wis Wis

      帮忙破下呗~

    1. Wis Wis

      度娘好难抓……盒盒

  9. Xider Xider 回复

    我以后要改称号了,板凳帝,沙发什么的太难抢了

    1. Xider Xider

      (>﹏<)(>﹏<)(>﹏<)不能这样的啊

    2. Wis Wis

      PIA,就是还没搞清他算法嘛,PIA PIA PIA……PIA

    3. Xider Xider

      这种方法还是很可行的,不过效率还是比直接用百度的算法来的低(PIA,你知道算法是什么么)