file_get_contents retourne 403 forbidden
Je suis en train de faire un sitescraper. Je l'ai fait sur ma machine locale et il fonctionne très beaux là. Lorsque j'exécute la même chose sur mon serveur, il affiche une erreur 403 forbidden.
Je suis l'aide de la PHP Simple HTML DOM Parser. L'erreur que je reçois sur le serveur est: est-ce
Avertissement:
file_get_contents(http://example.com/viewProperty.html?id=7715888)
[function.file-get-contents]: failed
to open stream: HTTP request failed!
HTTP/1.1 403 Forbidden dans
/home/scraping/simple_html_dom.php sur
ligne 40
La ligne de code de déclenchement il est:
$url="http://www.example.com/viewProperty.html?id=".$id;
$html=file_get_html($url);
J'ai vérifié le php.ini sur le serveur et allow_url_fopen est Sur. Solution Possible peut être à l'aide de curl, mais j'ai besoin de savoir où je vais mal.
- Le serveur est le vôtre? Si oui, il semble que vous ou votre service d'hébergement avez configuré les paramètres de sécurité afin d'éviter d'être mis au rebut.
- Ses pas " mon " serveur, mais c'est un serveur dédié.
- J'ai mal lu la question. Je pensais que vous étiez la démolition de votre propre site (c'est à dire, un site que vous avez la permission explicite à gratter). @Pekka a droit.
Vous devez vous connecter pour publier un commentaire.
Ce n'est pas un problème avec votre script, mais avec la ressource que vous demandez. Le serveur web est de retour "interdites" code d'état.
Il se pourrait qu'il bloque les scripts PHP pour éviter de grattage, ou votre adresse IP si vous avez fait trop de demandes.
Vous devriez vous adresser à l'administrateur du serveur distant.
403 forbidden
est clairement à partir du serveur distant. La connexion fonctionne très bien - essayez une autre IP pour vérifier. Il se pourrait que l'IP de votre serveur est bloqué sur le serveur distant à la fin de l'Je sais que c'est un assez vieux thread mais la pensée de partager quelques idées.
Plus probable si vous n'obtenez pas de contenu tout en accédant à une page web, probablement, il ne veut pas que vous être en mesure d'obtenir le contenu. Alors, comment fait-il de savoir que le script tente d'accéder à la page web, pas un être humain? Généralement, c'est la
User-Agent
en-tête de la requête HTTP envoyée au serveur.Afin de rendre le site pense que le script accéder à la page web est également un de l'homme vous devez modifier le
User-Agent
d'en-tête lors de la demande. La plupart des serveurs web serait susceptible de permettre à votre demande si vous définissez laUser-Agent
en-tête à une valeur qui est utilisée par certains navigateur web commun.Une liste des principaux agents d'utilisateur utilisé par les navigateurs sont énumérés ci-dessous:
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 6.3; Win64; x64; rv:10.0) Gecko/20100101 Firefox/10.0'
etc...
Ce morceau de code, les faux l'agent de l'utilisateur et envoie la demande à https://google.com.
Références:
fonction stream_context_create
Cheers!
"header" => "User-Agent: <signature>"
ou"user_agent" => "<signature>"
le ferais.Vous pouvez le modifier comme ceci dans l'analyseur de classe à partir de la ligne de 35 et sur.
Avez-vous essayé d'autres site?
Il semble que le serveur distant a un certain type de blocage. Il peut être par user-agent, si c'est le cas vous pouvez essayer d'utiliser curl pour simuler un navigateur web de l'utilisateur-agent comme ceci:
D'écrire simple_html_dom.php pour moi, il a travaillé
Lorsque vous travaillez sur un serveur à l'autre d'appels, il est fondamentalement PHP script appelant. Pour cette raison, de nombreux serveur distant bloquer les appels avec des scripts php pour éviter de copier des sites web. Cela peut facilement être surmontés en faisant de votre script apparaissent comme si c'est de la principale. Vous pouvez utiliser le code suivant.
Je réalise que c'est une vieille question, mais...
Juste ma sandbox local sur linux avec php7 et couru à travers de ce. À l'aide de la borne d'exécuter des scripts php appels php.ini pour le CLI. J'ai trouvé que le "user_agent" option a été commentée. J'ai décommenté elle et a ajouté Mozilla agent utilisateur, maintenant ça fonctionne.
Avez-vous vérifier vos autorisations sur le fichier? J'ai configuré 777 sur mon fichier (en localhost, évidemment) et j'ai corrigé le problème.
J'avais eu le même pb. Je viens de activé API Youtube à partir de google, les développeurs de la console... et cela a fonctionné (il n'est plus interdit 🙂
Je ne sais pas si le sujet est amorti, je pensais juste à partager l'idée
Meilleurs voeux
Dans mon cas, le serveur rejette protocole HTTP 1.0 par c'est .htaccess de configuration. Il semble
file_get_contents
utilise le protocole HTTP 1.0.Utilisez code ci-dessous:
si vous utilisez -> file_get_contents
=========
si Vous utilisez curl,