2017-05-11 5 views
1

J'essaie de lire plusieurs sites Web, obtenir les informations dont j'ai besoin, puis passer à autre chose. Bien que le code python se bloque sur certains sites Web. J'ai remarqué dans les vrais navigateurs que, au hasard, le site ne parvient pas à se charger complètement, peut-être qu'il faut attendre le chargement de certaines publicités ...?Lire une partie d'un site Web en limitant les octets

Les informations dont j'ai besoin se trouvent dans les 50 premiers Ko du site. Si j'utilise un timeout, la réponse entière de la connexion est perdue dans tous les modules que j'ai essayés (urllib, urlib3 et pycurl). De plus, dans pycurl, l'option set RANGE ne semble pas faire quoi que ce soit pour l'url.

Est-ce que quelqu'un sait comment sauvegarder le contenu déjà reçu lors de l'appel d'un délai d'attente. Ou, quelqu'un sait-il comment limiter efficacement le contenu à un certain nombre d'octets?

+0

Habituellement, les retards se produisent sur les sites Web avec beaucoup de publicités. Comme celui-ci; https://www.yahoo.com/news/ – jsfa11

+0

50kb semble élevé pour l'estimation de l'emplacement de la donnée. Le numéro a été obtenu enregistrez le texte décodé du site Web, puis en supprimant tout ce qui suit l'emplacement souhaité et en regardant la taille du fichier. Le fait est que l'information arrive tôt dans le transfert. – jsfa11

+0

Vous pouvez essayer 'requests' avec' stream = True' et lire les premiers 50kb –

Répondre

1

J'ai trouvé que pycurl écrit toujours dans le tampon jusqu'à la fin de la temporisation. Si un délai d'attente se produit, l'erreur peut être interceptée et le tampon récupéré. Voici le code que j'ai utilisé.

try: 
     buffer = BytesIO() 
     http_curl = pycurl.Curl() 
     http_curl.setopt(pycurl.URL, url) 
     http_curl.setopt(http_curl.WRITEDATA, buffer) 
     http_curl.setopt(http_curl.FOLLOWLOCATION, True) 
     http_curl.setopt(http_curl.TIMEOUT_MS, 1000) 
     http_curl.perform() 
     http_curl.close() 
    except pycurl.error: 
     response = buffer.getvalue() 
     response = response.decode('utf-8') 
     print(response) 
     pass 

La page a été partiellement téléchargée puis imprimée. Merci à t.m.adam pour stimuler un travail.