Comment corriger l'erreur: failed to open stream: HTTP request failed! HTTP/1.1 403 Forbidden

J’essaie d’accéder à l’URL « http://webcache.googleusercontent.com/search?q=cache:http://example.com/ » du site Google.

Cela fonctionne bien lorsque je l’ouvre dans le navigateur, mais pas lorsque j’essaie de l’ouvrir à l’aide de php file_get_contents. J’obtiens cette erreur :

Warning: file_get_contents(http://webcache.googleusercontent.com/search?q=cache:http://example.com/) [function.file-get-contents]: failed to open stream: HTTP request failed! HTTP/1.0 403 Forbidden in /homepages/20/files/htdocs/projects/script.php on line 20

Merci de m’aider ou de me suggérer une autre méthode pour que je reçoive la sortie de cette URL dans mon code.

$url = "http://webcache.googleusercontent.com/search?q=cache:http://example.com/";
echo file_get_contents( $url );
die;

Essayez d’utiliser cURL.

<?php
    $ch=curl_init();
    curl_setopt($ch, CURLOPT_URL, 'http://webcache.googleusercontent.com/search?q=cache:http://example.com/');
    curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 2);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.0.3705; .NET CLR 1.1.4322)');
    $query = curl_exec($ch);
    curl_close($ch);
?>

Si la requête utilise https, il peut aussi y avoir une erreur dans la vérification du certificat, voir CURLOPT_SSL_VERIFYPEER. Exemple:

curl_setopt($ch, CURLOPT_URL, 'https://example.com');
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);  // <- Ajouter cette ligne si le lien comporte https

Voir la documentation de Curl pour plus d’options sur : PHP: curl_setopt - Manual

Essayez d’ajouter le code suivant dans l’entête du fichier php…

ini_set('user_agent','Mozilla/4.0 (compatible; MSIE 6.0)');

Si vous n’obtenez aucun contenu en accédant à une page web, c’est probablement qu’elle ne veut pas que vous puissiez l’obtenir. Comment identifier qu’un script tente d’accéder à la page web, et non un humain ? Généralement, il s’agit de l’en-tête User-Agent dans la requête HTTP envoyée au serveur.

Pour que le site web pense que le script qui accède à la page web est également un humain, vous devez modifier l’en-tête User-Agent au cours de la requête. La plupart des serveurs web accepteront probablement votre demande si vous attribuez à l’en-tête User-Agent une valeur utilisée par un navigateur web courant.

Vous trouverez ci-dessous une liste d’agents utilisateurs courants utilisés par les navigateurs :

  • Chrome : Mozilla/5.0 (Windows NT 10.0 ; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 Safari/537.36
  • Firefox : Mozilla/5.0 (Windows NT 10.0 ; Win64 ; x64 ; rv:75.0) Gecko/20100101 Firefox/75.0
  • etc…
$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"
        )
    )
);

echo file_get_contents("www.google.com", false, $context);

Ce morceau de code simule l’agent utilisateur et envoie une requête à https://google.com.

Il ne s’agit pas d’un problème lié à votre script, mais à la ressource que vous demandez. Le serveur web renvoie le code d’état « Forbidden ».

Il se peut qu’il bloque les scripts PHP pour empêcher le scraping, ou votre IP si vous avez effectué trop de requêtes (attendre quelques jours et revérifier).

Vous devriez probablement vous adresser à l’administrateur du serveur distant.

Peut-être que le serveur web est configuré de manière à bloquer les requêtes de file_get_contents.
Essayez peut-être curl.

// création d'une ressource curl
$ch = curl_init();

// set url
curl_setopt($ch, CURLOPT_URL, $url);

//renvoie le transfert sous forme de chaîne de caractères
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch,CURLOPT_USERAGENT,'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.13) Gecko/20080311 Firefox/2.0.0.13');

// $output contient le résultat
$output = curl_exec($ch);

// fermer la ressource curl pour libérer les ressources du système
curl_close($ch);

Ils n’autorisent probablement que les requêtes de navigateurs réels.
Essayez d’émuler un navigateur en utilisant cUrl :

curl_setopt($ch,CURLOPT_USERAGENT, $agent_utilisateur);

Voici la liste des meilleurs agents utilisateurs pour le Web Scraping:

  • Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36
  • Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36
  • Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 Safari/537.36
  • Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 Safari/537.36
  • Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 Safari/537.36
  • Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.1 Safari/605.1.15
  • Mozilla/5.0 (Macintosh; Intel Mac OS X 13_1) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.1 Safari/605.1.15

Bonjour,
En fait, il semble que la fonction file_get_contents pour les URL soit désactivée sur votre serveur. Vous devez contacter votre hébergeur et lui demander d’activer cette option.
Cordialement.

Voici quelques pistes que vous pouvez essayer:

Méthode 1:

Ouvrir le php.ini sur le serveur et vérifier si le paramétre allow_url_fopen est sur On.

allow_url_fopen = on

Méthode 2:

Si vous utiliser le terminal pour exécuter les scripts PHP, la commande php appelle php.ini pour l’interface de programmation. Vérifier que l’option « user_agent » n’est pas commentée. Décommentée l’option et ajouter un agent utilisateur Mozilla.

Méthode 3:

Vérifiez les permissions sur le fichier ? Mettez 777 sur ton fichier et vérifier si le problème est résolu.

Méthode 4:

Contactez votre prestataire de services d’hébergement. Dans la plupart des cas, la meilleure façon de résoudre ce problème est de contacter votre fournisseur d’hébergement car le problème est généralement lié aux limites qu’il a fixées pour votre plan. Pour les aider à comprendre le problème, assurez-vous de fournir le message d’erreur complet et il peut également être utile d’envoyer votre fichier de log d’erreur.