2013-07-05 3 views
2

J'ai un ensemble de 50 urls ... et à partir de chaque URL, je récupère des données en utilisant urllib2. La procédure que je suis (y compris celles des cookies pour chaque réglage URL) est la suivante:Remplacement pour urllib2

urls = ['https://someurl', 'https://someurl', ...] 
vals = [] 

for url in urls: 
    req2 = urllib2.Request(url) 
    req2.add_header('cookie', cookie) 
    response = urllib2.urlopen(req2) 
    data = response.read() 
    vals.append(json.loads(data)) 

Donc, au fond, je suis en train de récupérer les données de tous ces urls et le dumping dans la liste des vals. Cette procédure complète pour 50 urls prend environ 15,5 à 20 secondes. J'ai besoin de savoir s'il existe une autre librairie python à travers laquelle je peux faire la même opération mais de manière plus rapide ... ou si vous pouvez suggérer une autre façon plus rapide d'aborder ce problème en utilisant urllib2, alors ça ira ainsi que. Merci.

+0

Vous devriez essayer d'utiliser 'requests'. Cela facilite la gestion de beaucoup de ces choses. (Notez qu'il ne résoudra pas les problèmes * de performance * de cette façon, juste pour un code bien meilleur.) –

+0

Chris, pouvez-vous élaborer avec un seul exemple? – user2480542

Répondre

2

La vitesse de urllib2 ne sera pas le facteur limitant ici, la plupart du temps il faudra attendre les connexions TCP ou que le serveur distant réponde.

L'utilisation du module multiprocessing de Python est assez simple, mais vous pouvez également utiliser le module de filetage.

Le multiprocessing.Pool pourrait être utilisé comme ceci:

from multiprocessing import Pool 
# Use the following if you prefer to use threads over processes. 
# from multiprocessing.pool import ThreadPool as Pool 

urls = ['https://someurl', 'https://someurl', ...] 

def download_json(url): 
    req2 = urllib2.Request(url) 
    req2.add_header('cookie', cookie) 
    response = urllib2.urlopen(req2) 
    data = response.read() 
    return json.loads(data) 

pool = Pool() 
vals = pool.map(download_json, urls) 
+0

Cela fonctionne plutôt bien .. mais pas une grande différence .. mais apprécie :-) merci. – user2480542

1

urllib2 est assez rapide (20 secondes pour 50 urls n'est pas si lent). Il faut un certain temps pour se connecter à la ressource.

Ce que vous voulez faire est multithreading.

+0

hmm..J'ai lu un exemple de avec la classe de file d'attente et le module de multitraitement ... je me demande juste comment cela peut être mis en œuvre? – user2480542

3

Donc, si 15-20 secondes sont coûteux, il y a quelques choses que vous pouvez essayer:

  1. en utilisant le filetage avec urllib2 lui-même. exemple est here
  2. vous pouvez essayer pycurl. (pas sûr de l'amélioration de la performance)
  3. Une fois que je subprocess.Popen pour exécuter la commande boucle et obtenir la réponse de l'URL au format JSON. Je l'ai utilisé pour appeler des URLs différents en parallèle et attraper la réponse à mesure qu'ils arrivent en utilisant la méthode de communication de l'objet Popen.
+0

Merci beaucoup ... tout ce que vous avez mentionné, monsieur, est valable. – user2480542