使用curl和正規表示式抓取網頁數據

WBOY
發布: 2016-07-25 08:48:28
原創
1456 人瀏覽過
利用curl和正規表示式做的一個針對磨鐵中文網非vip章節的小說抓取器,支援輸入小說ID下載小說。
依賴項:curl
可以簡單的看下,裡面用到了curl ,正規表達式,ajax等技術,適合新手看看。在本地測試,必須保證聯網並且確保php開啟curl的mode.
  1. session_start();
  2. //封裝成類開啟這些自動抓取文章
  3. #header("Refresh:30;http:/ /www.test.com:8080");
  4. class SpiderTools{
  5. /////////////////////////////// ////////////////////////////////////////////////// //////////////////////////
  6. /*傳入文章ID 解析出文章標題*/
  7. ////// ////////////////////////////////////////////////// //////////////////////////////////////////////////
  8. public function getBookNameById($aid){
  9. //初始化curl
  10. $ch= curl_init();
  11. //url
  12. $url='http://www.motie.com /book/'.$aid;
  13. if(is_numeric($aid)){
  14. //正規表示式符合
  15. $ru="/s*(.*)s*s*/";
  16. }
  17. else{
  18. //殭屍爆發之全家求生路_第一章殭屍爆發為吾友愛樂兒更新~_磨鐵
  19. $ru="/(.*)/";
  20. }
  21. //設定選項,包括網址
  22. curl_setopt($ch, CURLOPT_URL, $url);
  23. curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);//不自動輸出內容
  24. curl_setopt($ch, CUR-LO 0);//不回傳頭部訊息
  25. curl_setopt($ch, CURLOPT_CONNECTTIMEOUT_MS, 0);
  26. //執行curl
  27. $output = curl_exec($ch);
  28. //錯誤提示
  29. if(curl_exec($ch) === false){
  30. die(curl_error($ch));
  31. }
  32. // 檢查是否有錯誤發生
  33. if(curl_errno($ch )){
  34. echo 'Curl error: ' . curl_error($ch);
  35. }
  36. //釋放curl句柄
  37. curl_close($ch);
  38. $arr=array();
  39. preg_match_all($ru,$output,$arr);
  40. return $arr[1][0];
  41. }
  42. //////////////// ////////////////////////////////////////////////// /////////////////////////////////////////
  43. /*傳入文章ID解析文章內容*/
  44. ////////////////////////////////////////// ////////////////////////////////////////////////// //////////////
  45. public function getBookContextById($aid){
  46. //開始解析文章
  47. $ids=array();
  48. $ids=explode ("_",$aid);
  49. $titleId=trim($ids[0]);
  50. $aticleId=trim($ids[1]);
  51. $ch= curl_init();
  52. $ru="/
    [sS]*
    [sS]*(.*)<img  src="/ajax/chapter/%24titleId/%24aticleId" class="hidden" alt="使用curl和正規表示式抓取網頁數據" >
    登入後複製
    /ui";
  53. $url='http://www.motie.com/book/'.$aid;
  54. //正規表示式符合
  55. //設定選項,包括URL
  56. curl_setopt ($ch, CURLOPT_URL, $url);
  57. curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);//不自動輸出內容
  58. curl_setopt($ch, CURLOPT_HEADER, 0); 🎜> curl_setopt($ch, CURLOPT_CONNECTTIMEOUT_MS, 0);
  59. //執行curl
  60. $output = curl_exec($ch);
  61. //錯誤提示
  62. if(curl_exec($ch) ==== = false){
  63. die(curl_error($ch));
  64. }
  65. // 檢查是否有錯誤發生
  66. if(curl_errno($ch)){
  67. echo 'Curl error: ' . curl_error($ch);
  68. }
  69. $arr=array();
  70. $arr2=array();
  71. preg_match_all($ru,$output,$arr);
  72. curl_close($ch);
  73. #var_dump($arr);
  74. $s=$arr[0][0];
  75. $s=substr($s,180);
  76. $arr2 =explode("使用curl和正規表示式抓取網頁數據 return trim($arr2[0]);
  77. }
  78. //////////////// ////////////////////////////////////////////////// /////////////////////////////////////////
  79. /*靜態方法@生成小說檔案可以直接呼叫*/
  80. //////////////////////////////////////// ////////////////////////////////////////////////// ////////////////
  81. public static function createBookById($id){
  82. if(!is_numeric($id)){
  83. echo "
    INIT BEGIN START WRITE!";
  84. $st=new self();
  85. $cons=$st->getBookContextById($id);
  86. $title=$st-> getBookNameById($id);
  87. $cons=trim($cons);
  88. $t=explode(" ",$title);
  89. //建構目錄
  90. $dir=array();
  91. $dir=explode("_",$t[0]);
  92. $wzdir=$dir[0]; //書名作為目錄名稱
  93. $wzchapter=$dir[1]; //第幾章
  94. //建立目錄
  95. $wzdir2=iconv("UTF-8", "GBK", $wzdir);//目錄編碼注意這裡保留對$wzdir字串的引用,用來建構檔名,不能用此處,防止二次編碼
  96. if(!file_exists($wzdir2)){
  97. mkdir($wzdir2); //建立目錄
  98. }
  99. //建構檔名
  100. $wztitle="./".$wzdir."/"."$t[0]".".txt";
  101. //保證儲存的檔案名稱不是亂碼
  102. $wztitle=iconv("UTF-8", "GBK", $wztitle);
  103. $f=fopen($wztitle,"w ");
  104. fwrite($f,$cons) ;
  105. echo "$wzdir ".$wzchapter."寫入成功";
  106. fclose($f );
  107. }
  108. else{
  109. $ids=self::getBookIdsById($id);
  110. //這裡伺服器可能會斷線,所以最好用session記錄迴圈
  111. #for($i=$_SESSION["$id"."_fid"];$i
  112. #self::createBookById($id."_".$ids[$_SESSION["$id"."_fid"] ]);//建構id
  113. #}
  114. for($i=$_SESSION["$id"."_fid"];$i
  115. self::createBookById($id."_".$ids[$i]);//建構id
  116. }
  117. #echo "


    寫入工作全部完成

    ";
  118. #echo $id."_".$ids[0]."
    ";
  119. #var_dump($ids) ;
  120. }
  121. }
  122. /*
  123. 取得小說的所有ID
  124. @param $id 文章ID
  125. @return array;
  126. */
  127. public static function getBookIdsById($aid){
  128. $ch= curl_init();
  129. $url='http://www.motie.com/book/'.$aid."/chapter";
  130. //注意這裡的?可以取得最少匹配項
  131. $ru='/[sS]*?
  132. [sS]*?.*? .*?/u';//正規表示式符合
  133. //設定選項,包括URL
  134. curl_setopt($ch, CURLOPT_URL, $url);
  135. curl_setopt($ch, CURLOPT_RETURNTRANSFERRETURNTRANSFER , 1);//不自動輸出內容
  136. curl_setopt($ch, CURLOPT_HEADER, 0);//不回傳頭部資訊
  137. curl_setopt($ch, CURLOPT_CONNECTTIMEOUT_MS, 0);
  138. //執行curl
  139. $output = curl_exec($ch);
  140. // 檢查是否有錯誤發生
  141. if(curl_errno($ch)){
  142. echo 'Curl error: ' . curl_error($ch);
  143. }
  144. //釋放curl句柄
  145. curl_close($ch);
  146. $arr=array();
  147. preg_match_all($ru,$output,$arr,PREG_PATTERN_ORDER);
  148. return $arr[1];
  149. }
  150. }
  151. ?>
複製程式碼
  1. session_start();
  2. require_once("SpiderTools.class.php");
  3. if($_REQUEST["bid"]){"bid"]){
  4. if(is_numeric($_REQUEST["bid"])){
  5. SpiderTools::createBookById(trim($_REQUEST["bid"]));
  6. }
  7. else{ echo "
    請輸入正確的文章ID
    ";
  8. }
  9. }
  10. ?>
複製程式碼
複製程式碼
  1. 下載小說啦
  2. 輸入磨鐵中文網你想看到的小說ID號就可以下載小說啦

  • 複製程式碼


    來源:php.cn
    本網站聲明
    本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
    熱門教學
    更多>
    最新下載
    更多>
    網站特效
    網站源碼
    網站素材
    前端模板
    關於我們 免責聲明 Sitemap
    PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!