【问题标题】:How to get html out of youtube URL using php curl?如何使用 php curl 从 youtube URL 中获取 html?
【发布时间】:2015-12-23 20:33:46
【问题描述】:

我想获取 Youtube URL (https) 的源代码,类似于我们在浏览器中看到的“查看页面源代码”选项。

以下是我的 php 代码 - (index.php)

<?php
function gethtml($url){
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 5);
    $ip=rand(0,255).'.'.rand(0,255).'.'.rand(0,255).'.'.rand(0,255);
    curl_setopt($ch, CURLOPT_HTTPHEADER, array("REMOTE_ADDR: $ip", "HTTP_X_FORWARDED_FOR: $ip"));
    curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/".rand(3,5).".".rand(0,3)." (Windows NT ".rand(3,5).".".rand(0,2)."; rv:2.0.1) Gecko/20100101 Firefox/".rand(3,5).".0.1");
    $html = curl_exec($ch);
    curl_close($ch);
    return $html;
}
if ($_SERVER["REQUEST_METHOD"] == "POST") {
    $url = $_REQUEST["url"];
    $html = gethtml($url);
    echo htmlspecialchars($html);
}
?>
<html>
    <head></head>
    <body>
        <form name="test" method="POST" action="./index.php"/>
            URL : <input type="text" name="url"/>
            <br>
            <input type="submit" value="See HTML" name="submit"/>
            <br>
        </form>
    </body>
</html>

它适用于其他 URL,但不适用于任何 youtube URL。为什么?

【问题讨论】:

  • CURLOPT_HTTPHEADER 技巧毫无意义,不会“欺骗”他们相信您的请求来自那里......
  • 但是为什么呢?它会向他们发送一个随机 IP 作为消息头,不是吗?
  • $_SERVER['REMOTE_ADDR'] 给出了将请求发送到 Web 服务器的 IP 地址。这通常是访问者的地址。 See this
  • 多看看@Mercury,试试anatomy of HTTP ..。您缺少的是 TCP 为 HTTP 提供连接,我认为服务器将忽略您在标头中放置的任何内容并使用 TCP 连接中的详细信息。
  • 所以您是说 Web 服务器没有考虑在请求网页的数据包中传递的标头,它需要 TCP 连接状态?

标签: php curl web-scraping


【解决方案1】:

你可以试试这个:

<?php
function getSSLPage($url) {
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_HEADER, false);
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_SSLVERSION,3); 
    $result = curl_exec($ch);
    curl_close($ch);
    return $result;
}

var_dump(getSSLPage($_POST["url"]));
?>

【讨论】:

  • var_dump 输出以下内容:- boolean false。
  • 我刚刚用 'youtube.com/watch?v=fyLGa0E3OXk' 测试了该代码,它工作正常。你在尝试什么网址?
  • 它也会返回与您的 URL 相同的结果。我使用 WAMP 服务器托管了相同的内容,我需要为 https 页面设置什么吗?
【解决方案2】:

如果你不坚持使用 cURL,你可以使用:

file_get_contents();

这将返回一个 url 资源作为字符串,所以:

echo file_get_contents('https://www.youtube.com/watch?v=fyLGa0E3OXk');

这将打印给定 URL 的来源。

由于对标题的评论而编辑:

您可以将file_get_contents 传递给使用stream_context_create() 创建的上下文资源。

【讨论】:

  • 谢谢,有帮助。访问文件时是否可以更改传递的标头?我想改变标题中的 IP 地址,就像我在上面的函数中使用 rand 所做的那样,以防止多次点击页面并被阻止。
  • 感谢您的更改。现在明白了。
  • 除了学习新事物之外,我仍然有兴趣了解自己的错误。
猜你喜欢
  • 2019-02-27
  • 2012-01-09
  • 1970-01-01
  • 2011-11-05
  • 2015-11-18
  • 1970-01-01
  • 2021-04-03
  • 1970-01-01
  • 2011-10-12
相关资源
最近更新 更多