教程:RSS全文輸出,本身動手作。(一)

這裏以PHP版爲例,儘可能說得通俗點吧,水平實在有限,見諒。php

目前我這裏全部的獲取全文輸出的網站大概是三種狀況:html

  1. 要輸出的內容集中在一頁上,也就是看似列表頁的頁面裏集中了你想要的全部內容,並不須要點擊「更多」或「繼續閱讀」才能看到文章總體。好比糗事百科、wiki。
  2. 有列表頁,要查看相應文章必須點擊連接進入。
  3. json方式寫入。特徵就是查看源文件並不能找到你在瀏覽器中看到的內容。好比騰訊新聞圖片(連接),它的真正內容在這(連接)。

第一種最省事,第二種最多見,第三種稍麻煩。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行日後。只解釋我認爲重要的,不明白的能夠討論。app

第2行,引入gethtml方法,來自下面的代碼。curl

看一下第8行gethtml(‘http://www.nationalgeographic.com.cn/science/space/’)獲得了什麼(連接),雖然有點亂,可是目的達到了,http://www.nationalgeographic.com.cn/science/space/ 我已經抓到本地服務器上。網站

第9行是要挑出須要的連接 $links(連接url

第13行利用這些連接繼續抓取頁面 $content=gethtml($link)spa

第1四、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

相關文章
相關標籤/搜索