Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/78.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 网页检测/显示curl请求的不同内容-为什么?_Php_Html_Curl - Fatal编程技术网

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

Php 网页检测/显示curl请求的不同内容-为什么?,php,html,curl,Php,Html,Curl,我需要用PHP检索和解析公共领域书籍的文本,比如gutenberg.org上的书籍 要检索大多数网页的内容,我可以使用CURL请求检索HTML,就像在浏览器中导航到URL一样 不幸的是,在一些页面上,最重要的是gutenberg.org页面,网站显示不同的内容或发送重定向标题 例如,当尝试加载一个curl请求时,会被重定向到。我能够在浏览器上关闭cookie和javascript的情况下成功访问目标页面 为什么要重定向curl请求,而对同一站点的常规浏览器请求却没有重定向? 以下是我用来检索网页

我需要用PHP检索和解析公共领域书籍的文本,比如gutenberg.org上的书籍

要检索大多数网页的内容,我可以使用CURL请求检索HTML,就像在浏览器中导航到URL一样

不幸的是,在一些页面上,最重要的是gutenberg.org页面,网站显示不同的内容或发送重定向标题

例如,当尝试加载一个curl请求时,会被重定向到。我能够在浏览器上关闭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;

提示可能在url中:上面写着“欢迎陌生人”。他们将每个“第一次”访问者重定向到此页面。一旦您访问了该页面,他们将不再重定向您

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

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

  • 请求页面
  • 如果页面被重定向,请保护cookie(您现在有一个会话)
  • 使用该cookie再次请求页面

如果一切顺利,第二个请求将不会重定向。直到cookie/会话过期,然后重新开始。请参阅了解如何使用cookie/cookie-jar

提示可能在url中:上面写着“欢迎陌生人”。他们将每个“第一次”访问者重定向到此页面。一旦您访问了该页面,他们将不再重定向您

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

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

  • 请求页面
  • 如果页面被重定向,请保护cookie(您现在有一个会话)
  • 使用该cookie再次请求页面

如果一切顺利,第二个请求将不会重定向。直到cookie/会话过期,然后重新开始。查看查看如何使用cookie/cookie jar

一个人可以在没有cookie或javascript的浏览器中导航到目标页面,而不是通过
curl
,这是因为网站跟踪标题中的引用人。通过设置适当的引用者标题,可以在没有cookie的情况下加载页面:

curl_setopt($ch, CURLOPT_REFERER, "http://www.gutenberg.org/ebooks/34175?msg=welcome_stranger");

正如@madshvero所指出的,页面也可以通过简单地排除用户代理来加载。之所以可以在浏览器中导航到目标页面而不使用cookies或javascript,而不是通过curl,这是由于网站在标题中跟踪引用者。通过设置适当的引用者标题,可以在没有cookie的情况下加载页面:

curl_setopt($ch, CURLOPT_REFERER, "http://www.gutenberg.org/ebooks/34175?msg=welcome_stranger");


正如@madshvero所指出的,页面也会意外地通过简单地排除用户代理来加载。

我也无法重现您的问题。能否添加一个代码段,显示出无法正常工作的代码?@madshvero。我刚刚添加了代码。你也用过PHP吗?@AlexanderO'Mara命令行中不存在的问题,至少是个好消息。我用过PHP是的,似乎是你设置的用户代理使它重定向。但我不知道为什么。如果不定义用户代理,它不会redirect@madshvero你能发布你成功加载页面的代码吗?我也无法重现你的问题。能否添加一个代码段,显示出无法正常工作的代码?@madshvero。我刚刚添加了代码。你也用过PHP吗?@AlexanderO'Mara命令行中不存在的问题,至少是个好消息。我用过PHP是的,似乎是你设置的用户代理使它重定向。但我不知道为什么。如果不定义用户代理,它不会redirect@madshvero你能发布成功加载页面的代码吗?我已经考虑过了,但是我仍然能够在没有启用cookies的情况下导航到该页面。原来他们在跟踪标题中的推荐人!尽管如此,您的方法可能是最好的解决方案。我已经考虑过了,但是我仍然能够在没有启用cookie的情况下导航到该页面。原来他们在跟踪标题中的推荐人!不过,你的方法可能是最好的解决方案。多么奇怪的方法:)我现在看到你对这个问题的评论:那么它毕竟不是用户代理?还是一个组合?@Nanne两者都有,或者两者都有——取决于你怎么看。如果您有一个用户代理集,您需要启用cookies(针对您的解决方案)或referer集(这就是为什么它仍然在没有cookies的情况下工作)。或者,你本可以避免麻烦,只是不通过一个用户代理。多么奇怪的方法:)我现在看到你对这个问题的评论:那么它毕竟不是用户代理?还是一个组合?@Nanne两者都有,或者两者都有——取决于你怎么看。如果您有一个用户代理集,您需要启用cookies(针对您的解决方案)或referer集(这就是为什么它仍然在没有cookies的情况下工作)。或者,您可以避免麻烦,而不通过用户代理。