您当前的位置:首页 > 网络编程 > Php编程 > 正文

让你的站跟新浪的新闻数据保持同步

【字体大小: 2009-11-22 23:08 来源: 作者: 

  采集已经不是什么新名词了,很多站长为了省事,也局限于人力的缺乏,使用程序来给自己的网站添砖加瓦,比如本人的个人网站www.xxfsw.com也采集了大量的新闻,那么如果实现呢?今天我们运用php来实现这个功能.

  谈到采集,我们不得不说两个东西,第一个是如何获取远程网站的源代码,这个可以通过php的一个扩展curl来获取,另一个是如果去匹配你需要的信息,这个的解决办法是正则表达式.

  Windows下开启curl的方法如下:

  1、拷贝PHP目录中的libeay32.dll, ssleay32.dll, php5ts.dll, php_curl.dll文件到 system32 目录。

  2、修改php.ini:配置好 extension_dir ,去掉 extension = php_curl.dll 前面的分号。

  3、重起apache。

  Linux下开启curl的方法如下:

  进入安装 原php 的源码目录,

  cd ext

  cd curl

  phpize

  ./configure --with-curl =DIR

  make

  就会在PHPDIR/ext/curl /moudles/下生成curl .so的文件。

  复制curl .so文件到extensions的配置目录,修改php .ini就好了.

  然后你就可以利用curl来获取到指定url的网页源码了,这里给大家一个封装好的函数:  

  1. function getwebcontent($url){  
  2.     $ch = curl_init();  
  3.     $timeout = 10;  
  4.     curl_setopt($ch, CURLOPT_URL, $url);  
  5.     curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);  
  6.     curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout);  
  7.     curl_setopt ($ch, CURLOPT_FOLLOWLOCATION, 1);  
  8.     $contents = trim(curl_exec($ch));  
  9.     curl_close($ch);  
  10.     return  $contents;  

  接下来就应该说到php中的正则表达式了:

  1.中括号

  [0-9]匹配0-9
  [a-z]匹配a-z小写字母
  [A-Z]匹配A-Z大写字母
  [a-zA-Z]匹配所有大小写字母

  可以使用ascii来制定更多

  2.量词

  p+匹配至少一个含p的字符串
  p*陪陪任何包含0个或多个p的字符串
  p?匹配任何包含0个或一个p的字符串
  p{2}匹配包含2个p的序列的字符串
  p{2,3}匹配任何包含2个或3个的字符串
  p$匹配任何以p结尾的字符串
  ^p匹配任何以p开头的字符串
  [^a-zA-Z]匹配任何不包含a-zA-Z的字符串
  p.p匹配任何包含p、接下来是任何字符、再接下来有又是p的字符串
  ^.{2}$匹配任何值包含2个字符的字符串
  (.*)b>匹配任何被>包围的字符串
  p(hp)*匹配任何一个包含p,后面是多个或0个hp的字符串

  3.预定义字符范围

  [:alpha:]同[a-zA-Z]
  [:alnum:]同[a-zA-Z0-9]
  [:cntrl:]匹配控制字符,比如制表符,反斜杠,退格符
  [:digit:]同[0-9]
  [:graph:]所有ASCII33~166范围内可以打印的字符
  [:lower:]同[a-z]
  [:punct:]标点符号
  [:upper:]同[A-Z]
  [:space:]空白字符,可以是空格、水平制表符、换行、换页、回车
  [:xdigit:]十六进制符同[a-fA-F0-9]

  废话不多说,直接上我的源码吧,有什么不懂的可以上百度查查.  

  1. <?php  
  2. header("Content-type: text/html; charset=utf-8");  
  3. getinfo("http://rss.sina.com.cn/rollnews/news/gn_total.js",1);  
  4. getinfo("http://rss.sina.com.cn/rollnews/news/gj_total.js",2);  
  5. getinfo("http://rss.sina.com.cn/rollnews/news/sh_total.js",3);  
  6. getinfo("http://rss.sina.com.cn/rollnews/sports/sports_total.js",4);  
  7. getinfo("http://rss.sina.com.cn/rollnews/tech/tech1_total.js",5);  
  8. getinfo("http://rss.sina.com.cn/rollnews/finance/finance1_news_total.js",6);  
  9. getinfo("http://rss.sina.com.cn/rollnews/ent/ent_total.js",7);  
  10. getinfo("http://rss.sina.com.cn/rollnews/jczs/jczs_total.js",8);  
  11. function getinfo($infourl,$catid)  
  12. {  
  13.     $pagecontent=getwebcontent($infourl);  
  14.     preg_match_all("/title:\"(.*?)\"/"$pagecontent$match);  
  15.     $titlearr=$match[1];  
  16.     preg_match_all("/link:\"(.*?)\"/"$pagecontent$match);  
  17.     $urlarr=$match[1];  
  18.     for ($i=1;$i<count($urlarr);$i++){  
  19.         echo "go {$titlearr[$i-1]}\n";  
  20.         $title=iconv("gbk","utf-8",$titlearr[$i-1]);  
  21.         $content=iconv("gbk","utf-8",getnewscontent($urlarr[$i]));  
  22.         $content=mysql_escape_string($content);  
  23.         if(!insertdb($title,$content,$catid)) break;  
  24.     }  
  25. }  
  26. function insertdb($title,$content,$catid){      
  27.     将数据写入你的库  
  28. }  
  29. function getnewscontent($newsurl){  
  30.     $newscontent=getwebcontent($newsurl);  
  31.     preg_match_all("/<div class=\"blkContainerSblkCon\" id=\"artibody\">([\s\S]*?)<!-- publish_helper_end -->/",$newscontent,$match);  
  32.     $content=preg_replace("/<a.*?<\/a>/si","",$match[1][0]);  
  33.     $content=preg_replace("/<div style=\"overflow:hidden;zoom:1;\" class=\"otherContent_01\">.*?<\/div>/si","",$content);  
  34.     $content=preg_replace("/<div class=\"blk-video\">.*?<div class=\"clearcl\"><\/div>/si","",$content);  
  35.     $content=str_replace("<div style=\"clear:both;height:0;visibility:hiddden;overflow:hidden;\"></div>","",$content);  
  36.     return $content;  
  37. }  
  38. function getwebcontent($url){  
  39.     $ch = curl_init();  
  40.     $timeout = 10;  
  41.     curl_setopt($ch, CURLOPT_URL, $url);  
  42.     curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);  
  43.     curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout);  
  44.     curl_setopt ($ch, CURLOPT_FOLLOWLOCATION, 1);  
  45.     $contents = trim(curl_exec($ch));  
  46.     curl_close($ch);  
  47.     return  $contents;  
  48. }  
  49. ?> 

  然后如何实现比较实时的同步呢,这可以利用windows下的任务计划或linux下的crontab 了,定时(比如十分钟)执行这个程序,这样,你就不再愁网站没有内容了,哈哈,另外本人开了个工作室www.beijingjianzhan.com(北 京建站),我们开发了一个系统,不仅能够采集信息,而且能自动地进行再加工,进行伪原创,这样就更符合搜索引擎的品味了,让你的网站疯狂地被收录吧,另外 可以加我的Q376504340讨论技术性话题.

    顶一下
    (2)
    66.7%
    踩一下
    (1)
    33.3%
    【责任编辑:绝口不提】 标签:
    最新评论 查看所有评论
    发表评论 查看所有评论
    请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
    评价:
    表情:
    用户名:密码:验证码: