本帖最後由 kevinmy 於 2014-10-29 22:05 編輯
6 y# _# N- v# r2 K" w1 N$ F$ d+ Y6 _+ A! M
前言:: E; ?! N2 K! f8 R* t# i2 z
在初級篇和中級篇之前期準備我們介紹了利用火車頭採集內容並發佈到wordpress的過程(帖子地址:http://www.luosuo.net/old/thread-121090-1-1.html),也介紹如何在本機搭建PHP環境,在結尾處貼出了一個由3行代碼組成的最簡易的採集小程序(帖子地址:http://www.luosuo.net/old/thread-121117-1-1.html),帖子發出20多分鐘,就得到了朋友們的積極反饋,會員:mulao在回帖中提到「不建議使用file_get_contents採集,推薦使用php的curl庫」並在帖中貼出了兩者
% T3 `) j. R! V讀取google.com首頁的效率對比。mulao的說法是正確的,curl和file_get_contents對比起來,不僅是效率高,同時它還支持很多協議,如HTTP、FTP、TELNET等,用curl還可以完成一些高難度任務,比如:處理coockies、驗證、表單提交、文件上傳等等。file_get_contents相比較起來只有一個簡單、讓新手樹立信心的優勢了,不知道昨天的3行採集程序有多少人去實驗了?好,今天我們正式開始中級篇:使用Curl抓取網頁內容0 [, q U6 o- e$ d) Q+ U
; g6 \( E# s( k. D. `" O在學習更為複雜的功能之前,先來看一下在PHP中建立curl請求的基本步驟:3 w+ x' ]5 J/ t
1.初始化
5 `( t9 v1 j7 j$ o z: ^, ]% W2.設置變量
' V; B# x5 N4 a# \9 n/ m3.執行並獲取結果
+ \1 T& m5 b8 \* u1 \3 C4.釋放curl句柄% Q( k0 |$ |0 g0 s
. x4 }/ y. L9 g3 F8 Z
以下為採集TGL帖子列表的代碼:
8 n# T8 q% q$ D7 i$ ] Z<?php
/ u* N7 r1 j* y9 S, s6 `' l9 p, fset_time_limit(0);//設置程序執行時間
2 S' }# R6 H- ]% h: r& Eheader("Content-Type: text/html; charset= utf-8"); //設置頁面的編碼,不設置會亂碼 1 g, ]. f. k7 D2 w
& w/ `- f9 P6 s2 a$url="http://www.luosuo.net/old/forum-4-1.html"; 9 A: Z) D3 o6 I, g2 S. p
$ch = curl_init($url);//初始化 ) j6 ]8 j' y! b
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);//返回的內容我們是作為變量儲存, 而不輸出,所以這裡選1.
6 H$ o% h9 G& Q: ?( q: z; m$contents = curl_exec($ch);// 運行cURL,請求網頁 9 n$ B! l, a1 k4 X
preg_match_all('{<a href="([^"]+)" class="xst" >(.*)</a>}',$contents,$matches);//正則匹配想要的內容 ( s) W( Q0 q! H. ?8 t+ B0 k; e0 H
curl_close($ch);// 關閉URL請求 A% o1 M& e4 K
8 b4 @1 J1 w: a8 U" K
for ($i=0;$i<count($matches[1]);$i++)//for循環結構很常用,這裡的作用是循環記錄總數的的次數,每次循環中可以任意處理採集到的內容
& d, w* Z+ i ^; Y: I, i{
! p( n2 p& }0 h' ~1 W$title = $matches[2][$i];
- G' Z) `/ N) o1 A' Y/ Q! n$geturl = $matches[1][$i];
+ R( e/ m1 z- J" y+ N4 e" r7 ?% |7 ?echo "我要的標題是:" . $title. "<br/>" . "對應的網址是:" . $geturl . "<br/><br/><br/>";
# _& _; v: b/ m1 `} , J! r8 `$ A& r6 b
?># k+ z5 M% @# U# I" y
( Q5 }; n# _3 r! ^" r代碼運行的結果如下:: x! ~1 d) e7 e/ s% M
9 ` }4 q. Q$ Y
$ U+ l3 \, K. [' z k
- Y: j( ^' _8 W$ ~4 a
要點:
- Y. Z+ i+ U' ^# _7 f
( L: v7 n6 k! r% \* _1.在curl這段代碼中 curl_setopt() )最為重要,通過參數指定URL請求的各個細節來實現一些複雜的功能,但由於參數眾多,要一次性看完並理解也比較困難,所以今天我們只用了這一個選項,curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);這裡的參數我們設置為1或者true的原因是,返回的內容我們要作為變量儲存, 而不直接輸出到屏幕上。
( J- ^' O6 o+ }: b. q5 E' W, @ N/ k# R1 [$ W
2. preg_match_all這段正則匹配,想要學好採集,正則是必須學會的。這個一句兩句說不清,請百度搜索:正則表達式,有很多教程。4 K+ K7 I1 {. s' x' l+ u
& l" N, L' J! n5 v$ O; ` y
3.for循環讀出數組內的內容。這個結構在採集中經常用到的。1 v; P$ A0 t2 N r, J( W! J3 m
% n# s/ w/ c: ^8 K) T, U
5 Z4 Y0 K, Y7 ^/ M; o9 r. q
今天的教程好像解釋的不清楚,也不知道該寫點什麼,可能還是因為本人水平有限,無法簡單易懂的說明原理。有問題回帖吧
6 w6 J1 ?0 ~2 A5 `! J/ ]0 n" S" G" Z. C8 B! H
$ l" r [1 {5 K" \/ e( `& o# O q) R4 Q! S) Q3 w, r
. Z; x2 D2 R% ?6 U" v9 c$ d( \( P0 D+ S( p+ D9 {4 o% u
3 J, ], B, `( M' P& _
( R; f% @7 O* |+ j2 i4 p6 P( q! {/ Q& p% q
|