php curl采集數據問題匯總


1. 使用curl獲取網頁數據提示: "curl: (6) Could not resolve host: xxx.xxx.com ; Name or service not known"

解決方法:添加host(ip url,網址對應的ip);

2.curl提交數據給服務器的時候,出現了提交文本text,不是'key=val&key=val'這種形式的,而是帶換行的那種字符串,這是就不能使用http_build_query函數

解決方法:

  a.使用php中的定界符<<<,然后在定界符中間寫需要傳輸的字符串,該換行就換行;

  b.在傳輸字符串的時候一定要注意字符串的單雙引號,字符串是單引號括住的有時候傳輸之后會報錯,得不到預期的數據,這時候就改成雙引號即可;

3.在采集數據的過程中,有時候提交的數據中的某個參數你在頁面上始終找不到的時候該怎么辦?

解決辦法:特殊參數值可能保存在cookie、js或者需要重新請求一個新的url獲得參數的值

4.ip被指定網站屏蔽了怎么辦?

解決方法:linux的curl中有個-x的選項,設置匿名代理的ip和端口即可 curl -x 192.168.0.1:8080 http://www.baidu.com.

5.當使用linux的curl模擬登陸某個網站時,提示登陸成功了,但是當你去獲取比如用戶的詳細信息時,怎么都獲取不到?返回的頁面信息提示你去登陸,這是怎么回事呢???

 說明:今天遇到按要求抓取一個很簡單的網站,但是就在模擬登陸成功后准備做其他操作的時候,返回的信息一直就是提示要你去登陸,你未登陸,真心是很奇怪...

猜想與解決:

  1.你在登陸成功后要獲取某個頁面的時候,必須要把過程頁面也都獲取一遍(說明:過程頁面?比如登陸成功后跳轉到A頁面,這時候你要獲取用戶的基本信息,你需要點擊用戶中心這個按鈕進入用戶的個人中心B頁面,然后進入B頁面后它會觸發ajax請求用戶的數據這里請求的url我們稱為C,那么有些網站很厲害了,你如果登陸成功后,直接curl去請求C頁面,是獲取不到任何信息的,相反會提示一堆的錯誤或者別的情況的信息);

  解決:根據步驟先獲取A頁面數據;再請求B頁面的數據;最后再獲取C也就是用戶數據

  2.cookie內缺少參數:我今天碰到的就是這個問題,cookie內本來是“PHPSESSID=5b5b92d8d664629a83b3adb1e1e1a393; CheckCode=1237”這些內容,而我模擬登陸后的cookie文件內只有“CheckCode=1237”,缺少了PHPSESSID參數,造成就算你提交數據登陸返回了登陸成功,你也獲取不到具體的數據;

  解決:

    a.查找所有與該網站有關的js和登陸頁面相關的html文件,是否存在代碼生成該參數,或者有些網站每次請求都把該參數寫到固定的js文件內,需要curl獲取該js文件然后匹配出來,拼接到cookie中;

    b.在上一步沒有找到的時候,這時候你要是要抓包工具抓取在從進入登陸頁面到登陸完成以及進入數據頁面的這個過程中請求的所有的頁面,在這些請求內找到cookie內的PHPSESSID參數是從哪個url請求的時候開始有這個參數的(比如:進入登陸頁面a,a的請求header等信息內cookie內沒有設置該參數,那么就找下一個url,比如是獲取驗證碼url,看看是否設置了,一直這么找 ....,直到找到從哪個url開始cookie設置了該參數,那么只需要curl請求一次該url即可,注意請求該url的位置)

    c.第三種情況最特殊,有些網站它的登陸入口有好幾個,一般的會有兩個,一個直接在首頁有一個登陸的地方,一個就是單獨的登陸頁面,而且從這兩個登陸的入口點擊登陸成功后跳轉的頁面可能有所不同,在瀏覽器上操作兩個入口登陸都能獲取對應的內容,但是當我們使用curl進行模擬登陸獲取數據的時候就會出現意想不到的事情,那就是當你從首頁這個入口登陸進去,獲取用戶的數據,可以登陸成功,但是在進入數據頁面獲取對應數據的時候怎么都獲取不到,很是郁悶,我之前遇到該問題,苦惱了很長時間,想不出來試哪里出了問題;后來我仔細一想,我換一個入口進入數據頁面也許就可行,結果果然可以(就好比是數據頁面是目標頁面C,那么從首頁登陸進來跳轉到了B頁面,從B頁面直接進入C頁面的話獲取數據死活獲取不到;當你從登陸頁登陸跳轉到D頁面,D頁面再進入C頁面,這個時候就能獲取成功,這就是目標一樣,但是在到達目標之前有一個岔路口e和f,只有一條路可以走到目標)

    d.經過上幾步還是無法獲取成功,那么可能就需要咱們在使用curl請求的時候手動拼接cookie缺失的參數了,形式如下:

--cookie 'phoneflag=0; loanaccnum=""; gjjaccnum='xxxx'; gjjaccname='xxx'; gjjcertinum=xxxxxxx'

    有些cookie中的數據需要你去請求特定的url,然后獲取到之后拼接成cookie即可(手動拼接)

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM