Urllib2 & BeautifulSoup: Nettes Paar aber zu langsam - Urllib3 & Threads?

Ich suchte nach einer Möglichkeit, meinen Code zu optimieren, als ich einige gute Dinge über Threads und urllib3 hörte. Offensichtlich sind sich die Leute nicht einig, welche Lösung die beste ist.

Das Problem mit meinem Skript unten ist die Ausführungszeit: so langsam!

Schritt 1: Ich hole diese Seitehttp://www.cambridgeesol.org/institutions/results.php?region=Afghanistan&type=&BULATS=on

Schritt 2: Ich analysiere die Seite mit BeautifulSoup

Schritt 3: Ich habe die Daten in ein Excel-Dokument geschrieben

Schritt 4: Ich mache es immer und immer wieder für alle Länder in meiner Liste (große Liste) (ich ändere gerade "Afghanistan" in der URL in ein anderes Land)

Hier ist mein Code:

<code>ws = wb.add_sheet("BULATS_IA") #We add a new tab in the excel doc
    x = 0 # We need x and y for pulling the data into the excel doc
    y = 0
    Countries_List = ['Afghanistan','Albania','Andorra','Argentina','Armenia','Australia','Austria','Azerbaijan','Bahrain','Bangladesh','Belgium','Belize','Bolivia','Bosnia and Herzegovina','Brazil','Brunei Darussalam','Bulgaria','Cameroon','Canada','Central African Republic','Chile','China','Colombia','Costa Rica','Croatia','Cuba','Cyprus','Czech Republic','Denmark','Dominican Republic','Ecuador','Egypt','Eritrea','Estonia','Ethiopia','Faroe Islands','Fiji','Finland','France','French Polynesia','Georgia','Germany','Gibraltar','Greece','Grenada','Hong Kong','Hungary','Iceland','India','Indonesia','Iran','Iraq','Ireland','Israel','Italy','Jamaica','Japan','Jordan','Kazakhstan','Kenya','Kuwait','Latvia','Lebanon','Libya','Liechtenstein','Lithuania','Luxembourg','Macau','Macedonia','Malaysia','Maldives','Malta','Mexico','Monaco','Montenegro','Morocco','Mozambique','Myanmar (Burma)','Nepal','Netherlands','New Caledonia','New Zealand','Nigeria','Norway','Oman','Pakistan','Palestine','Papua New Guinea','Paraguay','Peru','Philippines','Poland','Portugal','Qatar','Romania','Russia','Saudi Arabia','Serbia','Singapore','Slovakia','Slovenia','South Africa','South Korea','Spain','Sri Lanka','Sweden','Switzerland','Syria','Taiwan','Thailand','Trinadad and Tobago','Tunisia','Turkey','Ukraine','United Arab Emirates','United Kingdom','United States','Uruguay','Uzbekistan','Venezuela','Vietnam']
    Longueur = len(Countries_List)



    for Countries in Countries_List:
        y = 0

        htmlSource = urllib.urlopen("http://www.cambridgeesol.org/institutions/results.php?region=%s&type=&BULATS=on" % (Countries)).read() # I am opening the page with the name of the correspondant country in the url
        s = soup(htmlSource)
        tableGood = s.findAll('table')
        try:
            rows = tableGood[3].findAll('tr')
            for tr in rows:
                cols = tr.findAll('td')
                y = 0
                x = x + 1
                for td in cols:
                    hum =  td.text
                    ws.write(x,y,hum)
                    y = y + 1
                    wb.save("%s.xls" % name_excel)

        except (IndexError):
            pass
</code>

Ich weiß also, dass nicht alles perfekt ist, aber ich freue mich darauf, neue Dinge in Python zu lernen! Das Skript ist sehr langsam, da urllib2 und BeautifulSoup nicht so schnell sind. Für die Suppensache kann ich es wohl nicht wirklich verbessern, aber für urllib2 nicht.

EDIT 1:Mehrfachverarbeitung mit urllib2 nutzlos? Scheint in meinem Fall interessant zu sein. Was haltet ihr von dieser möglichen Lösung ?!

<code># Make sure that the queue is thread-safe!!

def producer(self):
    # Only need one producer, although you could have multiple
    with fh = open('urllist.txt', 'r'):
        for line in fh:
            self.queue.enqueue(line.strip())

def consumer(self):
    # Fire up N of these babies for some speed
    while True:
        url = self.queue.dequeue()
        dh = urllib2.urlopen(url)
        with fh = open('/dev/null', 'w'): # gotta put it somewhere
            fh.write(dh.read())
</code>

EDIT 2: URLLIB3 Kann mir jemand mehr darüber erzählen?

Verwenden Sie dieselbe Socket-Verbindung erneut für mehrere Anforderungen (HTTPConnectionPool und HTTPSConnectionPool) (mit optionaler clientseitiger Zertifikatüberprüfung).https://github.com/shazow/urllib3

Soweit ich 122 Mal dieselbe Website für verschiedene Seiten anfordere, kann es interessant sein, dieselbe Socket-Verbindung wiederzuverwenden. Irre ich mich? Kann es nicht schneller sein? ...

<code>http = urllib3.PoolManager()
r = http.request('GET', 'http://www.bulats.org')
for Pages in Pages_List:
    r = http.request('GET', 'http://www.bulats.org/agents/find-an-agent?field_continent_tid=All&field_country_tid=All&page=%s' % (Pages))
    s = soup(r.data)
</code>

Antworten auf die Frage(3)

Ihre Antwort auf die Frage