2013-06-11 5 views
0

J'essaie d'obtenir des données d'un site Web avec pycurl. J'ai fait un script similaire plus tôt en php (en utilisant aussi curl) et cela a fonctionné mais en python j'ai une réponse vide. Un problème similaire était avec php - le site prend des données post, initialise une session et redirige vers la page de résultats, mais si aucun cookie n'est autorisé, il renvoie une réponse vide au lieu de rediriger. Je n'ai pas accès au code sur ce site. L'utilisation des options COOKIEFILE et COOKIEJAR a résolu le problème. Voici le code php:Problème d'utilisation de pycurl avec des cookies

<?php 
$anul = 2009; 
$idnp = "2000000000000"; 
$seria_diploma = "AB000000000"; 
$url = "http://acte.edu.md/handler.php"; 
$cookie_file = tempnam("tmp", "cookie"); 
$curl_session = curl_init($url); 
curl_setopt($curl_session, CURLOPT_POST, 1); 
$post_fields = "an=$anul&idnp=$idnp&=$seria_diploma&Submit=OK"; 
curl_setopt($curl_session, CURLOPT_POSTFIELDS,$post_fields); 
curl_setopt($curl_session, CURLOPT_FOLLOWLOCATION, 1); 
curl_setopt($curl_session, CURLOPT_COOKIEFILE, $cookie_file); 
curl_setopt($curl_session, CURLOPT_COOKIEJAR, $cookie_file); 
curl_setopt($curl_session, CURLOPT_RETURNTRANSFER, true); 
$result = curl_exec($curl_session); 
curl_close($curl_session); 
echo $result; 

En utilisant les mêmes options en python je reçois une réponse vide avec le code HTTP 200 au lieu de 302. Voici le code que j'utilise:

url = "http://acte.edu.md/handler.php" 
    post_data = dict({ 
      "an":2009, 
      "idnp":"2000000000000", 
      "a":"AB000000000", 
      "Submit":"OK" 
    }) 
    buf = StringIO.StringIO() 
    c = pycurl.Curl() 

    c.setopt(pycurl.URL,url) 
    c.setopt(pycurl.WRITEFUNCTION, buf.write) 
    #c.setopt(pycurl.CONNECTTIMEOUT,10000) 
    cookiefile = os.tempnam(_APP_ROOT_PATH+"temp_files","cookie") 
    c.setopt(pycurl.COOKIEFILE, cookiefile) 
    c.setopt(pycurl.COOKIEJAR, cookiefile) 
    c.setopt(pycurl.FOLLOWLOCATION, 1) 
    #c.setopt(pycurl.MAXREDIRS, 5) 
    c.setopt(pycurl.POST, 1) 
    c.setopt(pycurl.POSTFIELDS, urllib.urlencode(post_data)) 
    c.setopt(pycurl.VERBOSE, True) 
    c.perform() 

    response += "ERROR:" + c.errstr() 
    response += c.getinfo(pycurl.HTTP_CODE).__str__()+ c.getinfo(pycurl.EFFECTIVE_URL) 
    c.close()  

S'il vous plaît me dire Si vous avez des suggestions ...

Répondre

0

Le problème résidait dans les paramètres POST non valides. Si elles ne réussissent pas, la page de validation renvoie une réponse vide.