如何DIY一个全文输出的RSS订阅源
[code]平时有过想法,不过技术一般,没有实现,上周在网上偶然发现一个朋友做的站点,就是全文输出的一些经典的网站和资讯贴。如获至宝,学了一周,同时多次麻烦大咖,终于在这两天成功学到基础的东西,可以做出一些基本的RSS全文订阅的资源来。这里说一下基本的原理。主要有两个文件,第一个是提取网页内容的PHP文件(一篇文章大体上可分三个内容:链接,标题与内容),第二个是将这提取的文件按RSS标准写出,并形成XML文件,以供订阅。
第一个文件:gethtml 是一个固定文件,平时几乎不用管它。
第二个文件:space文件是要修改的文件,它会将第一个提取出的文件转换成XML标准格式。平时主要修改的也就是这第二个了。
下面是部分源码:
<?php
include "gethtml.php";
$regex_link = '#(?<=</a>] <a href=").+?(?=")#s';
$regex_tit = '#(?<=<!--jrj_final_title_start-->)(.+?)(?=<!--jrj_final_title_end-->)#s';
$regex_con = '#(?<=<div class="texttit_m1">).*?(?=<!--爱投顾 begin -->)#s';
$header='<?xml version="1.0" encoding="gb2312"?><rss version="2.0"><channel><title>滚动新闻-金融街</title>';
$footer='</channel></rss>';
$html=gethtml('http://futures.jrj.com.cn/list.shtml');
if(preg_match_all($regex_link, $html, $links)){
$size=10;
for($i=0;$i<$size;$i++){
$link=$links[0][$i];
$content=gethtml($link);
preg_match($regex_con,$content,$article);
preg_match($regex_tit,$content,$title);
$rss.='<item><title>'.$title[0].'</title><link><![CDATA['.$link.']]></link><description><![CDATA['.$article[0].']]></description></item>';
}
file_put_contents('list.xml',$header.$rss.$footer);
}
?>
下面分析如何修改:
主要修改的是这么几个地方:
$regex_link是提取超级链接地址,$regex_tit 是提取文章标题,$regex_con 是提取文章内容。后面是用正规则写的,不会可以在网上搜。具体说明一下:
(1)=后面的''是一定要有的,要是列表里面地址用“”,要是列表里地址用‘’,最外面的就要用“”,这里全都是英文状态下的。说白就是单双引号一定要分开,要是列表的地址用单引号,这外面就得改为双引号。
(2)##是正规则的表示,是告诉文件这里面是正规则内容。
(3)?<= 是截取左边的地址的标志符,是不包括这些的。比方说 abcdefg , 要是写?<=bc ,那么就是从d开始截取defg。同理?=就是截取时右边的字符结束位置,也是不包括这个字符的。比方说 ?=e ,就是截取到abcd
(4).+?是从左边截取时第一个出现的右边的这个字符串为止这一段字符,比方说我这个网址: http://rssft.com 正规则 (?<=http://).+?(?=.com) 截取出来的就是rssft
(5).+? 与.*? 这两个的区别,第一个是一个或很多,第二个是没有或很多。(.*?) 是懒惰匹配,一旦匹配到第一个就不往下走了。(.+?)是无限匹配直到最后一个。不懂的可以百度。下面是我写的金融街的一个提取正规则,地址:http://rssft.com/?thread-53.htm 可以好好理解一下各是什么意思。
$regex_link = '#(?<=</a>] <a href=").+?(?=")#s';
$regex_tit = '#(?<=<!--jrj_final_title_start-->)(.+?)(?=<!--jrj_final_title_end-->)#s';
$regex_con = '#(?<=<div class="texttit_m1">).*?(?=<!--爱投顾 begin -->)#s';
然后是这里:
$header='<?xml version="1.0" encoding="gb2312"?><rss version="2.0"><channel><title>滚动新闻-金融街</title>';
XML的编码,要跟文章内容页的编码一致,要不的话会出现乱码。后面是这个XML的标题,改成自己的。
然后:
$html=gethtml('http://futures.jrj.com.cn/list.shtml');
改成要做的那个列表地址。
最后:
$link=$links[0][$i];
这个地址也是一个麻烦的地方。要是截取的是绝对地址,就按我上面写的,要是取的是相对地址,就要改一下,比方说取的地址是a.html b.html 这时就要加上域名的地址。如下:
$link='http://rssft.com/'.$links[0][$i];
这样输出时地址就换成http://rssft.com/a.html 和http://rssft.com/b.html 了。
最最后说明一点是有些朋友可能做出的XML文件订阅时显示XML标题乱码,这是因为源地址列表与你保存的PHP编码不同导致的,要是列表是UTF-8,保存PHP文件时就可以用UTF-8,要是源文件是GBK ,GB2312 类似的,保存PHP时就要选择的语言是ANSI。一个小技巧吧。
到现在做好XML后就要放到网站上面了,要能支持PHP环境的网站,有IP地址或域名访问的。然后用第二文件地址打开,就生成并刷新XML了,将这个XML的网址加到订阅阅里面就能阅读了。平时隔段时间刷新那个PHP文件就能随时更新XML资讯了。两个途径,一是在服务器上面做定时计划,定时访问PHP文件,另一个是用这个网站,定时访问你的栏目php文件,地址:https://cron-job.org/
需要说明的是并不是所有的网站都能做的,有些网站编码乱的厉害,导致乱码一堆,有些网站模板也有好多,随机使用,也导致我们没法提取。
[/code]
页:
[1]