我需要使用PHP检索和解析公共领域书籍的文本,例如gutenberg.org上的公共领域书籍。
要检索大多数网页的内容,我能够使用CURL请求来检索HTML,就像我在浏览器中导航到URL时所发现的那样。
不幸的是,在某些页面上,最重要的是gutenberg.org页面,网站显示不同的内容或发送重定向标题。
例如,在尝试加载this target, gutenberg.org, page时,curl请求会重定向到this different but logically related, gutenberg.org, page。我已成功访问目标页面,同时在我的浏览器上关闭了cookie和javascript。
为什么在对同一网站的常规浏览器请求不被重定向时会重定向curl请求?
以下是我用来检索网页的代码:
$urlToScan = "http://www.gutenberg.org/cache/epub/34175/pg34175.txt";
if(!isset($userAgent)){
$userAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36";
}
$ch = curl_init();
$timeout = 15;
curl_setopt($ch, CURLOPT_COOKIESESSION, true );
curl_setopt($ch, CURLOPT_USERAGENT,$userAgent);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_BINARYTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
#curl_setopt($ch, CURLOPT_HEADER, 1); // return HTTP headers with response
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout);
curl_setopt($ch, CURLOPT_URL, $urlToScan);
$html = curl_exec($ch);
curl_close($ch);
if($html == null){
return false;
}
print $html;
答案 0 :(得分:2)
提示可能在网址中:它表示“欢迎陌生人”。他们将每个“第一次”访问者重定向到此页面。访问过该页面后,他们将不再重定向您。
似乎没有在浏览器中保存很多东西,但他们确实设置了一个带有会话ID的cookie。这是最合乎逻辑的事情:检查是否有会话。
您需要做的是连接curl和cookie。你可以使用你的浏览器cookie,但如果它过期,你最好做
如果一切顺利,第二个请求将不会重定向。在cookie /会话到期之前,然后重新开始。请参阅the manual,了解如何使用Cookie / cookie-jars
答案 1 :(得分:2)
人们可以在浏览器中导航到目标页面但没有使用Cookie或javascript ,而不是curl
,这是因为网站会在标题中跟踪引荐来源。通过设置适当的referrer标头,可以在不加cookie的情况下加载页面:
curl_setopt($ch, CURLOPT_REFERER, "http://www.gutenberg.org/ebooks/34175?msg=welcome_stranger");
正如@madshvero指出的那样,令人惊讶的是,通过简单地排除用户代理来加载页面。