PHP: нужно ли мне использовать файлы cookie в этом скрипте cURL?

#cookies #php-curl

#файлы cookie #php-curl

Вопрос:

Следующий скрипт:

 <?php
$sDataFile = '<path>journal-issue-ToC.htm';
$sURL = 'https://onlinelibrary.wiley.com/toc/14678624/2014/85/1';
$bHeader = false;
$sCAinfo = '<path>cacert.pem';

$cURLhandle = curl_init();
$FilePointer = fopen($sDataFile, 'wb');

curl_setopt($cURLhandle, CURLOPT_URL, $sURL);
curl_setopt($cURLhandle, CURLOPT_FILE, $FilePointer);
curl_setopt($cURLhandle, CURLOPT_HEADER, $bHeader);
curl_setopt($cURLhandle, CURLOPT_CAINFO, $sCAinfo);

curl_exec($cURLhandle);

curl_close($cURLhandle);
fclose($FilePointer);
  

сохраняет файл «journal-issue-ToC.htm » содержит только следующую одну строку:

 The URL has moved <a href="https://onlinelibrary.wiley.com/toc/14678624/2014/85/1?cookieSet=1">here</a>
  

Если я открываю этот файл в браузере, он сообщает «URL переместился сюда», а слово «здесь» связано с желаемым URL-адресом с суффиксом «?cookieSet= 1». Если я нажму на эту ссылку, она приведет меня на страницу, которую я пытаюсь сохранить с помощью cURL.

Я подумал, что, возможно, я мог бы имитировать нажатие на эту ссылку, добавив к URL-адресу суффикс «?cookieSet= 1» и вызывая cURL_exec() второй раз. Поэтому я добавил три строки в скрипт для этого:

 <?php
$sDataFile = '<path>journal-issue-ToC-2.htm';
$sURL = 'https://onlinelibrary.wiley.com/toc/14678624/2014/85/1';
$bHeader = false;
$sCAinfo = '<path>cacert.pem';

$cURLhandle = curl_init();
$FilePointer = fopen($sDataFile, 'wb');

curl_setopt($cURLhandle, CURLOPT_URL, $sURL);
curl_setopt($cURLhandle, CURLOPT_FILE, $FilePointer);
curl_setopt($cURLhandle, CURLOPT_HEADER, $bHeader);
curl_setopt($cURLhandle, CURLOPT_CAINFO, $sCAinfo);

curl_exec($cURLhandle);

$sURL .= '?cookieSet=1';
curl_setopt($cURLhandle, CURLOPT_URL, $sURL);
curl_exec($cURLhandle);

curl_close($cURLhandle);
fclose($FilePointer);
  

Этот скрипт сохраняет файл «journal-issue-ToC-2.htm » содержит только следующие две строки:

 The URL has moved <a href="https://onlinelibrary.wiley.com/toc/14678624/2014/85/1?cookieSet=1">here</a>
The URL has moved <a href="http://onlinelibrary.wiley.com/action/cookieAbsent">here</a>
  

Если я открою этот файл в браузере, он дважды сообщит «URL-адрес переместился сюда», причем первое слово «здесь» связано с желаемым URL-адресом с суффиксом, как и раньше, а второе слово «здесь» связано с бесполезной страницей «http://onlinelibrary .wiley.com/action/cookieAbsent «.

Я погуглил php curl "The URL has moved here" . Большинство результатов были на иностранных языках, и ни один из них не дал никакого намека на причину такого поведения или на то, как обойти его, чтобы фактически получить нужную страницу.

Интересно, проблема в том, что мне нужно что-то сделать с файлами cookie curl_setopt() . Я раньше не работал с файлами cookie, и я читал о вариантах для них curl_setopt() и чувствую себя немного потерянным. Может кто-нибудь объяснить, что происходит в этих скриптах и что мне нужно изменить, чтобы заставить скрипты работать?

Я использую PHP 7.2.2 на IIS 7.5 под 64-разрядной версией Windows 7.

Ответ №1:

Нужно ли мне использовать файлы cookie в этом скрипте cURL?

ДА


Вы должны настроить curl для хранения / обновления файлов cookie, полученных веб-сайтом, и отправки их обратно по каждому запросу.

Кроме того, поскольку сайт будет обслуживать контент только тогда, когда файлы cookie будут отправлены обратно, вам необходимо выполнить два запроса. Первый просто позволит получить и сохранить файлы cookie. Второй (который отправит обратно сохраненные файлы cookie) получит фактическое содержимое.

Чтобы хранить полученные файлы cookie и отправлять их при каждом запросе, вам нужны эти строки:

 curl_setopt($cURLhandle, CURLOPT_COOKIEFILE, "path_tocookies.txt");
curl_setopt($cURLhandle, CURLOPT_COOKIEJAR,  "path_tocookies.txt");
  

path_tocookies.txt это абсолютный путь к файлу, в котором хранятся файлы cookie локально.
Файл создается при первом вызове. Конечно, целевой каталог должен быть доступен для чтения / записи.

Наконец, выполните два вызова curl:

1) просто загрузите домашнюю страницу https://onlinelibrary.wiley.com/

2) загрузите нужную страницу https://onlinelibrary.wiley.com/toc/14678624/2014/85/1


Обратите внимание, что если вы собираетесь извлекать несколько страниц, вам нужен шаг 1 только в первый раз.