网页检测/显示卷曲请求的不同内容 - 为什么?

时间:2017-02-07 18:03:59

标签: php html curl

我需要使用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;

2 个答案:

答案 0 :(得分:2)

提示可能在网址中:它表示“欢迎陌生人”。他们将每个“第一次”访问者重定向到此页面。访问过该页面后,他们将不再重定向您。

似乎没有在浏览器中保存很多东西,但他们确实设置了一个带有会话ID的cookie。这是最合乎逻辑的事情:检查是否有会话。

您需要做的是连接curl和cookie。你可以使用你的浏览器cookie,但如果它过期,你最好做

  • 请求页面。
  • 如果页面被重定向,则安全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指出的那样,令人惊讶的是,通过简单地排除用户代理来加载页面。