#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 только в первый раз.