Voici une procédure pas à pas de la façon dont je déboguer les problèmes de grattage page avec cURL:
- Essayez l'URL dans un navigateur (avec LiveHTTPHeaders), et cURL avec CURLOPT_VERBOSE activé. Cela sert à deux fins: révéler les en-têtes HTTP en jeu et servir de simple test de l'URL elle-même.
- Si cela fonctionne dans le navigateur, mais pas dans cURL, travaillez avec cURL jusqu'à ce que les en-têtes HTTP cURL correspondent au navigateur.
Essayons ceci avec votre exemple.
L'URL que vous a fourni des œuvres dans un navigateur, mais ...
Activation CURLOPT_VERBOSE révèle ce qui suit:
* About to connect() to www.betjamaica.com port 80
* Trying 72.52.5.34... * connected
* Connected to www.betjamaica.com (72.52.5.34) port 80
> GET /livelines2008/lines.asmx/Load_Latest_Lines?SportType=Football&SportSubType=NFL&GameType=GAME HTTP/1.1
Host: www.betjamaica.com
Accept: */*
* Empty reply from server
* Connection #0 to host www.betjamaica.com left intact
* Closing connection #0
Le serveur est ne pas répondre. La seule différence entre la requête du navigateur et la requête cURL est que le navigateur envoie plus d'en-têtes. Donc, la chose à faire est d'expérimenter avec l'ajout d'en-têtes de navigateur jusqu'à ce qu'il commence à fonctionner. Si vous copiez tous les en-têtes envoyés par votre navigateur, la requête doit être identique et, par conséquent, fonctionnelle.
Ici, j'ai simplement copié et collé mes têtes de requête Firefox dans le PHP:
$request_url =
'http://www.betjamaica.com/livelines2008/lines.asmx/Load_Latest_Lines?SportType=Football&SportSubType=NFL&GameType=GAME';
$ch = curl_init();
$timeout = 5;
curl_setopt($ch, CURLOPT_URL, $request_url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout);
curl_setopt($ch, CURLOPT_VERBOSE, true);
$headers = array(
'User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.0.16) Gecko/2009120208 Firefox/3.0.16',
'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
'Accept-Language: en-us,en;q=0.5',
'Accept-Encoding: gzip,deflate',
'Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7',
'Keep-Alive: 300',
'Connection: keep-alive',
);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
$data = curl_exec($ch);
curl_close($ch);
var_dump($data);
Et ça marche. Un peu plus d'expérimentation révèle que tous les en-têtes autres que User-Agent peuvent être retirés:
$headers = array(
'User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.0.16)',
);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
Et vous êtes: apparemment, ce serveur IIS refuse de servir toutes les demandes sans User-Agent. Ajoutez-en un, et vous êtes prêt à partir.
Vous ne vérifiez même pas le code de retour pour les erreurs. ce serait un bon endroit pour commencer;) –