【问题标题】:How to extract meta tags in PHP if server denies access?如果服务器拒绝访问,如何在 PHP 中提取元标记?
【发布时间】:2018-01-08 11:26:45
【问题描述】:

过去有很多关于这个的讨论。但情况发生了很大变化。例如在这个问题中

Get title of website via link

过去有很多解决方案,但现在当我检查一些网站时不起作用

https://webdesign.tutsplus.com/articles/the-complete-beginners-guide-to-chinese-fonts--cms-23444

我尝试了上述 SO 讨论中提到的所有方法,但没有一个适用于此网址。但后来我在这个页面上尝试了同样的方法,他们得到了页面的标题。

http://tools.buzzstream.com/meta-tag-extractor

他们是怎么做到的?如果不使用 PHP,那么如何在 php 中完成它?请提出除上述 SO 讨论中提到的答案之外的答案,尝试了所有这些对 tutsplus 网站有效,但没有一个。 DOMXPATH、file_get_contents()、cURL 或添加浏览器标头不起作用。

【问题讨论】:

    标签: php web-scraping meta-tags domxpath


    【解决方案1】:

    对我来说它有效(-;

    在这种情况下需要设置USER_AGENT,因为如果您发送的请求没有USER_AGENT,那么响应是HTTP request failed! HTTP/1.1 403 Forbidden

    附:始终检查错误和响应 (-;

    <?php
    function get_title($url){
        $c = curl_init();
        curl_setopt($c, CURLOPT_URL, $url);
        curl_setopt($c, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($c, CURLOPT_USERAGENT, 'Linux / Firefox 29: Mozilla/5.0 (X11; Linux x86_64; rv:29.0) Gecko/20100101 Firefox/29.0');
    
        $str = curl_exec($c);
        if(strlen($str)>0){
            $str = trim(preg_replace('/\s+/', ' ', $str)); // supports line breaks inside <title>
            preg_match("/\<title\>(.*)\<\/title\>/i",$str,$title); // ignore case
            return $title[1];
        }
    }
    //Example:
    echo get_title("https://webdesign.tutsplus.com/articles/the-complete-beginners-guide-to-chinese-fonts--cms-23444");
    

    【讨论】:

    • 感谢您的回答。我在本地 WAMP 服务器(EasyPHP)上尝试过,没有用,但在生产服务器上,它可以工作。但是不适用于 facebook 页面。例如。 facebook.com/facebook 。他们为此提供了图形 API,但现在也需要令牌才能访问,而以前不需要。
    • 你有这个问题吗:*.com/questions/44872658/…?
    • 在生产服务器上尝试过 xpath,vardump 返回 'object(DOMXPath)#2 (1) { ["document"]=> string(22) "(object value executed)" }' 用于以下内容代码 $doc = new DOMDocument(); @$doc->loadHTMLFile('webdesign.tutsplus.com/articles/…); $xpath = 新 DOMXPath($doc); var_dump($xpath); echo $xpath->query('//title')->item(0)->nodeValue."\n";
    • 对于 facebook 你需要preg_match("/\&lt;title[^&gt;]*\&gt;(.*)\&lt;\/title\&gt;/i",$str,$title);,因为title 标签有id 属性
    • 非常感谢。它适用于脸书。现在我会坚持使用浏览器标题卷曲。
    最近更新 更多