Domanda

Quindi sto cercando in urllib3 perché ha il pool di connessioni ed è thread-safe ( quindi le prestazioni è meglio, soprattutto per la scansione), ma la documentazione è ... il minimo per non dire altro. urllib2 ha build_opener così qualcosa come:

#!/usr/bin/python
import cookielib, urllib2
cj = cookielib.CookieJar()
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj))
r = opener.open("http://example.com/")

Ma urllib3 non ha un metodo build_opener, quindi l'unico modo che ho capito finora è quello di mettere manualmente nell'intestazione:

#!/usr/bin/python
import urllib3
http_pool = urllib3.connection_from_url("http://example.com")
myheaders = {'Cookie':'some cookie data'}
r = http_pool.get_url("http://example.org/", headers=myheaders)

ma spero ci sia un modo migliore e che uno di voi mi può dire quello che è. Anche qualcuno può etichettare questo con "urllib3" per favore.

È stato utile?

Soluzione

Hai ragione, non c'è subito modo migliore per farlo in questo momento. Sarei più che felice di accettare una patch se si ha un miglioramento congruente.

Una cosa da tenere a mente, HTTPConnectionPool di urllib3 è destinato ad essere un "pool di connessioni" ad un host specifico, in contrapposizione a un client stateful. In tale contesto, ha senso mantenere il tracking dei cookie al di fuori della piscina vera e propria.

  • shazow (l'autore di urllib3)

Altri suggerimenti

Non c'è un problema con più cookie?

Alcuni server restituiscono più intestazioni Set-Cookie, ma urllib3 memorizza le intestazioni in un dict e un dict non permette più voci con la stessa chiave.

httplib2 ha un problema simile.

O forse no: si scopre che il metodo readheaders della classe HTTPMessage nel pacchetto httplib - che sia urllib3 e httplib2 uso - ha il seguente commento:

  

Se più campi di intestazione con lo stesso nome verificano, sono combinati secondo le regole in RFC 2616 sec 4.2:

    Appending each subsequent field-value to the first, each separated
    by a comma. The order in which header fields with the same field-name
    are received is significant to the interpretation of the combined
    field value.

Quindi non intestazioni sono persi.

V'è, tuttavia, un problema se ci sono virgole all'interno di un valore di intestazione. Non ho ancora capito cosa sta succedendo qui, ma dalla scrematura RFC 2616 ( "Hypertext Transfer Protocol - HTTP / 1.1") e RFC 2965 ( "meccanismo di gestione dello stato HTTP") Ho l'impressione che le virgole all'interno di un colpo di testa il valore si suppone di essere citato.

È necessario impostare 'Cookie' non 'Set-Cookie', 'Set-Cookie' impostato dal server web.

E cookies sono una delle intestazioni, per cui il suo nulla di sbagliato nel fare in quel modo.

Si dovrebbe utilizzare la libreria richieste. Esso utilizza urllib3 ma rende le cose come l'aggiunta di biscotti banale.

https://github.com/kennethreitz/requests

import requests
r1 = requests.get(url, cookies={'somename':'somevalue'})
print(r1.content)

È possibile utilizzare un codice come questo:

def getHtml(url):
    http = urllib3.PoolManager()
    r = http.request('GET', url, headers={'User-agent':'Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.16 Safari/537.36','Cookie':'cookie_name=cookie_value'})
    return r.data #HTML

È necessario sostituire cookie_name e cookie_value

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top