2010-07-24 4 views
1

Comment puis-je envoyer un en-tête à un site Web comme si PHP/Apache était un navigateur? J'essaye de gratter un site, mais il semble qu'ils envoient une erreur 404 si elle vient d'un autre serveur ...Envoyer les en-têtes du navigateur via PHP

Ou, si vous connaissez d'autres bonnes manières de gratter le contenu d'un site?

De plus, voici mon code actuel:

<?php 
    $curl_handle=curl_init(); 
    curl_setopt($curl_handle,CURLOPT_URL,$_GET['url']); 
    curl_setopt($curl_handle, CURLOPT_USERAGENT, "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0)"); 
    curl_setopt($curl_handle, CURLOPT_REFERER, "http://google.com"); 
    curl_setopt($curl_handle,CURLOPT_CONNECTTIMEOUT,2); 
    curl_setopt($curl_handle,CURLOPT_RETURNTRANSFER,1); 
    $buffer = curl_exec($curl_handle); 
    curl_close($curl_handle); 
    echo $buffer; 
?> 

, je vais faire une requête AJAX comme:

/spider.php?url=http://target.com 

qui retourne une chaîne vide. Je sais que c'est la bonne configuration parce que si je change de cible avec twitter.com cela fonctionne ... qu'est-ce qui me manque pour que cela ressemble à un navigateur complet?

+0

Utilisez-vous [cURL] (http://www.php.net/curl)? – BoltClock

+0

J'utilise cURL –

Répondre

3

Pour cURL, il y a l'option CURLOPT_USERAGENT pour cela,

curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0)"); 

Cependant, il peut également vérifier en-tête Referer, que vous pouvez définir via

curl_setopt($ch, CURLOPT_REFERER, "http://<somesite>"); 
+0

Vérifiez ma mise à jour post ... target.com ne fonctionne pas, renvoie une chaîne vide, mais twitter fonctionne. Des idées? –

+1

En ce qui concerne votre code: 1. Vous devriez essayer d'augmenter le délai d'expiration à au moins 10. 2. Vous devriez également prendre des en-têtes. Faites-le avec curl_setopt ($ curl_handle, CURLOPT_HEADER, true); 3. Avant de tuer votre handle, vous devriez en récupérer les erreurs, avec curl_error ($ curl_handle); Il vous fournira d'autres indications sur ce qui s'est mal passé. –

+0

Vous rock! c'était un 301 déplacé à www et si je fais http://www.target.com cela fonctionne. Alors, comment puis-je suivre tous les 301 jusqu'à 200? –

2

Si vous utilisez la boucle, vous pouvez utiliser l'option CURLOPT_HTTPHEADER, qui prend un tableau d'en-têtes que vous souhaitez envoyer avec la demande. Si vous utilisez file_get_contents(), vous pouvez lui transmettre un contexte de flux créé avec stream_create_context().

+0

Savez-vous comment changer le navigateur avec ça? –

+0

Ce serait l'en-tête 'User-Agent'. L'en-tête 'User-Agent' que mon navigateur envoie est' Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv: 1.9.2.8pre) Gecko/20100718 Ubuntu/10.04 (lucide) Namoroka/3.6.8pre' pour exemple. –

+0

Merci, j'ai ajouté le code de Daniel aussi, mais il renvoie toujours une chaîne vide pour target.com et twitter.com fonctionne ... aucune idée pourquoi? –

Questions connexes