以下脚本:
<?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已移到此处”,并且单词“ here”链接到后缀为“?cookieSet = 1”的所需URL。如果单击该链接,它将带我到我尝试使用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已移到此处”,第一个单词“ here”链接到所需的URL后缀如前,第二个单词“ here”链接到无用页面“ http://onlinelibrary.wiley.com/action/cookieAbsent”。
我用Google搜索php curl "The URL has moved here"
。大多数结果都是使用外语编写的,没有任何迹象表明这种现象的原因或如何克服这种现象,从而无法实际检索所需的页面。
我想知道问题是否在于我需要对curl_setopt()
中的cookie做些什么。我以前没有使用过cookie,而且我一直在curl_setopt()
中阅读有关cookie的选项,并感到有些困惑。有人可以解释这些脚本中发生了什么以及我需要进行哪些更改才能使脚本正常工作?
我正在Windows 7 64位下的IIS 7.5上运行PHP 7.2.2。
答案 0 :(得分:0)
我需要在此cURL脚本中使用cookie吗?
是
您必须设置 curl 来存储/更新网站收到的cookie,并在每次请求时将其发送回去。
此外,由于该站点仅在发送cookie时才提供内容,因此您必须发出两个请求。第一个只是让cookie被获取和存储。第二个(将发送回存储的cookie)将获取实际内容。
为了存储收到的Cookie并根据每个请求发送它们,您需要以下几行:
curl_setopt($cURLhandle, CURLOPT_COOKIEFILE, "path_to\cookies.txt");
curl_setopt($cURLhandle, CURLOPT_COOKIEJAR, "path_to\cookies.txt");
path_to\cookies.txt
是本地存储cookie的文件的绝对路径。
该文件是在第一次调用时创建的。当然,目标目录必须是可读/可写的。
最后执行两个curl调用:
1)只需加载首页https://onlinelibrary.wiley.com/
2)加载所需的页面https://onlinelibrary.wiley.com/toc/14678624/2014/85/1
请注意,如果要提取多个页面,则仅在第一次时需要执行步骤 1 。