php 爬蟲采集


概述

現在爬蟲技術算是一個普遍的技術了,各個語言的爬蟲百家爭鳴,但是根據筆者自己的感覺還是python是主流。爬蟲涉及到太多的東西,筆者並不是專業的爬蟲工程師,只不過個人興趣分享一下。由於筆者是php工作,所以就使用php來進行簡單爬蟲。不過我的方法應該是很通用的,我相信java,C#等肯定有類似的函數,然后做法其實都一樣了。

技術准備
看懂這段代碼你需要對php的正則表達式函數以及正則表達式有一定的理解。

代碼   注意實際代碼就這么多

<?php

//這個是你網頁正則匹配出來的字符串

$str = '<div class="title">
    <h3><span>[小組] </span>&nbsp;<a href="鏈接內容1" target="_blank">標簽內容1</a></h3>
    <div class="info">
    237059 成員
    </div>
    </div>
    <div class="title">
    <h3><span>[小組] </span>&nbsp;<a href="鏈接內容2" target="_blank">標簽內容2</a></h3>
    <div class="info">
    237059 成員
    </div>
    </div>';

//這個是正則的輸出結果

preg_match_all('/<div class="title">[\s\S]*?<h3>[\s\S]*?<a href="(.*?)"[\s\S]*?>(.*?)<\/a>/',$str,$match);

print_r($match);//根據打印的結果很明白了吧

//這個方法就是抓取網頁內容的方法了可以吧需要抓取的頁面傳進去,然后正則匹配內容哦

function getUrlContent($url){//通過url獲取html內容

  $ch = curl_init();
  curl_setopt($ch,CURLOPT_URL,$url);
  curl_setopt($ch,CURLOPT_USERAGENT,"Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1 )");
  curl_setopt($ch,CURLOPT_HEADER,1);
  curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);
  $output = curl_exec($ch);
  curl_close($ch);
  return $output;
}
?>

到這里就可以匹配你想要的數據了,如果還是不懂,就繼續往下瞅瞅
流程圖


                                    

 

 


簡單的爬蟲,特殊字符處理就不進行了,保證插入數據庫不出錯就行了

思路
首先getUrlContent($url)函數,只需要穿一個url地址就行了,當然了因為各個網站都有反扒機制,不過筆者的這個函數並不是萬能的,但是在豆瓣測試過,其他網站大家自行測試了。
任何網站都可以理解為一個很長的字符串,如果對html有研究無非就是:
<html>

  <head>XXX</head>
  <body>XXX</body>
</html>
我們需要的只是將body標簽里的東西拿出來,筆者模擬了一段body里的代碼

<html>
   <head>XXX</head>
   <body>
   <div class="title">
   <h3><span>[小組] </span>&nbsp;<a href="鏈接內容1" target="_blank">標簽內容1</a></h3>
   <div class="info">
   237059 成員
   </div>
   </div>
   <div class="title">
   <h3><span>[小組] </span>&nbsp;<a href="鏈接內容2" target="_blank">標簽內容2</a></h3>
   <div class="info">
   237059 成員
   </div>
   </div>
   </body>
</html>
對於這段代碼,可以理解為一個很長的字符串

$str = '<html>
     <head>XXX</head>
  <body>
  <div class="title">
  <h3><span>[小組] </span>&nbsp;<a href="鏈接內容1" target="_blank">標簽內容1</a></h3>
  <div class="info">
  237059 成員
  </div>
  </div>
  <div class="title">
  <h3><span>[小組] </span>&nbsp;<a href="鏈接內容2" target="_blank">標簽內容2</a></h3>
  <div class="info">
  237059 成員
  </div>
  </div>
  </body>
</html>';

對這段字符串,只需要進行正則匹配拿出你想要的,假如需要a標簽里的href與內容

preg_match_all('/<div class="title">[\s\S]*?<h3>[\s\S]*?<a href="(.*?)"[\s\S]*?>(.*?)<\/a>/',
$str,$match);


然后如果你不認識這段正則表達式還有preg_match_all函數,這里筆者就簡單說下了,[\s\S]*?代表懶惰匹配任意字符,因為標簽之間會用空格符換行符,這里又出現新問題什么叫懶惰匹配,簡單來說就是匹配最少的內容。(.*?)代表非空字符,加括號的原因簡單來說就是括號里的內容是你想要的,前面的[\s\S]*?匹配到的是一堆特殊符號,並沒有什么作用,你不用把特殊符號記錄下來,所以不加括號。

最后打印結果,也就是$match數組。

Array
(
[0] => Array
(
  [0] => <div class="title">
    <h3><span>[小組] </span>&nbsp;<a href="鏈接內容1" target="_blank">標簽內容1</a>
  [1] => <div class="title">
    <h3><span>[小組] </span>&nbsp;<a href="鏈接內容2" target="_blank">標簽內容2</a>
)

[1] => Array
(
  [0] => 鏈接內容1
  [1] => 鏈接內容2
)

[2] => Array
(
  [0] => 標簽內容1
  [1] => 標簽內容2
)

)
根據這個數組,需要什么自己遍歷數組,然后拼裝sql語句,插入到自己的數據庫中即可。但是插入過程中可能會有一些單引號雙引號搗亂,所以你用str_replace()把他們替換掉,或者加轉義符號。

總結
只是針對php進行的簡單爬蟲,不過爬蟲的思路我相信很多種語言都用得到。不過很多網站的內容是通過js返回的,或者需要登陸才能獲取到數據,這些比較高級的部分,有興趣的推薦自學python爬蟲。

本文轉載自https://blog.csdn.net/qq_35370923/article/details/82901220


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM