php curl模擬登錄抓取數據

  最近因爲項目的須要,須要作數據抓取,也就是用的curl相關的函數庫,在這以前還真心沒有接觸過這麼高大上的東西,而後從剛開始到今天才研究curl算是第四天了,寫這篇博客記錄一下這幾天的一個過程,在使用curl模擬登錄抓取數據過程當中須要注意的一些事項,以及介紹一款支持跨平臺(windows、linux、mac)的抓包軟件 charles(這個軟件是收費的,可是你不花錢也可使用) ,想要儘快上手,必需要去熟悉兩個東西:http協議、curl的相關參數選項的做用php

1、介紹curlhtml

  這是curl的維基百科地址:https://zh.wikipedia.org/wiki/CURL,有興趣的朋友能夠去看看linux

  curl支持的通信協定:FTP、FTPS、HTTP、HTTPS、TFTP、SFTP、Gopher、SCP、Telnet、DICT、FILE、LDAP、LDAPS、IMAP、POP三、SMTP和RTSPweb

  curl能夠作的事情有不少,向咱們常常用到不少的就是模擬登錄,抓取一些數據,上傳下載文件啥的,其餘的一些高深的估計不多接觸到,我最近也就接觸了模擬登錄啥的windows

2、curl的使用數組

  curl的使用很簡單,主要分爲四部:瀏覽器

  1>.curl_init();//初始化 cURL 會話cookie

  2>.curl_setopt();//設置 cURL 傳輸選項(這一步也是最重要的,也是最複雜的它有不少參數,你們能夠看一下php官方信息:http://php.net/manual/zh/function.curl-setopt.php)app

  3>.curl_exec();//執行 cURL 會話curl

  4>.curl_close();//關閉 cURL 會話

  要想使用好curl,必須去看curl相關的傳輸參數(http://php.net/manual/zh/function.curl-setopt.php),不須要記住,只要有個印象就行,把經常使用的幾個記住就好了

3、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發的請求或者火狐發的請求)、CURLOPT_HTTPHEADER(這個很關鍵,就是發送請求的網址的請求頭--request header,看看裏面都有哪些參數,必要的時候,在模擬發請求的時候把這些header參數所有設置上去,成功概率很大哦!)

    3.必定要有耐心,前期把抓包分析工做作仔細,多看看http協議和curl參數,祝君成功!

 

  暫時就先寫這麼多,以上內容純屬我本身實踐,若有錯誤歡迎批評指正,謝謝!!!

相關文章
相關標籤/搜索