get_meta_tags() 抛出错误无法打开流:HTTP 请求失败! HTTP/1.1 403 禁止访问
get_meta_tags() throwing error failed to open stream: HTTP request failed! HTTP/1.1 403 Forbidden
我正在尝试使用 get_meta_tags()
函数从网站 URL 获取元数据。我插入的大多数 URL 工作正常,但有一个 URL 抛出错误 failed to open stream: HTTP request failed! HTTP/1.1 403 Forbidden
.
我想知道是否有办法通过权限?如果否,有什么方法可以检测是否可以访问特定网站?至少我可以做一些事情来解决它而不会出现错误,因为我需要从元数据中获取一些信息。
我的代码就是这样写的:
get_meta_tags("https://www.udemy.com/course/beginning-c-plus-plus-programming/");
它看起来像站点块 PHP 脚本来防止抓取。
您可以尝试让站点认为它是由 人(Web 浏览器)访问的。
您可以在请求期间使用 stream_context_create()
:
更改 User-Agent
header
$context = stream_context_create(
array(
"http" => array(
"header" => "User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 Safari/537.36"
)
)
);
$tags = get_meta_tags(file_get_contents('https://www.udemy.com/course/beginning-c-plus-plus-programming/', false, $context));
var_dump($tags)
Here 您可以找到最常见的用户代理列表。
P.S。请记住,这并不是真的公平。
您可以使用 cURL
function url_get_contents($url, $useragent='cURL', $headers=false, $follow_redirects=true, $debug=false) {
// initialise the CURL library
$ch = curl_init();
// specify the URL to be retrieved
curl_setopt($ch, CURLOPT_URL,$url);
// we want to get the contents of the URL and store it in a variable
curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
// specify the useragent: this is a required courtesy to site owners
curl_setopt($ch, CURLOPT_USERAGENT, $useragent);
// ignore SSL errors
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
// return headers as requested
if ($headers==true){
curl_setopt($ch, CURLOPT_HEADER,1);
}
// only return headers
if ($headers=='headers only') {
curl_setopt($ch, CURLOPT_NOBODY ,1);
}
// follow redirects - note this is disabled by default in most PHP installs from 4.4.4 up
if ($follow_redirects==true) {
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
}
// if debugging, return an array with CURL's debug info and the URL contents
if ($debug==true) {
$result['contents']=curl_exec($ch);
$result['info']=curl_getinfo($ch);
}
// otherwise just return the contents as a variable
else $result=curl_exec($ch);
// free resources
curl_close($ch);
// send back the data
return $result;
}
我正在尝试使用 get_meta_tags()
函数从网站 URL 获取元数据。我插入的大多数 URL 工作正常,但有一个 URL 抛出错误 failed to open stream: HTTP request failed! HTTP/1.1 403 Forbidden
.
我想知道是否有办法通过权限?如果否,有什么方法可以检测是否可以访问特定网站?至少我可以做一些事情来解决它而不会出现错误,因为我需要从元数据中获取一些信息。
我的代码就是这样写的:
get_meta_tags("https://www.udemy.com/course/beginning-c-plus-plus-programming/");
它看起来像站点块 PHP 脚本来防止抓取。
您可以尝试让站点认为它是由 人(Web 浏览器)访问的。
您可以在请求期间使用 stream_context_create()
:
User-Agent
header
$context = stream_context_create(
array(
"http" => array(
"header" => "User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 Safari/537.36"
)
)
);
$tags = get_meta_tags(file_get_contents('https://www.udemy.com/course/beginning-c-plus-plus-programming/', false, $context));
var_dump($tags)
Here 您可以找到最常见的用户代理列表。
P.S。请记住,这并不是真的公平。
您可以使用 cURL
function url_get_contents($url, $useragent='cURL', $headers=false, $follow_redirects=true, $debug=false) {
// initialise the CURL library
$ch = curl_init();
// specify the URL to be retrieved
curl_setopt($ch, CURLOPT_URL,$url);
// we want to get the contents of the URL and store it in a variable
curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
// specify the useragent: this is a required courtesy to site owners
curl_setopt($ch, CURLOPT_USERAGENT, $useragent);
// ignore SSL errors
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
// return headers as requested
if ($headers==true){
curl_setopt($ch, CURLOPT_HEADER,1);
}
// only return headers
if ($headers=='headers only') {
curl_setopt($ch, CURLOPT_NOBODY ,1);
}
// follow redirects - note this is disabled by default in most PHP installs from 4.4.4 up
if ($follow_redirects==true) {
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
}
// if debugging, return an array with CURL's debug info and the URL contents
if ($debug==true) {
$result['contents']=curl_exec($ch);
$result['info']=curl_getinfo($ch);
}
// otherwise just return the contents as a variable
else $result=curl_exec($ch);
// free resources
curl_close($ch);
// send back the data
return $result;
}