Board logo

标题: 如何DIY一个全文输出的RSS订阅源 [打印本页]

作者: 龙听    时间: 2017-7-15 11:52     标题: 如何DIY一个全文输出的RSS订阅源

  1. 平时有过想法,不过技术一般,没有实现,上周在网上偶然发现一个朋友做的站点,就是全文输出的一些经典的网站和资讯贴。如获至宝,学了一周,同时多次麻烦大咖,终于在这两天成功学到基础的东西,可以做出一些基本的RSS全文订阅的资源来。这里说一下基本的原理。主要有两个文件,第一个是提取网页内容的PHP文件(一篇文章大体上可分三个内容:链接,标题与内容),第二个是将这提取的文件按RSS标准写出,并形成XML文件,以供订阅。
  2. 第一个文件:gethtml 是一个固定文件,平时几乎不用管它。
  3. 第二个文件:space文件是要修改的文件,它会将第一个提取出的文件转换成XML标准格式。平时主要修改的也就是这第二个了。
  4. 下面是部分源码:
  5. <?php
  6. include "gethtml.php";
  7. $regex_link = '#(?<=</a>] <a href=").+?(?=")#s';
  8. $regex_tit = '#(?<=<!--jrj_final_title_start-->)(.+?)(?=<!--jrj_final_title_end-->)#s';
  9. $regex_con = '#(?<=<div class="texttit_m1">).*?(?=<!--爱投顾 begin -->)#s';
  10. $header='<?xml version="1.0" encoding="gb2312"?><rss version="2.0"><channel><title>滚动新闻-金融街</title>';
  11. $footer='</channel></rss>';
  12. $html=gethtml('http://futures.jrj.com.cn/list.shtml');
  13. if(preg_match_all($regex_link, $html, $links)){
  14.   $size=10;
  15.   for($i=0;$i<$size;$i++){
  16.     $link=$links[0][$i];
  17.     $content=gethtml($link);
  18.     preg_match($regex_con,$content,$article);
  19.     preg_match($regex_tit,$content,$title);
  20.     $rss.='<item><title>'.$title[0].'</title><link><![CDATA['.$link.']]></link><description><![CDATA['.$article[0].']]></description></item>';
  21.   }
  22.   file_put_contents('list.xml',$header.$rss.$footer);
  23. }
  24. ?>

  25. 下面分析如何修改:
  26. 主要修改的是这么几个地方:
  27. $regex_link是提取超级链接地址,$regex_tit 是提取文章标题,$regex_con 是提取文章内容。后面是用正规则写的,不会可以在网上搜。具体说明一下:
  28. (1)=后面的''是一定要有的,要是列表里面地址用“”,要是列表里地址用‘’,最外面的就要用“”,这里全都是英文状态下的。说白就是单双引号一定要分开,要是列表的地址用单引号,这外面就得改为双引号。
  29. (2)##是正规则的表示,是告诉文件这里面是正规则内容。
  30. (3)?<= 是截取左边的地址的标志符,是不包括这些的。比方说 abcdefg  ,  要是写?<=bc  ,那么就是从d开始截取defg。同理?=就是截取时右边的字符结束位置,也是不包括这个字符的。比方说 ?=e ,就是截取到abcd
  31. (4).+?是从左边截取时第一个出现的右边的这个字符串为止这一段字符,比方说我这个网址: http://rssft.com   正规则 (?<=http://).+?(?=.com)  截取出来的就是rssft
  32. (5).+? 与.*? 这两个的区别,第一个是一个或很多,第二个是没有或很多。(.*?) 是懒惰匹配,一旦匹配到第一个就不往下走了。(.+?)是无限匹配直到最后一个。不懂的可以百度。下面是我写的金融街的一个提取正规则,地址:http://rssft.com/?thread-53.htm 可以好好理解一下各是什么意思。

  33. $regex_link = '#(?<=</a>] <a href=").+?(?=")#s';
  34. $regex_tit = '#(?<=<!--jrj_final_title_start-->)(.+?)(?=<!--jrj_final_title_end-->)#s';
  35. $regex_con = '#(?<=<div class="texttit_m1">).*?(?=<!--爱投顾 begin -->)#s';
  36. 然后是这里:
  37. $header='<?xml version="1.0" encoding="gb2312"?><rss version="2.0"><channel><title>滚动新闻-金融街</title>';
  38. XML的编码,要跟文章内容页的编码一致,要不的话会出现乱码。后面是这个XML的标题,改成自己的。
  39. 然后:
  40. $html=gethtml('http://futures.jrj.com.cn/list.shtml');
  41. 改成要做的那个列表地址。
  42. 最后:
  43. $link=$links[0][$i];
  44. 这个地址也是一个麻烦的地方。要是截取的是绝对地址,就按我上面写的,要是取的是相对地址,就要改一下,比方说取的地址是a.html  b.html 这时就要加上域名的地址。如下:
  45.     $link='http://rssft.com/'.$links[0][$i];
  46. 这样输出时地址就换成http://rssft.com/a.html   和http://rssft.com/b.html 了。

  47. 最最后说明一点是有些朋友可能做出的XML文件订阅时显示XML标题乱码,这是因为源地址列表与你保存的PHP编码不同导致的,要是列表是UTF-8,保存PHP文件时就可以用UTF-8,要是源文件是GBK ,GB2312 类似的,保存PHP时就要选择的语言是ANSI。一个小技巧吧。

  48. 到现在做好XML后就要放到网站上面了,要能支持PHP环境的网站,有IP地址或域名访问的。然后用第二文件地址打开,就生成并刷新XML了,将这个XML的网址加到订阅阅里面就能阅读了。平时隔段时间刷新那个PHP文件就能随时更新XML资讯了。两个途径,一是在服务器上面做定时计划,定时访问PHP文件,另一个是用这个网站,定时访问你的栏目php文件,地址:https://cron-job.org/

  49. 需要说明的是并不是所有的网站都能做的,有些网站编码乱的厉害,导致乱码一堆,有些网站模板也有好多,随机使用,也导致我们没法提取。
复制代码





欢迎光临 龙听期货论坛 (http://www.qhlt.cn/) Powered by Discuz! 7.2