PHP采集程序原理分析篇

由於需要,要寫一個簡單的PHP采集程序,照例是到網上找瞭一堆教程,然後照貓畫虎,可是發現網上的教程全是似是而非,沒有一個真正能用的。苦想瞭幾天,終於弄明白瞭裡面的道理。在這裡寫出來,請高手指正。

采集程序的思路很簡單,無非就是先打一個頁面,一般都是列表頁,取得裡面全部鏈接的地址,然後打開逐條鏈接,尋找我們感興趣的東西,如果找到,就把它入庫或別的處理。下面以一個很簡單的例子來說說。

首先確定一個采集頁,一般就是列表面瞭。這裡目標是:/article/11/index.htm。這是一個列表頁,我們的目的就是采集這個列表頁上全部的文章。有列表頁瞭,第一步先打開它,把它的內容納入到我們的程序中來。一般用fopen或是file_get_contents這兩個函數,我們這裡用fopen作例子。怎麼打開它呢?很簡單:$source=fopen("[url=/article/11/index.htm",]/article/11/index.htm",r[/url]);實際上已經把內容納入到我們的程序中來瞭。註意得到的$source是一個資源,不是可處理的文本,所以再用函數fread將內容讀到一個變量中,這次就是真正的可編輯的文本瞭。例子:

$content=fread($source,99999);後面的數字表示字節數,填個大的就行。你用file_put_contents將$content寫入到一個文本文件,可以看出裡面的內容其實就是網頁的源碼。得到瞭網頁的源碼,我們就要分析裡面的文章鏈接地址,這裡要用到正則表達式瞭,[推薦正則表達式教程(https://www.aiwalls.com/article/7/all/545.1.htm)]。通過查看源代碼,我們可以看到裡面文章的鏈接地址全是這個樣子<p class="in_arttitle"><a href="https://www.aiwalls.com/article/10/all/273.1.htm">  將數據庫連接代碼封裝在函數裡,在需要讀取時調用..</a>

 

我們就可以寫正則表達式瞭。$count=preg_match_all("/<p class="in_arttitle"><ashref="(.+?)">(.+?)</a>/",$content,$art_list);

 

其中數組$art_list[1][$s]裡面包含的就是某個文章的鏈接地址。而$art_list[2][$s]包含的就是某一文章的標題。到瞭這一步就可以算成功瞭一半瞭。

接著用for循環依次打每個鏈接,然後像取得標題一樣的方法取得內容即可。以上這些和我在網上找的教程都差不多,但是到瞭這個for循環網上的教程可就差勁,還沒找到一篇可以說清這個事的文章,剛開始我是用js來幫助循環的,還是用實例說吧,剛開始我是這樣做的:
for($i=0;$i<20;4i++ {

中間就是采集內容的部分瞭,省略瞭

采集瞭一頁,肯定要采集再一頁啊
可是再用fopen打開鏈接時就不行瞭。請求失敗什麼的,用js也不行,最後才知道要用這句echo "<META HTTP-EQUIV=REFRESH CONTENT=0;URL=aa.php?id=1>";其中aa.php就是我們的程序的文件名, id後面的數字就可以幫助我們實現循環,采集多個頁面。這就是能真正循環起來的關鍵
}
腦子有點難受,寫得有點亂,將就著看吧,在高手看來這可能沒什麼大不瞭的,可是對於我等菜鳥來說,實在是很有幫助。
 

發佈留言