2009-02-15 8 views
3

J'écris un site web en PHP qui regroupe des données provenant de divers autres sites. J'ai une fonction 'returnPageSource' qui prend une URL et retourne le html de cette URL comme une chaîne.Pourquoi cette fonction utilisant CURL fonctionnera-t-elle pour certaines URL mais pas pour d'autres?

function returnPageSource($url){ 
    $ch = curl_init(); 
    $timeout = 5; // set to zero for no timeout  

    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);  // means the page is returned 
    curl_setopt($ch, CURLOPT_URL, $url); 
    curl_setopt($ch, CURLOUT_CONNECTTIMEOUT, $timeout); // how long to wait to connect 
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, TRUE);  // follow redirects 
    //curl_setopt($ch, CURLOPT_HEADER, False);   // only request body 

    $fileContents = curl_exec($ch); // $fileContents contains the html source of the required website 
    curl_close($ch); 

    return $fileContents; 
} 

Cela fonctionne bien pour certains des sites Web dont j'ai besoin, comme http://atensembl.arabidopsis.info/Arabidopsis_thaliana_TAIR/unisearch?species=Arabidopsis_thaliana_TAIR;idx=;q=At5g02310, mais pas pour d'autres, comme http://www.bar.utoronto.ca/efp/cgi-bin/efpWeb.cgi?dataSource=Chemical&modeInput=Absolute&primaryGene=At5g02310&orthoListOn=0. Est-ce que quelqu'un a une idée de pourquoi?

Mise à jour

Merci pour les réponses. J'ai changé mon useragent pour être le même que mon navigateur (Firefox 3, qui peut accéder aux sites correctement), a changé le timeout à 0 et je n'arrive toujours pas à me connecter, mais je peux obtenir des messages d'erreur. curl_error() me donne l'erreur "could not connect to host", et curl_getinfo ($ ch, CURLINFO_HTTP_CODE); renvoie le code HTTP 0 ... ce qui n'est pas très utile. J'ai aussi essayé curl_setopt ($ ch, CURLOPT_VERBOSE, 1) ;, mais cela n'affiche rien. Quelqu'un a-t-il d'autres idées?

Mise à jour finale

Je viens de réaliser que je n'ai pas expliqué ce qui était faux - je avais juste besoin d'entrer les paramètres de proxy pour mon université (j'utilise le serveur de l'université). Tout a bien fonctionné après ça!

+0

Est-ce que cela ne fonctionne toujours pas pour les mêmes sites Web si vous définissez le délai d'expiration à 0? –

Répondre

1

Je suppose que vous avez essayé de régler le délai d'attente à 0.

Quels sont les codes HTTP status sont ces sites de retour? Vérifiez curl_getinfo($ch, CURLINFO_HTTP_CODE);.

Quelque chose d'autre à essayer pourrait usurper l'en-tête User-Agent, peut-être avec celui de votre propre navigateur puisque vous savez que cela fonctionne pour accéder à ces pages. Ils peuvent juste essayer d'arrêter les robots accédant à la page. En étudiant les en-têtes et les codes http, vous devriez obtenir un peu plus d'informations.

Edit:

J'ai regardé dans ce un peu plus. Une chose est que vous avez une faute de frappe pour le délai de connexion - devrait être CURLOPT_CONNECTTIMEOUT.

Quoi qu'il en soit, j'ai exécuté ce script (ci-dessous) qui a retourné ce que vous cherchez (je pense). Vérifiez pour voir ce qui est différent entre le vôtre et le vôtre. J'utilise PHP 5.2.8 si ça aide.

<?php 

$addresses = array(
    'http://atensembl.arabidopsis.info/Arabidopsis_thaliana_TAIR/unisearch?species=Arabidopsis_thaliana_TAIR;idx=;q=At5g02310', 
    'http://www.bar.utoronto.ca/efp/cgi-bin/efpWeb.cgi?dataSource=Chemical&modeInput=Absolute&primaryGene=At5g02310&orthoListOn=0' 
); 

foreach ($addresses as $address) { 
    echo "Address: http://www.bar.utoronto.ca/efp/cgi-bin/efpWeb.cgi?dataSource=Chemical&modeInput=Absolute&primaryGene=At5g02310&orthoListOn=0\n"; 
    // This box doesn't have http registered as a transport layer - pfft 
    //var_dump(fsockopen($address, 80)); 

    $ch = curl_init($address); 
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
    curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 5); 

    $fc = curl_exec($ch); 

    echo "Info: " . print_r(curl_getinfo($ch), true) . "\n"; 

    echo "$fc\n"; 

    curl_close($ch); 
} 

qui renvoie les éléments suivants (TL; DR: mon cURL peut lire les belles pages):

C:\Users\Ross>php -e D:\sandbox\curl.php 

Address: http://www.bar.utoronto.ca/efp/cgi-bin/efpWeb.cgi?dataSource=Chemical&modeInput=Absolute&primaryGene=At5g02310&orthoListOn=0 

Info: Array 
(
    [url] => http://atensembl.arabidopsis.info/Arabidopsis_thaliana_TAIR/unisearch?species=Arabidopsis_thaliana_TAIR;idx=;q=At5g02310 
    [content_type] => text/html; charset=ISO-8859-1 
    [http_code] => 200 
    [header_size] => 168 
    [request_size] => 151 
    [filetime] => -1 
    [ssl_verify_result] => 0 
    [redirect_count] => 0 
    [total_time] => 0.654 
    [namelookup_time] => 0.004 
    [connect_time] => 0.044 
    [pretransfer_time] => 0.044 
    [size_upload] => 0 
    [size_download] => 7531 
    [speed_download] => 11515 
    [speed_upload] => 0 
    [download_content_length] => 0 
    [upload_content_length] => 0 
    [starttransfer_time] => 0.57 
    [redirect_time] => 0 
) 

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-gb" lang="en-gb"> 
<head> 
    <title>AtEnsembl release 49: Arabidopsis thaliana TAIR EnsEMBL UniSearch results</title> 
    <style type="text/css" media="all"> 
    @import url(/css/ensembl.css); 
    @import url(/css/content.css); 
    </style> 
    <style type="text/css" media="print"> 
    @import url(/css/printer-styles.css); 
    </style> 
    <style type="text/css" media="screen"> 
    @import url(/css/screen-styles.css); 
    </style> 
    <script type="text/javascript" src="/js/protopacked.js"></script> 
    <script type="text/javascript" src="/js/core42.js"></script> 
    <!-- Snipped for freedom - lots of lines --> 
</body> 
</html> 

Address: http://www.bar.utoronto.ca/efp/cgi-bin/efpWeb.cgi?dataSource=Chemical&modeInput=Absolute&primaryGene=At5g02310&orthoListOn=0 

Info: Array 
(
    [url] => http://www.bar.utoronto.ca/efp/cgi-bin/efpWeb.cgi?dataSource=Chemical&modeInput=Absolute&primaryGene=At5g02310&orthoListOn=0 
    [content_type] => text/html; charset=UTF-8 
    [http_code] => 200 
    [header_size] => 146 
    [request_size] => 155 
    [filetime] => -1 
    [ssl_verify_result] => 0 
    [redirect_count] => 0 
    [total_time] => 2.695 
    [namelookup_time] => 0.004 
    [connect_time] => 0.131 
    [pretransfer_time] => 0.131 
    [size_upload] => 0 
    [size_download] => 14156 
    [speed_download] => 5252 
    [speed_upload] => 0 
    [download_content_length] => 0 
    [upload_content_length] => 0 
    [starttransfer_time] => 2.306 
    [redirect_time] => 0 
) 

<html> 
<head> 
    <title>Arabidopsis eFP Browser</title> 
    <link rel="stylesheet" type="text/css" href="efp.css"/> 
    <link rel="stylesheet" type="text/css" href="domcollapse.css"/> 
    <script type="text/javascript" src="efp.js"></script> 
    <script type="text/javascript" src="domcollapse.js"></script> 
</head> 
<body> 
<!-- SANITY SNIP --> 
</body> 
</html> 

Alors ce que cela signifie? Pas tout à fait sûr. Je doute qu'ils vous bloquent spécifiquement (comme vous pouvez accéder à la page, sauf si vous exécutez ce script sur un serveur Web). Essayez d'exécuter mon code ci-dessus - si cela fonctionne, essayez de commenter des parties de votre code pour voir ce qui est différent (et éventuellement provoquer un arrêt). Aussi quelle version de PHP exécutez-vous?

+0

Bravo pour la réponse, j'ai mis à jour mon message avec les codes d'état. – Daniel

+0

Votre code ne me donnait pas la bonne sortie (je recevais 0 pour tout), donc j'ai utilisé le serveur WAMP pour installer un serveur sur mon pc, essayé à partir de là, et ça a bien fonctionné - tout comme mon code. Donc, je suppose que le problème est de savoir comment le serveur d'origine que j'utilisais avait été configuré. – Daniel

+0

Je rencontre la personne qui dirige le serveur demain donc j'espère que nous trouverons le problème. Merci de votre aide! – Daniel

6

Vous devez utiliser curl_error() pour vérifier quelle erreur a eu lieu (le cas échéant)

1

Deux choses à considérer.

La première est que vous avez défini votre délai d'attente sur faible. La demande peut prendre plus de 5 secondes sur ces sites Web. Deuxièmement, il se peut que les sites Web en question bloquent délibérément votre demande. Ils ont une règle en place pour bloquer les demandes provenant de curl, ou ils peuvent avoir remarqué une activité suspecte (soit votre scraping d'écran ou l'abus de réseau de quelqu'un d'autre) provenant de votre adresse IP et bloquent/étranglent les demandes.

Questions connexes