- UID
- 2
- 积分
- 2892617
- 威望
- 1396340 布
- 龙e币
- 1496277 刀
- 在线时间
- 13326 小时
- 注册时间
- 2009-12-3
- 最后登录
- 2024-12-25
|
如何DIY一个全文输出的RSS订阅源
- 平时有过想法,不过技术一般,没有实现,上周在网上偶然发现一个朋友做的站点,就是全文输出的一些经典的网站和资讯贴。如获至宝,学了一周,同时多次麻烦大咖,终于在这两天成功学到基础的东西,可以做出一些基本的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/
- 需要说明的是并不是所有的网站都能做的,有些网站编码乱的厉害,导致乱码一堆,有些网站模板也有好多,随机使用,也导致我们没法提取。
复制代码 |
论坛官方微信、群(期货热点、量化探讨、开户与绑定实盘)
|