php curl類比登陸抓取資料

來源:互聯網
上載者:User

標籤: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_REFERERCURLOPT_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類比登陸抓取資料

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.