標籤:open ict 中國 常用 nsf 顯示 研究 org bsp
最近由於項目的需要,需要做資料抓取,也就是用的curl相關的函數庫,在這之前還真心沒有接觸過這麼高大上的東西,然後從剛開始到今天才研究curl算是第四天了,寫這篇部落格記錄一下這幾天的一個過程,在使用curl類比登陸抓取資料過程中需要注意的一些事項,以及介紹一款支援跨平台(windows、linux、mac)的抓包軟體 charles(這個軟體是收費的,但是你不花錢也可以使用) ,想要儘快上手,必須要去熟悉兩個東西:http協議、curl的相關參數選項的作用
一、介紹curl
這是curl的維基百科地址:https://zh.wikipedia.org/wiki/CURL,有興趣的朋友可以去看看
curl支援的通訊協定:FTP、FTPS、HTTP、HTTPS、TFTP、SFTP、Gopher、SCP、Telnet、DICT、FILE、LDAP、LDAPS、IMAP、POP3、SMTP和RTSP
curl可以做的事情有很多,向我們經常用到很多的就是類比登陸,抓取一些資料,上傳下載檔案啥的,其他的一些高深的估計很少接觸到,我最近也就接觸了類比登陸啥的
二、curl的使用
curl的使用很簡單,主要分為四部:
1>.curl_init();//初始化 cURL 會話
2>.curl_setopt();//設定 cURL 傳輸選項(這一步也是最重要的,也是最複雜的它有很多參數,大家可以看一下php官方資訊:http://php.net/manual/zh/function.curl-setopt.php)
3>.curl_exec();//執行 cURL 會話
4>.curl_close();//關閉 cURL 會話
要想使用好curl,必須去看curl相關的傳輸參數(http://php.net/manual/zh/function.curl-setopt.php),不需要記住,只要有個印象就行,把常用的幾個記住就行了
三、curl類比登陸
1.準備工作:既然是類比登陸,那就要像那麼回事,要類比瀏覽器發生登陸請求一樣,所以我們要類比登陸某個網站之前,需要對該網站進行抓包,來分析這個網站登陸的時候都傳了些什麼參數、傳的參數是否加密、加密方式是什麼、發送請求的heder裡邊都有些啥、傳輸的方式是啥、是什麼通訊協定(http、https)、是否有圖片驗證碼、擷取的登陸地址是否有重新導向302等等這些東西你都要去觀察,把這些東西都搞清楚了,你才能進行類比登陸(當然了,首先你自己要有這個網站的賬戶密碼,不然你拿什麼來使用curl類比登陸,對不對?)
2.開始階段:
a.擷取cookie,這一步至關重要,你要類比登陸必須要先擷取網站的cookie,之前偽造下 USER-AGENT 就可以抓資料,但是現在卻不行了,沒有cookie的話就相當於沒有身份,你都沒有身份,那網站肯定拒絕你的任何操作,簡單點說這就是個標誌,下面是擷取cookie的代碼:
# 1.擷取cookie $cookie_file = dirname(__FILE__) . ‘/cookie.txt‘;//儲存cookie的檔案 $login_url = "http://xxxxxxxxxxxxxx";//登陸頁面網址 $cookie_curl = curl_init(); $timeout = 5; curl_setopt($cookie_curl, CURLOPT_URL, $login_url); curl_setopt($cookie_curl, CURLOPT_RETURNTRANSFER, 1);//將curl_exec()擷取的資訊以字串返回,而不是直接輸出。 curl_setopt($cookie_curl, CURLOPT_CONNECTTIMEOUT, $timeout);//在嘗試串連時等待的秒數。設定為0,則無限等待 curl_setopt($cookie_curl, CURLOPT_COOKIEJAR,$cookie_file); //擷取COOKIE並儲存,在執行curl_close串連介紹,儲存擷取的cookie的檔案 $contents = curl_exec($cookie_curl); curl_close($cookie_curl);
b.擷取圖片驗證碼(針對沒有圖片驗證碼的網站可以忽略),這一步也是重要的一環,圖片驗證碼要是擷取的不正確,你是沒有辦法登陸成功的
# 2.擷取驗證碼 $cookie_file = dirname(__FILE__) . ‘/cookie.txt‘;//儲存cookie的檔案 $verify_code_url = "http://xxxxxxxxxxxx";//擷取圖片驗證碼url $verify_code_referer = "http://xxxxxxxxxxxx";//登陸頁面url $verify_curl = curl_init(); curl_setopt($verify_curl, CURLOPT_URL, $verify_code_url); curl_setopt($verify_curl, CURLOPT_COOKIEFILE, $cookie_file);//第一步擷取的cookie檔案 curl_setopt($verify_curl, CURLOPT_HEADER, 0);//啟用時會將標頭檔的資訊作為資料流輸出。 // curl_setopt($verify_curl, CURLOPT_HTTPHEADER, array($login_url_header[‘2‘]));//擷取驗證碼需要的header資料 curl_setopt($verify_curl, CURLOPT_REFERER, $verify_code_referer);//在HTTP要求標頭中"Referer: "的內容,訪問來源 curl_setopt($verify_curl, CURLOPT_RETURNTRANSFER, 1);//將curl_exec()擷取的資訊以字串返回,而不是直接輸出。 $img = curl_exec($verify_curl); curl_close($verify_curl); $fp = fopen("verifyCode.jpg","w");//將擷取的驗證碼寫入圖片中 fwrite($fp,$img); fclose($fp);
注意:(1).擷取圖片驗證碼url後面一般會跟一個參數,那就是時間戳記(什麼毫秒層級的、中國標準時間),有可能需要函數處理一下這些參數,我遇到的是需要使用 urlencode 來處理參數,參數格式什麼不正確是擷取不到驗證碼的;(2).那就是代碼中注釋的一行,CURLOPT_HTTPHEADER 這個參數的作用是佈建要求時的header頭資料,有些網站比較嚴格,就需要,還有像什麼 CURLOPT_REFERER、CURLOPT_USERAGENT 這些參數,在你試了上面的方法不行的時候,就試著把這幾個參數的值補上試試;(3).這裡擷取了圖片驗證碼,網上有些人是使用代碼,暫停20秒,我們人為的去查看這個圖片驗證碼的值,然後寫到一個txt的檔案中,然後再用file_get_contents讀取出我們填寫的驗證碼;當然你也可以使用其他的辦法,怎麼方便就怎麼來吧(代碼:sleep(20);$code = file_get_contents("./code_bj.txt");)。
c.拼接登陸需要發送的資料,以及資料是否加密,使用什麼方式加密,這些都需要處理,這裡的資料不能是二維數組 ,只能是一維數組(key=>value),或者是"&username=zhangsan&password=123456&code=2z2s",以上兩種格式都行,在傳輸資料時,如果是一維數組格式的,需要使用函數 http_build_query 進行相應的處理,代碼如下:
//提交的參數有兩種格式 # 1.一維數組(絕對不能是二維數組) $post = array( ‘username‘ => ‘zhangsan‘, ‘password‘ => ‘123456‘, ‘code‘ => ‘2z2s‘, ); # 1.1一維數組格式在傳輸時需要使用函數(http_build_query)處理 curl_setopt($curl, CURLOPT_POST, 1);//post方式提交 curl_setopt($curl, CURLOPT_POSTFIELDS, http_build_query($post)); # 2.字串形式 $post = "&username=zhangsan&password=123456&code=2z2s"; # 2.1一維數組格式在傳輸時需要使用函數(http_build_query)處理 curl_setopt($curl, CURLOPT_POST, 1);//post方式提交 curl_setopt($curl, CURLOPT_POSTFIELDS, $post);
3.類比登陸,代碼如下:
# 3.類比登陸 $cookie_file = dirname(__FILE__) . ‘/cookie.txt‘;//儲存cookie的檔案 $submit_url = ‘http://xxxxxxxxxxxx‘;//資料提交的url(form表單提交資料的地址) $submit_referer = "http://xxxxxxxxxxxx";//登陸頁面url $submit_curl = curl_init();//初始化curl模組 curl_setopt($submit_curl, CURLOPT_URL, $submit_url);//登入提交的地址 curl_setopt($submit_curl, CURLOPT_HEADER, 0);//是否顯示頭資訊 curl_setopt($submit_curl, CURLOPT_RETURNTRANSFER, 1);//將curl_exec()擷取的資訊以字串返回,而不是直接輸出。 curl_setopt($submit_curl, CURLOPT_COOKIEFILE, $cookie_file); //設定Cookie資訊儲存在指定的檔案中 curl_setopt($submit_curl, CURLOPT_REFERER, $submit_referer);//來源 curl_setopt($submit_curl, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.155 Safari/537.36");//來路 curl_setopt($submit_curl, CURLOPT_HTTPHEADER, array(‘Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8‘,‘Upgrade-Insecure-Requests: 1‘,‘Content-Type: application/x-www-form-urlencoded‘,‘Accept-Encoding: gzip, deflate‘,‘Accept-Language: zh-CN,zh;q=0.8‘,‘Content-Length:‘.strlen($post))); curl_setopt($submit_curl, CURLOPT_POST, 1);//post方式提交(這裡我使用的資料格式是字串拼接格式) curl_setopt($submit_curl, CURLOPT_POSTFIELDS, $post);//要提交的資訊 $contents = curl_exec($submit_curl);//執行cURL curl_close($submit_curl);//關閉cURL資源,並且釋放系統資源
感興趣的輸出上面的結果集,看看是什麼就知道了,到此類比登陸就成功了,接下來就做你想做的事情,比如登陸成功後你要擷取你使用者個人中心的賬戶姓名,頭像,手機號等等資訊都是可以的
4.總結
1.在使用curl的時候,一定要先去看看curl相關參數,不然會帶來很無聊的麻煩(本人就是,把CURLOPT_COOKIEJAR和CURLOPT_COOKIEFILE搞錯了,結果找了半天才找到原因)
2.在類比登陸之前一定要仔細分析網站登陸的過程都發生了些什麼,使用抓包工具,抓取資料進行分析,一些網站比較嚴格的,你必須要加上幾個參數:CURLOPT_REFERER(訪問來源,從哪個網頁過來的)、CURLOPT_USERAGENT(仿造來路咯!類比是google發的請求或者Firefox發的請求)、CURLOPT_HTTPHEADER(這個很關鍵,就是發送請求的網址的要求標頭--request header,看看裡面都有哪些參數,必要的時候,在類比發請求的時候把這些header參數全部設定上去,成功幾率很大哦!)。
3.一定要有耐心,前期把抓包分析工作做仔細,多看看http協議和curl參數,祝君成功!
暫時就先寫這麼多,以上內容純屬我自己實踐,如有錯誤歡迎批評指正,謝謝!!!
php curl類比登陸抓取資料