• 教程:RSS全文输出,自己动手做。(一)


    这里以PHP版为例,尽量说得通俗点吧,水平实在有限,见谅。

    目前我这里所有的获取全文输出的网站大概是三种情况:

    1. 要输出的内容集中在一页上,也就是看似列表页的页面里集中了你想要的所有内容,并不需要点击“更多”或“继续阅读”才能看到文章整体。比如糗事百科、wiki。
    2. 有列表页,要查看相应文章必须点击链接进入。
    3. json方式写入。特征就是查看源文件并不能找到你在浏览器中看到的内容。比如腾讯新闻图片(链接),它的真正内容在这(链接)。

    第一种最省事,第二种最常见,第三种稍麻烦。

    今天先讲第二种。

    以国家地理中文网宇宙空间为例(链接),先看代码:(把下列源码存为space.php)

    1. <?php
    2. include "gethtml.php";
    3. $regex_link = '/(?<=<dt><a href=").+?(?=")/s';
    4. $regex_tit = '/(?<=<title>)(.+?)(?= -)/s';
    5. $regex_con = '/<div id="detailMain_box_img".*?(?=<div class="M-L-article-last-p" >)/s';
    6. $header='<?xml version="1.0" encoding="utf-8"?><rss version="2.0"><channel><title>国家地理中文网宇宙空间</title>';
    7. $footer='</channel></rss>';
    8. $html=gethtml('http://www.nationalgeographic.com.cn/science/space/');
    9. if(preg_match_all($regex_link, $html, $links)){
    10. $size=count($links[0]);
    11. for($i=0;$i<$size;$i++){
    12. $link=preg_replace('/(.+)/','http://www.nationalgeographic.com.cn$1',$links[0][$i]);
    13. $content=gethtml($link);
    14. preg_match($regex_con,$content,$article);
    15. preg_match($regex_tit,$content,$title);
    16. $rss.='<item><title>'.$title[0].'</title><link><![CDATA['.$link.']]></link><description><![CDATA['.$article[0].']]></description></item>';
    17. }
    18. file_put_contents('space.xml',$header.$rss.$footer);
    19. }
    20. ?>

    重点是第8行往后。只解释我认为重要的,不明白的可以讨论。

    第2行,引入gethtml方法,来自下面的代码。

    看一下第8行gethtml(‘http://www.nationalgeographic.com.cn/science/space/’)得到了什么(链接),虽然有点乱,但是目的达到了,http://www.nationalgeographic.com.cn/science/space/ 我已经抓到本地服务器上。

    第9行是要挑出需要的链接 $links(链接

    第13行利用这些链接继续抓取页面 $content=gethtml($link)

    第14、15行从$content里查找需要的$title(文章标题)和$article(文章内容)

    后面就是按RSS要求的格式输出,并最终生成xml文件。

    上面我说的查找、挑出都是用正则来实现的,此外最好对html特别熟悉,操作起来才能得心应手。

    =================================================

    下面是在别人的基础上自己总结的利用curl抓取页面的方法,把下面源码存为gethtml.php,我所有的抓取都是用的这个方法,当然,省事的话可以用 file_get_contents,那就是真正的20行代码完成全文RSS输出了,不过可选的参数就没有了,有的页面会抓取不到。

    1. <?php
    2. error_reporting(E_ERROR);
    3. function gethtml($url,$json){
    4. $args = json_decode($json,true);
    5. $useragent = $args["useragent"]?$args["useragent"]:'Mozilla/5.0';
    6. $timeout = $args["timeout"]?$args["timeout"]:9000;
    7. $ch = curl_init();
    8. $options = array(
    9. CURLOPT_URL => $url,
    10. CURLOPT_USERAGENT => $useragent,
    11. CURLOPT_TIMEOUT_MS => $timeout,
    12. CURLOPT_NOSIGNAL => 1,
    13. CURLOPT_HEADER => 0,
    14. CURLOPT_RETURNTRANSFER => 1,
    15. CURLOPT_FOLLOWLOCATION => 1
    16. );
    17. if($args["ip"]){
    18. $options[CURLOPT_HTTPHEADER] = array('CLIENT-IP:'.$args["ip"],'X-FORWARDED-FOR:'.$args["ip"]);
    19. }
    20. if (preg_match('/^https/',$url)){
    21. $options[CURLOPT_SSL_VERIFYHOST] = 1;
    22. $options[CURLOPT_SSL_VERIFYPEER] = 0;
    23. }
    24. curl_setopt_array($ch, $options);
    25. $data = curl_exec($ch);
    26. $curl_errno = curl_errno($ch);
    27. curl_close($ch);
    28. if($curl_errno>0){
    29. return 'error';
    30. }else{
    31. return $data;
    32. }
    33. }
    34. ?>

     原文:http://www.rssfull.net/turorial160710

  • 相关阅读:
    HDU5343:MZL's Circle Zhou(SAM,记忆化搜索DP)
    动归皆背包——那些做过的背包
    CODEVS 3943 数学奇才琪露诺
    codevs 1540 银河英雄传说
    CODEVS 1004四子连棋
    洛谷1082 同余方程
    洛谷1006 传纸条
    洛谷1508 Likecloud-吃、吃、吃
    洛谷1108 低价购买
    洛谷1156 垃圾陷阱
  • 原文地址:https://www.cnblogs.com/wpbars/p/6437931.html
Copyright © 2020-2023  润新知