48

フォームの送信後、Web サイトから一部のコンテンツをスクレイピングしています。問題は、スクリプトがときどき失敗することです。スクリプトは 5 回中 2 回失敗します。Cookieを処理するためにphp curl、COOKIEFILE、およびCOOKIEJARを使用しています。ただし、ブラウザーの送信ヘッダー (ブラウザーからターゲット Web サイトにアクセスし、ライブ http ヘッダーを使用する場合) と、php によって送信されるヘッダーを観察したところ、多くの違いがあることがわかりました。

私のブラウザは、php curl よりも多くの Cookie 変数を送信しました。この違いは、JavaScript がほとんどの Cookie の設定を担当しているためだと思いますが、これについてはよくわかりません。

以下のコードを使用してスクレイピングを行い、ブラウザーと php curl の送信済みヘッダーを表示しています。

$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 のパラメーターの一部は、Web サイトのコンテンツからスクレイピングできる可能性がありますが、すべてではありません。それらのいくつかは $ckfile から読み取ることができるかもしれませんが、その方法がわかりません。特に utma utmc、utmz、utmcsr、utmccn、utmcmd はどこからも取得できません。これらは JavaScript によって生成されていると思います。

質問 1: 現在のコードの Cookie 処理に問題がありますか? さらに、ブラウザとphp curlによって送信されたヘッダーの他の違いは、正しいコンテンツを返すのに問題になる可能性がありますか?

質問 2: これらの Cookie を設定する JavaScript が原因で、欠落している Cookie 変数はありますか?

質問 3: 必要なすべての Cookie がリモート サーバーに確実に送信されるように、Cookie を処理する最善の方法は何ですか?

あなたの助けは大歓迎です!

4

4 に答える 4

82

Cookie がスクリプトから生成された場合、(cookie-file オプションを使用して) ファイルからの 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 が javascript を介して生成された場合は、その生成方法を追跡する必要があり、上記の方法を使用して (http ヘッダーを介して) 送信できます。

utma utmc, utmzCookie が Mozilla から送信されたときに表示されます。もうこれらのことを心配する必要はありません。

最後に、あなたのやり方は大丈夫です。ファイル名/var/dir/cookie.txtに相対パスではなく絶対パス(つまり)を使用していることを確認してください。

curl を使用するときは、常に冗長モードを有効にしてください。リクエストを追跡するのに大いに役立ちます。また、多くの時間を節約できます。

curl_setopt($ch, CURLOPT_VERBOSE, true);
于 2014-03-07T21:31:15.783 に答える