2013-06-01 47 views
28

我在表單提交後從網站上抓取一些內容。問題在於腳本不時出現故障,比如5次腳本失敗。我使用php curl,COOKIEFILE和COOKIEJAR來處理cookie。但是,當我觀察到瀏覽器發送的頭文件(從瀏覽器訪問目標網站並使用實時http頭文件)和php發送的頭文件時,發現有很多不同之處。除了CURLOPT_COOKIEFILE之外,如何使用PHP curl發送cookie?

我的瀏覽器發送了比PHP curl更多的cookie變量。我認爲這種差異可能是因爲JavaScript可以用來設置大部分Cookie,但我不確定這一點。

我使用下面的代碼做了刮我顯示我的瀏覽器和php捲曲的發頭:

$ckfile = tempnam ("/tmp", 'cookiename'); 

$url = 'https://www.domain.com/firststep'; 
$poststring = 'variable1=4&variable2=5'; 
$ch = curl_init ($url); 
curl_setopt ($ch, CURLOPT_COOKIEJAR, $ckfile); 
curl_setopt ($ch, CURLOPT_COOKIEFILE, $ckfile); 
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 30); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); 
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); 
curl_setopt ($ch, CURLOPT_POST, 1); 
curl_setopt ($ch, CURLOPT_POSTFIELDS, $poststring); 
$output = curl_exec ($ch); 
curl_close($ch); 



$url = 'https://www.domain.com/nextstep'; 
$poststring = 'variableB1=4&variableB2=5'; 
$ch = curl_init ($url); 
curl_setopt ($ch, CURLOPT_COOKIEJAR, $ckfile); 
curl_setopt ($ch, CURLOPT_COOKIEFILE, $ckfile); 
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 30); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); 
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); 
curl_setopt ($ch, CURLOPT_POST, 1); 
curl_setopt ($ch, CURLOPT_POSTFIELDS, $poststring); 
curl_setopt($ch, CURLINFO_HEADER_OUT, true); 
$output = curl_exec ($ch); 
$headers = curl_getinfo($ch, CURLINFO_HEADER_OUT); 
curl_close($ch); 

print_r($headers); 

// Gives: 
POST /d-cobs-web/doffers.html;jsessionid=7BC2A5277A4EB07D9A7237A707BE1366 HTTP/1.1 
User-Agent: Mozilla 
Host: domain.subdomain.nl 
Accept: */* 
Cookie: JSESSIONID=7BC2A5277A4EB07D9A7237A707BE1366; www-20480=MIFBNLFDFAAA 
Content-Length: 187 
Content-Type: application/x-www-form-urlencoded 

// Where live http headers gives: 
POST /d-cobs-web/doffers.html;jsessionid=7BC2A5277A4EB07D9A7237A707BE1366 HTTP/1.1 
Host: domain.subdomain.nl 
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:21.0) Gecko/20100101 Firefox/21.0 
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 
Accept-Language: nl,en-us;q=0.7,en;q=0.3 
Accept-Encoding: gzip, deflate 
Content-Type: application/x-www-form-urlencoded; charset=UTF-8 
Referer: https://domain.subdomain.nl/dd/doffers.html?returnUrl=https%3A%2F%2Fttcc.subdomain.nl%2Fdd%2Fpreferences.html%3FValueChanged%3Dfalse&BEGBA=&departureDate=13-06-2013&extChangeTime=&pax2=0&bp=&pax1=1&pax4=0&bk=&pax3=0&shopId=&xtpage=&partner=NSINT&bc=&xt_pc=&ov=&departureTime=&comfortClass=2&destination=DEBHF&thalysTicketless=&beneUser=&debugDOffer=&logonId=&valueChanged=&iDomesticOrigin=&rp=&returnTime=&locale=nl_NL&vu=&thePassWeekend=false&returnDate=&xtsite=&pax=A&lc2=&lc1=&lc4=&lc3=&lc6=&lc5=&BECRA=&passType2=&custId=&lc9=&iDomesticDestination=&passType1=A&lc7=&lc8=&origin=NLASC&toporef=&pid=&passType4=&returnTimeType=1&passType3=&departureTimeType=1&socusId=&idr3=&xtn2=&loyaltyCard=&idr2=&idr1=&thePassBusiness=false&cid=14812 
Content-Length: 219 
Cookie: subdomainPARTNER=NSINT; JSESSIONID=CB3FEB3AC72AD61A80BFED91D3FD96CA; www-20480=MHFBNLFDFAAA; campaignPos=5; www-47873=MGFBNLFDFAAA; __utma=1.993399624.1370027094.1370040145.1370082133.5; __utmc=1; __utmz=1.1370027094.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); BCSessionID=5dc05787-c2c8-43e1-9abe-93989970b087; BCPermissionLevel=PERSONAL; __utmb=1.1.10.1370082133 
Connection: keep-alive 
Pragma: no-cache 
Cache-Control: no-cache 
AJAXREQUEST=_viewRoot&doffersForm=doffersForm&doffersForm%3AvalueChanged=&doffersForm%3ArequestValid=true&javax.faces.ViewState=j_id3&doffersForm%3Aj_id937=doffersForm%3Aj_id937&valueChanged=false&AJAX%3AEVENTS_COUNT=1& 

我想用:

$headers = array(); 
$headers[] = 'Cookie: ' . $cookie; 

和:

curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); 

其中:

$cookie = 'subdomainPARTNER=NSINT; JSESSIONID=CB3FEB3AC72AD61A80BFED91D3FD96CA; www-20480=MHFBNLFDFAAA; campaignPos=5; www-47873=MGFBNLFDFAAA; __utma=1.993399624.1370027094.1370040145.1370082133.5; __utmc=1; __utmz=1.1370027094.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); BCSessionID=5dc05787-c2c8-43e1-9abe-93989970b087; BCPermissionLevel=PERSONAL; __utmb=1.1.10.1370082133'; 

上面的cookie中的一些參數我可能能夠從網站的內容中刪除,但不是全部。其中一些我可能能夠從$ ckfile中讀取,但我不知道該怎麼做。特別是utma utmc,utmz,utmcsr,utmccn,utmcmd我無法從任何地方獲得,我認爲這些都是由javascript生成的。

問題1: 我是不是由瀏覽器做在當前的代碼非常少的cookie變量是由PHP捲曲發出一些錯誤的cookie處理和更多?更進一步:可以通過瀏覽器和php curl發送的標題之間的其他區別是返回正確的內容的問題?

問題2: 由於JavaScript設置這些cookie而缺少cookie變量嗎?

問題3: 什麼是處理餅乾,以確保所有必需的cookie被髮送到遠程服務器的最佳方式?

您的幫助非常歡迎!

+0

你有沒有得到這個地方?我遇到同樣的問題 - 想知道爲什麼瀏覽器發送3個cookie,並且curl只發送1個,儘管cookie文件包含全部3. – David

+0

嗯......聽起來像是我在刮backpage.com的問題。 – TARKUS

回答

54

如果cookie是從腳本生成的,那麼您可以從文件(使用cookie文件選項)手動發送cookie以及cookie。例如:

# sending manually set cookie 
curl_setopt($ch, CURLOPT_HTTPHEADER, array("Cookie: test=cookie")); 

# sending cookies from file 
curl_setopt($ch, CURLOPT_COOKIEFILE, $ckfile); 

在這種情況下,curl會將您定義的cookie與來自文件的cookie一起發送。

如果cookie是通過javascrript生成的,那麼你必須跟蹤它如何生成,然後你可以使用上面的方法(通過http-header)發送它。

當從Mozilla發送cookie時會看到utma utmc, utmz。你不應該擔心這些事情了。

最後,你做的方式是沒問題的。只要確保你使用文件名的絕對路徑(即/var/dir/cookie.txt)而不是相對路徑。

處理捲曲時始終啓用詳細模式。它將幫助您追蹤請求。它也會節省你很多時間。

curl_setopt($ch, CURLOPT_VERBOSE, true); 
+0

保存的cookie文件是否包含test = cookie?如果沒有,那麼我將如何獲得cURL來保存來自自定義頭部請求的cookie? – brant

+0

@brant cookie文件只能根據來自服務器的「Set-cookie」響應標題進行寫入。如果服務器沒有返回該cookie的頭部,那麼它將被忽略。 –

+3

curl_setopt調用的順序非常重要。在** * CURLOPT_POSTFIELDS *之後設置* CURLOPT_POST * **並且您很難找到錯誤...同樣,上述解決方案中的順序非常重要。交換它,然後用「test = cookie」覆蓋cookie文件中的所有內容 – rahmanisback

0

我認爲你唯一需要的cookie是JSESSIONID = XXX ..

也從來不分享你的cookies,具有因有人可以訪問您的個人數據的方式。特別是當cookies是會話時。一旦您註銷網站,這些cookie將停止工作。