fichier get contents retourne 403 Interdit

j'essaie de faire un sitescraper. Je l'ai fait sur ma machine locale et il fonctionne très fine. 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 ceci:

Avertissement: file_get_contents(http://example.com/viewProperty.html?id=7715888) [fonction.fichier-get-contents]: échec pour ouvrir le flux: la requête HTTP a échoué! HTTP / 1.1 403 Interdit dans /home/grattage/simple_html_dom.php sur ligne 40

la ligne de code qui la déclenche 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. La solution Possible peut être d'utiliser curl, mais j'ai besoin de savoir où je vais mal.

20
demandé sur absk 2010-12-28 14:46:36

10 réponses

Ce n'est pas un problème avec votre script, mais avec la ressource que vous demandez. Le serveur web renvoie le code d'état" interdit".

il se peut que cela bloque les scripts PHP pour empêcher le raclage, ou votre IP si vous avez fait trop de requêtes.

vous devriez Vous adresser à l'administrateur du serveur distant.

16
répondu Pekka 웃 2010-12-28 11:48:30

je sais que c'est un vieux fil, mais j'ai pensé à partager quelques idées.

très probablement si vous ne recevez aucun contenu pendant que vous accédez à une page web, probablement il ne veut pas que vous soyez en mesure d'obtenir le contenu. Alors comment identifie-t-il qu'un script essaie d'accéder à la page Web, pas un humain? Généralement, c'est l' User-Agent en-tête de la requête HTTP envoyée au serveur.

donc pour faire croire au site Web que le script qui accède à la page web est aussi un humain vous devez modifier le User-Agent en-tête pendant la requête. La plupart des serveurs web autoriseraient probablement votre requête si vous définissez le User-Agent en-tête à une valeur qui est utilisée par certains navigateur web commun.

Voici une liste des 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 6.3; Win64; x64; rv:10.0) Gecko/20100101 Firefox/10.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 la demande à https://google.com.

Références:

Cheers!

16
répondu Ikari 2018-03-27 11:15:26

Vous pouvez le changer comme ceci dans la classe parser à partir de la ligne 35.

function curl_get_contents($url)
{
  $ch = curl_init();
  curl_setopt($ch, CURLOPT_URL, $url);
  curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
  curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
  $data = curl_exec($ch);
  curl_close($ch);
  return $data;
}

function file_get_html()
{
  $dom = new simple_html_dom;
  $args = func_get_args();
  $dom->load(call_user_func_array('curl_get_contents', $args), true);
  return $dom;
}

avez-vous essayé un autre site?

4
répondu Dejan Marjanovic 2013-03-18 15:07:11

Écrire simple_html_dom.php pour moi, il a travaillé

function curl_get_contents($url)
{
  $ch = curl_init();
  curl_setopt($ch, CURLOPT_URL, $url);
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');
$html = curl_exec($ch);
  $data = curl_exec($ch);
  curl_close($ch);
  return $data;
}

function file_get_html($url, $use_include_path = false, $context=null, $offset = -1, $maxLen=-1, $lowercase = true, $forceTagsClosed=true, $target_charset = DEFAULT_TARGET_CHARSET, $stripRN=true, $defaultBRText=DEFAULT_BR_TEXT, $defaultSpanText=DEFAULT_SPAN_TEXT)
{
    $dom = new simple_html_dom;
  $args = func_get_args();
  $dom->load(call_user_func_array('curl_get_contents', $args), true);
  return $dom;
    //$dom = new simple_html_dom(null, $lowercase, $forceTagsClosed, $target_charset, $stripRN, $defaultBRText, $defaultSpanText);

}
4
répondu r0adtr1p 2015-10-05 16:01:11

il semble que le serveur distant ait un 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:

$url="http://www.example.com/viewProperty.html?id=".$id;
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
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');
$html = curl_exec($ch);
curl_close($ch);
3
répondu Sergi 2015-05-13 11:44:43

je réalise que c'est une vieille question, mais...

j'installais juste mon bac à sable local sur linux avec php7 et j'ai couru à travers ceci. En utilisant les scripts d'exécution du terminal, php appelle php.ini pour le CLI. J'ai trouvé que l'option "user_agent" a été commentée. Je l'ai décommenté et j'ai ajouté un agent utilisateur Mozilla, maintenant ça fonctionne.

2
répondu CrookedCreek 2016-11-15 20:21:35

avez-vous vérifié vos permissions dans le fichier? J'ai configuré 777 sur mon fichier (en localhost, évidemment) et j'ai corrigé le problème.

1
répondu Andrea Syd Coi 2015-07-21 20:50:17

j'avais eu le même pb. Je viens de activé API Youtube des développeurs de console google... et cela a fonctionné (il n'est plus interdit :-)

Je ne sais pas si le sujet est déprécié, j'ai pensé juste pour partager l'idée Meilleurs voeux

0
répondu Hamid ER-REMLI 2017-05-11 15:48:08

dans mon cas, le serveur rejetait le protocole HTTP 1.0 via celui-ci .configuration htaccess. Il semble file_get_contents utilise la version HTTP 1.0.

0
répondu Steven 2018-06-22 13:37:56

quand on travaille sur des appels de serveur à serveur, c'est essentiellement des appels de script PHP. En raison de cela, de nombreux serveurs distants bloquent les appels avec des scripts php pour éviter la copie de sites web. Cela peut facilement être surmonté en faisant apparaître votre script comme s'il était de main. Vous pouvez utiliser le code suivant.

$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("https://www.google.co.in", false, $context);
0
répondu Uma Shankar Goel 2018-08-29 03:42:24