Python-exemple de requête asynchrone / threadée urllib2 utilisant HTTPS

j'ai du mal à obtenir des requêtes HTTPS asynchrones / threadées pour fonctionner en utilisant l'urllib2 de Python.

est-ce que quelqu'un là-bas a un exemple de base qui implémente urllib2.Demande, urllib2.build_opener et une sous-classe d'urllib2.HTTPSHandler?

Merci!

16
demandé sur SeaTurtle 2011-04-27 21:31:03

5 réponses

le code ci-dessous fait 7 requêtes http asynchrones en même temps. Il n'utilise pas de threads, il utilise plutôt un réseau asynchrone avec le twisted bibliothèque.

from twisted.web import client
from twisted.internet import reactor, defer

urls = [
 'http://www.python.org', 
 'http://stackoverflow.com', 
 'http://www.twistedmatrix.com', 
 'http://www.google.com',
 'http://launchpad.net',
 'http://github.com',
 'http://bitbucket.org',
]

def finish(results):
    for result in results:
        print 'GOT PAGE', len(result), 'bytes'
    reactor.stop()

waiting = [client.getPage(url) for url in urls]
defer.gatherResults(waiting).addCallback(finish)

reactor.run()
10
répondu nosklo 2011-04-27 18:03:18

il y a un moyen très simple, impliquant un gestionnaire pour urllib2, que vous pouvez trouver ici:http://pythonquirks.blogspot.co.uk/2009/12/asynchronous-http-request.html

#!/usr/bin/env python

import urllib2
import threading

class MyHandler(urllib2.HTTPHandler):
    def http_response(self, req, response):
        print "url: %s" % (response.geturl(),)
        print "info: %s" % (response.info(),)
        for l in response:
            print l
        return response

o = urllib2.build_opener(MyHandler())
t = threading.Thread(target=o.open, args=('http://www.google.com/',))
t.start()
print "I'm asynchronous!"

t.join()

print "I've ended!"
8
répondu lkcl 2012-05-16 15:47:54

voici un exemple d'utilisation d'urllib2 (avec https) et de threads. Chaque thread passe par une liste D'URL et récupère la ressource.

import itertools
import urllib2
from threading import Thread


THREADS = 2
URLS = (
    'https://foo/bar',
    'https://foo/baz',
    )


def main():
    for _ in range(THREADS):
        t = Agent(URLS)
        t.start()


class Agent(Thread):
    def __init__(self, urls):
        Thread.__init__(self)
        self.urls = urls

    def run(self):
        urls = itertools.cycle(self.urls)
        while True:
            data = urllib2.urlopen(urls.next()).read()


if __name__ == '__main__':
    main()
5
répondu Corey Goldberg 2011-07-01 16:20:08

Vous pouvez utiliser L'IO asynchrone pour ce faire.

demande+ gevent= grequests

GRequests vous permet d'utiliser des requêtes avec Gevent pour rendre les requêtes HTTP asynchrones facilement.

import grequests

urls = [
    'http://www.heroku.com',
    'http://tablib.org',
    'http://httpbin.org',
    'http://python-requests.org',
    'http://kennethreitz.com'
]

rs = (grequests.get(u) for u in urls)
grequests.map(rs)
1
répondu bmpasini 2015-05-28 00:32:32

voici le code à partir de eventlet

urls = ["http://www.google.com/intl/en_ALL/images/logo.gif",
     "https://wiki.secondlife.com/w/images/secondlife.jpg",
     "http://us.i1.yimg.com/us.yimg.com/i/ww/beta/y3.gif"]

import eventlet
from eventlet.green import urllib2

def fetch(url):

  return urllib2.urlopen(url).read()

pool = eventlet.GreenPool()

for body in pool.imap(fetch, urls):
  print "got body", len(body)
0
répondu Xavier Combelle 2011-04-27 18:23:28