2010-12-28 2 views
17

J'essaye de faire un sitecraper. Je l'ai fait sur ma machine locale et ça marche très bien là-bas. Quand j'exécute le même sur mon serveur, il montre une erreur interdite 403. J'utilise le PHP Simple HTML DOM Parser. L'erreur que je reçois sur le serveur est la suivante:file_get_contents renvoie 403 interdit

Attention: file_get_contents (http://example.com/viewProperty.html?id=7715888) [function.file-get-contents]: failed ouvrir le flux: la requête HTTP a échoué! HTTP/1.1 403 interdit dans /home/scraping/simple_html_dom.php sur la ligne 40

La ligne de code de déclenchement est:

$url="http://www.example.com/viewProperty.html?id=".$id; 

$html=file_get_html($url); 

I ont vérifié le php.ini sur la server et allow_url_fopen est activé. Une solution possible peut être l'utilisation d'une boucle, mais je dois savoir où je me trompe.

+0

Le serveur vous appartient? Si tel est le cas, il semble que vous ou votre service d'hébergement avez configuré les paramètres de sécurité pour empêcher leur mise au rebut. –

+0

Ce n'est pas mon serveur, mais c'est un serveur dédié. – absk

+0

J'ai mal lu la question. Je pensais que vous étiez en train de supprimer votre propre site (c'est-à-dire, un site que vous avez explicitement autorisé à gratter). @Pekka a raison. –

Répondre

13

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 qu'il bloque les scripts PHP pour éviter le scrappage, ou votre adresse IP si vous avez fait trop de requêtes.

Vous devriez probablement parler à l'administrateur du serveur distant.

+2

Mais en même temps, ça marche très bien sur mon localhost. Le problème semble être avec ma configuration de serveur en quelque sorte. – absk

+4

@absk non, le '403 interdit 'provient clairement du serveur distant. La connexion fonctionne correctement - essayez une adresse IP différente à vérifier. Il se peut que l'adresse IP de votre serveur soit bloquée à la fin du serveur distant –

5

Vous pouvez le modifier comme ceci dans la classe parser à partir de la ligne 35 et sur.

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?

+1

Mais comment est-ce censé réparer un 403 distant? –

+0

Il a mentionné cURL, donc la première partie de la réponse était pour cela et la deuxième "Avez-vous essayé un autre site?", Ou il pourrait nous donner un lien pour vérifier. Je sais que 403 est à distance c'est pourquoi je lui suggère d'essayer sur un autre site. –

+0

Donc, il récupère des données à partir d'autres sites. Il semble que mon adresse IP vient d'être mise sur liste noire. En chemin? – absk

3

Il semble que le serveur distant ait un certain type de blocage. Il peut être par agent utilisateur, si c'est le cas, vous pouvez essayer d'utiliser une boucle pour simuler un agent utilisateur du navigateur Web comme celui-ci:

$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); 
0

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

3

écrire ceci dans 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); 

} 
5

Je sais qu'il est tout à fait un vieux fil, mais la pensée de partager quelques idées. Il est fort probable que si vous n'obtenez aucun contenu lors de l'accès à une page Web, il est probable que vous ne puissiez pas obtenir le contenu. Alors, comment identifie-t-il qu'un script tente d'accéder à la page Web, pas un humain? Généralement, il s'agit de l'en-tête User-Agent dans la requête HTTP envoyée au serveur. Par conséquent, pour que le site Web pense que le script accédant à la page Web est également human, vous devez modifier l'en-tête User-Agent lors de la demande. La plupart des serveurs Web autorisent probablement votre requête si vous définissez l'en-tête User-Agent sur une valeur qui est utilisée par un navigateur Web courant.

Une liste des agents utilisateurs courants utilisés 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 ...


$context = stream_context_create(
    array(
     "http" => array(
      "header" => "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); 

Cette pièce de code, simule l'agent utilisateur et envoie la demande à https://google.com.

Références:

Cheers!

2

Je sais que c'est une vieille question, mais ...

Juste mon réglage sandbox local sur linux avec php7 et couru à travers cela. 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 ajouté un agent utilisateur Mozilla, maintenant ça marche.

0

J'avais le même pb. Je viens API Youtube activé des développeurs console google ... et cela a fonctionné (pas plus :-) interdit

Je ne sais pas si le sujet est dépréciée, je pensais juste partager l'idée Meilleurs voeux