【发布时间】: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