过期域名预定抢注

 找回密碼
 免费注册

從0開始學採集------中級篇:使用Curl抓取網頁內容

 火... [複製鏈接]
發表於 2014-10-29 21:58:04 | 顯示全部樓層 |閱讀模式
本帖最後由 kevinmy 於 2014-10-29 22:05 編輯
7 ~1 Q( {, j/ E% F8 I  C: X8 k4 M; h& E/ K6 l
前言:/ q& q) d5 E; `
在初級篇和中級篇之前期準備我們介紹了利用火車頭採集內容並發佈到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庫」並在帖中貼出了兩者
% j+ Z) Y& w! U+ M- G, t. Y讀取google.com首頁的效率對比。mulao的說法是正確的,curl和file_get_contents對比起來,不僅是效率高,同時它還支持很多協議,如HTTP、FTP、TELNET等,用curl還可以完成一些高難度任務,比如:處理coockies、驗證、表單提交、文件上傳等等。file_get_contents相比較起來只有一個簡單、讓新手樹立信心的優勢了,不知道昨天的3行採集程序有多少人去實驗了?好,今天我們正式開始中級篇:使用Curl抓取網頁內容7 Y+ C, k% E6 K/ u9 ~* R2 _

/ }4 B' T* R' U0 k$ h0 W在學習更為複雜的功能之前,先來看一下在PHP中建立curl請求的基本步驟:/ H# ^7 w! ?: V3 {
1.初始化
, n6 M8 f" l' @* R3 ?" e+ E2.設置變量% C  D" y9 [# i2 H
3.執行並獲取結果
- Z: i8 N9 A4 l# p( V, v4.釋放curl句柄0 u- K/ P2 z1 D5 a! e# n2 i5 N9 }
7 {1 I8 n. Y7 I
以下為採集TGL帖子列表的代碼:
( }1 r+ {$ i$ _( p  d/ F5 e0 Q<?php   i: x" L5 j, n6 u: m5 A1 x
set_time_limit(0);//設置程序執行時間 5 X/ J8 t- y5 [5 _
header("Content-Type: text/html; charset= utf-8"); //設置頁面的編碼,不設置會亂碼
$ d, C1 t6 ^1 W6 v1 c0 o2 {( K5 s% k
$url="http://www.luosuo.net/old/forum-4-1.html"; 9 C( g2 J" J( F7 ~! P- i/ I+ l9 {
$ch = curl_init($url);//初始化
1 E5 U. A0 P1 T: ]1 ~* u  \curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);//返回的內容我們是作為變量儲存, 而不輸出,所以這裡選1.
  u  i. ^! l4 \/ `! F: Y) I0 ]$contents = curl_exec($ch);// 運行cURL,請求網頁 $ {: c" O( \- o, r+ A
preg_match_all('{<a href="([^"]+)" class="xst" >(.*)</a>}',$contents,$matches);//正則匹配想要的內容 ; h/ o* {0 S, P" @6 K, r
curl_close($ch);// 關閉URL請求
0 \2 r, _3 W' P# J9 ], t& O8 Z( ~" E. j6 o1 k+ |6 ~3 M
for ($i=0;$i<count($matches[1]);$i++)//for循環結構很常用,這裡的作用是循環記錄總數的的次數,每次循環中可以任意處理採集到的內容 4 z  _9 n/ d$ m! T0 i. V
{ 7 Y0 u, q  {' O) N
$title = $matches[2][$i]; 6 ?$ ^. q8 R. L% n; b
$geturl = $matches[1][$i]; 7 l9 ^2 L: ~5 h
echo "我要的標題是:" . $title. "<br/>" . "對應的網址是:" . $geturl . "<br/><br/><br/>"; ( }7 i2 m1 z6 z+ m" N& e
} ( n& B" f5 s7 {" p! {
?>
* a" ~( f% h( B# ]
/ R6 n1 h- b& w
代碼運行的結果如下:" Q( Q0 j: @5 U8 u& W$ u# P$ z

, @  f+ F5 k1 s# y aa.png & m: M, k; r/ g: C) Q2 i
  ~* p( \) C7 @! e
要點:0 V/ ~; [6 A* u7 c

9 x) l+ N$ r! v1 F9 u1.在curl這段代碼中 curl_setopt() )最為重要,通過參數指定URL請求的各個細節來實現一些複雜的功能,但由於參數眾多,要一次性看完並理解也比較困難,所以今天我們只用了這一個選項,curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);這裡的參數我們設置為1或者true的原因是,返回的內容我們要作為變量儲存, 而不直接輸出到屏幕上。( K5 o& Y' a( c5 N4 \& v

. s0 s1 r7 ?0 C1 R4 P2. preg_match_all這段正則匹配,想要學好採集,正則是必須學會的。這個一句兩句說不清,請百度搜索:正則表達式,有很多教程。& s- _" a. L7 _% x% {: y0 P2 S

1 E) z2 R7 u4 P: R3.for循環讀出數組內的內容。這個結構在採集中經常用到的。) B3 Q" Z7 Q( }- i* o
4 h* s; L/ q( g; ]  Z# g& o

# e# A" U- o$ a) _6 D; u2 Y今天的教程好像解釋的不清楚,也不知道該寫點什麼,可能還是因為本人水平有限,無法簡單易懂的說明原理。有問題回帖吧6 p0 h% y; o/ B

* y! n" H  G+ K( \
& o/ g5 Z+ I0 ]  F6 ~) i3 c, S! E" O
6 S& T1 ~0 J  O5 f

8 `2 ]  {0 P5 q; \' L7 o, ^; _9 v" t5 u5 n4 n4 v! p9 K) q
+ @3 r& A$ k1 n  |5 Z
9 l* t* }( ^- B0 U# [
9 u2 n( b# q. G8 _1 E) c7 f( q

評分

參與人數 14點點 +51 收起 理由
采姑娘的小蘑菇 + 1 这个很强大,不会php的我都看懂了.
useejack + 1 谢谢分享!
ebookyx + 1
Rick + 1 谢谢分享!
1988chg + 1
minlab + 2 有見地
xx19941215 + 1 楼主好牛
ryan2101 + 1
月光飞燕 + 30
Leeker + 1 打赏点辛苦钱
youdy17 + 1 送花花~~~
乐乐 + 5 很不错
roror999 + 3 必须加币,必须的!
wawylysys + 2 鼓勵

查看全部評分

回復

使用道具 舉報

發表於 2014-10-29 22:37:28 | 顯示全部樓層
樓主也會PHP,不會PHP程序員出身吧。現在不用上班了吧
# E* d$ h9 d6 a" e; K6 L
回復 给力 爆菊

使用道具 舉報

發表於 2014-10-29 22:42:01 | 顯示全部樓層
謝謝分享~~~~~~~~~~~~~~~~~~~~~~~% n/ |! R! f- k3 Y! }1 F5 x0 }3 P
回復 给力 爆菊

使用道具 舉報

發表於 2014-10-29 22:49:08 | 顯示全部樓層
感謝樓主分享,期待後續大作
, L+ B% ~1 W; m5 b0 t" g% I
回復 给力 爆菊

使用道具 舉報

發表於 2014-10-29 23:56:25 | 顯示全部樓層
這個可以收藏下。。;。& ^' m, p( O3 L$ M8 C: v
回復 给力 爆菊

使用道具 舉報

發表於 2014-10-30 00:03:01 | 顯示全部樓層
占座 學習                                                         
5 j8 b! j" Y4 a4 {$ x" i; d$ p
回復 给力 爆菊

使用道具 舉報

發表於 2014-10-30 00:22:26 來自手機 | 顯示全部樓層
謝謝樓主分享,我就懂點PHP::::" k& \6 P2 i7 K, _; e) D
回復 给力 爆菊

使用道具 舉報

發表於 2014-10-30 00:22:41 | 顯示全部樓層
mark   學習                                 ' ^8 j/ E  \2 R% Z
回復 给力 爆菊

使用道具 舉報

發表於 2014-10-30 10:42:42 | 顯示全部樓層
前排占座,  好好學習. v$ C1 z- e! o2 [+ e, E* T
回復 给力 爆菊

使用道具 舉報

發表於 2014-10-30 10:55:33 | 顯示全部樓層
$i<count($matches[1]);    這個count()是個函數嗎?
- v" x- u  ^( i5 t
回復 给力 爆菊

使用道具 舉報

您需要登錄後才可以回帖 登錄 | 免费注册

本版積分規則

过期高净值品牌域名预定抢注

點基跨境 數位編輯創業論壇

GMT+8, 2025-7-11 15:05

By DZ X3.5

小黑屋

快速回復 返回頂部 返回列表