【问题标题】:How to get title from URL in PHP from sites returning 403 Forbidden如何从返回 403 Forbidden 的站点中的 PHP 中的 URL 获取标题
【发布时间】:2020-07-20 14:28:21
【问题描述】:

我正在尝试使用此代码在 PHP 中获取几页的标题。它适用于几乎所有链接,除了少数链接,例如 9gag。

function download_page($url)
{
    $agent = 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 Safari/537.36';

    $ch = curl_init();
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
    curl_setopt($ch, CURLOPT_VERBOSE, true);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_USERAGENT, $agent);
    curl_setopt($ch, CURLOPT_URL, $url);
    $data = curl_exec($ch);

    return $data;
}

function get_title_tag($str)
{
    $pattern = '/<title[^>]*>(.*?)<\/title>/is';

    if(preg_match_all($pattern, $str, $out))
    {
        return $out[1][0];
    }
    return false;
}

$url = "https://9gag.com/gag/avPBX3b";

$data = download_page($url);

echo $extracted_title = get_title_tag($data);

回声

需要注意! | Cloudflare

这似乎受到 Cloudflare 机器人验证页面的保护。但是当我尝试在任何社交网络上发布此链接时,他们可以获得标题和所需的所有元数据。怎么可能?

编辑:

即使我使用 opengraph.io API,我也会得到:

"root":{
    "error":{
        "code": 2005
        "message": "Got 403 error from server."
    }
}

【问题讨论】:

  • 我认为是因为大多数网站只是让有限的机器人像谷歌搜索和必应一样抓取他们的网站...
  • 您应该回显$data 以查看完整的错误消息。
  • 似乎 9gag 试图检测是否是真正的用户访问该页面并在 curl 尝试访问数据时采取行动。我会尝试使用 Selenium 来抓取它。但是可能有更好的工具可以满足您的需求。

标签: php url web-crawler cloudflare


【解决方案1】:

只需替换代理字符串,它应该可以正常工作,来自:

$agent = 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 Safari/537.36';

到:

$agent = 'facebookexternalhit/1.1 (+http://www.facebook.com/externalhit_uatext.php)';

如果存在标准代理字符串,我看到 CloudFlare 已启用验证码,因此这很容易绕过它。我对这里的安全性感到困惑,但这超出了这个问题的范围

【讨论】:

  • 我试过了,它似乎工作不一致。为几个页面工作而不为其他页面工作:/ 因为我不仅想绕过 CloudFlare,我还想绕过所有 403 Forbidden 页面。
【解决方案2】:

您可以使用 Facebook 的 Graph API。

https://graph.facebook.com/v7.0/?fields=og_object&id=https://9gag.com/gag/avPBX3b

JSON 输出:

{
   "og_object": {
      "id": "994417753967326",
      "description": "More memes, funny videos and pics on 9GAG",
      "title": "32 Places People Have Mispronounced Their Entire Life",
      "type": "article",
      "updated_time": "2020-06-12T15:54:27+0000"
   },
   "id": "https://9gag.com/gag/avPBX3b"
}

你可以阅读更多关于它的用法here

【讨论】:

  • 这个API给出了不一致的结果,但比将标头更改为facebookexternalhit/1.1 (+http://www.facebook.com/externalhit_uatext.php)具有更好的一致性率
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-08-16
  • 2018-06-30
  • 2020-03-17
  • 1970-01-01
  • 2021-03-24
  • 1970-01-01
  • 2010-09-07
相关资源
最近更新 更多