這次帶給大家PHP使用Curl實現模擬登入及抓取資料步驟詳解,PHP使用Curl實現模擬登入及抓取資料的注意事項有哪些,以下就是實戰案例,一起來看一下。
使用PHP的Curl擴充庫可以模擬實作登錄,並抓取一些需要使用者帳號登入以後才能查看的資料。具體實現的流程如下(個人總結):
1. 首先需要對對應的登入頁面的html原始碼進行分析,獲得一些必要的資訊:
(1)登入頁面的位址;
(2)驗證碼的位址;
(3)登入表單需要提交的各個欄位的名稱和提交方式;
(4)登入表單提交的位址;
(5)另外要知道要抓取的資料所在的位址。
2. 取得cookie並儲存(針對使用cookie檔案的網站):
$login_url = 'http://www.xxxxx'; //登录页面地址 $cookie_file = dirname(FILE)."/pic.cookie"; //cookie文件存放位置(自定义) $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $login_url); curl_setopt($ch, CURLOPT_HEADER, 0); curl_setopt($ch, CURLOPT_RETURNTRANSFER,1); curl_setopt($ch, CURLOPT_COOKIEJAR, $cookie_file); curl_exec($ch); curl_close($ch);
3. 取得驗證碼並儲存(針對使用驗證碼的網站):
$verify_url = "http://www.xxxx"; //验证码地址 $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $verify_url); curl_setopt($ch, CURLOPT_COOKIEFILE, $cookie_file); curl_setopt($ch, CURLOPT_HEADER, 0); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); $verify_img = curl_exec($ch); curl_close($ch); $fp = fopen("./verify/verifyCode.png",'w'); //把抓取到的图片文件写入本地图片文件保存 fwrite($fp, $verify_img); fclose($fp);
說明:
由於不能實現驗證碼的識別,所以我這裡的做法是,把驗證碼圖片抓取下來存放到本地文件中,然後在自己項目中的html頁面中顯示,讓使用者去填寫,等使用者填寫完帳號、密碼和驗證碼,並點選提交按鈕後再去進行下一步的操作。
4. 模擬提交登入表單:
$ post_url = 'http://www.xxxx'; //登录表单提交地址 $post = "username=$account&password=$password&seccodeverify=$verifyCode";//表单提交的数据(根据表单字段名和用户输入决定) $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $ post_url); curl_setopt($ch, CURLOPT_HEADER, false); curl_setopt($ch, CURLOPT_RETURNTRANSFER,1); curl_setopt($ch, CURLOPT_POSTFIELDS, $post); //提交方式为post curl_setopt($ch, CURLOPT_COOKIEFILE, $cookie_file); curl_exec($ch); curl_close($ch);
5. 抓取資料:
$data_url = "http://www.xxxx"; //数据所在地址 $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $data_url); curl_setopt($ch, CURLOPT_HEADER, false); curl_setopt($ch, CURLOPT_HEADER, 0); curl_setopt($ch, CURLOPT_RETURNTRANSFER,0); curl_setopt($ch, CURLOPT_COOKIEFILE, $cookie_file); $data = curl_exec($ch); curl_close($ch);
到目前為止,已經把資料所在地址的這個頁面都抓取下來存儲在字串變數$data中了。
要注意的是抓取下來的是一個網頁的html原始碼,也就是說這個字串中不僅包含了你想要的數據,還包含了許多的html標籤等你不要的東西。所以如果你想要從中提取出你需要的資料的話,你還要對存放資料的頁面的html程式碼進行分析,然後結合字串操作函數、正規匹配等方法從中提取出你想要的資料。
以上方法對使用http協議的一般網站是有效的。但如果你要模擬登入的是使用了https協議的網站的話還需要添加以下一些處理:
1. 跳過https驗證:
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false);
2. 使用用戶代理:
$UserAgent = 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0; SLCC1; .NET CLR 2.0.50727; .NET CLR 3.0.04506; .NET CLR 3.5.21022; .NET CLR 1.0.3705; .NET CLR 1.1.4322)'; curl_setopt($curl, CURLOPT_USERAGENT, $UserAgent);
注意:如果不加入這些處理的話模擬登入時是不能成功的。
使用以上程式模擬登入網站一般都是能成功的,但實際上還是需要針對模擬登入的網站具體情況具體考慮。例如:有些網站編碼不同,所以你抓取下來的頁面是亂碼的,這時就要進行一下編碼轉換,如:$data = iconv("gb2312", "utf-8",$data) ;
,把gbk編碼轉換為utf8編碼。還有一些對安全性要求比較高的網站,例如網銀,會把驗證碼放在一個內聯框架中,這時你就需要先抓取到內聯框架的頁面然後在從中提取出驗證碼的位址,再去抓取驗證碼。還有一些網站(例如網路銀)是在js程式碼中去提交表單的,提交表單之前還會去做一些處理,例如加密等,所以如果你是直接提交的話也是不能登入成功的,你必須要去做類似的處理後再提交,但是這種情況如果你能知道js程式碼中進行的具體操作,比如加密的話,加密演算法是怎樣的,你就可以進行跟它一樣的處理,然後再去提交數據,這樣也是能成功的。但是,關鍵的地方來了,如果你根本不知道它進行的是什麼操作,例如它進行了加密,但是你不知道加密的具體演算法,那麼你就無法進行相同的操作,也就不能成功地模擬登入了。這方面典型的案例就是網銀,它在js程式碼中提交表單之前使用網銀控制項對使用者提交的密碼和驗證碼進行了一些處理,但是我們根本不知道它進行的是什麼操作,所以無法模擬。所以如果你以為你看了本文之後就能模擬登入網路銀行的話那麼你就太天真了,人家銀行的網站能那麼容易被你模擬登入嗎?當然,如果你能破解網路銀控制的話,那就另當別論了。話說回來,為什麼我的感受如此深刻,因為我就遇到這個難題了,不說了,說多了都是淚啊。 。 。
相信看了本文案例你已經掌握了方法,更多精彩請關注php中文網其它相關文章!
推薦閱讀:
以上是PHP使用Curl實現模擬登入及抓取資料步驟詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!