Pergunta

Então, eu estou olhando para urllib3 porque tem o pool de conexão e é seguro thread ( por isso o desempenho é melhor, especialmente para o rastreamento), mas a documentação é ... mínima para dizer o mínimo. urllib2 tem build_opener então algo como:

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

Mas urllib3 não tem nenhum método build_opener, então a única maneira que eu descobri até agora é colocá-lo manualmente no cabeçalho:

#!/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)

Mas eu estou esperando há uma maneira melhor e que um de vocês pode me dizer o que é. Também pode alguém tag isso com "urllib3" por favor.

Foi útil?

Solução

Você está correto, não há nenhuma imediatamente melhor maneira de fazer isso agora. Eu ficaria mais que feliz em aceitar um patch, se você tem uma melhoria congruentes.

Uma coisa para manter em mente, urllib3 de HTTPConnectionPool se destina a ser um "pool de conexões" a um host específico, em oposição a um cliente stateful. Nesse contexto, faz sentido para manter o rastreamento de cookies fora da piscina real.

  • shazow (o autor de urllib3)

Outras dicas

Não há um problema com vários cookies?

Alguns servidores retornar vários cabeçalhos Set-Cookie, mas urllib3 armazena os cabeçalhos em um dicionário e um dicionário não permitem várias entradas com a mesma chave.

httplib2 tem um problema similar.

Ou talvez não: verifica-se que o método readheaders da classe HTTPMessage no pacote httplib - que tanto urllib3 e httplib2 uso - tem o seguinte comentário:

Se ocorrer vários campos de cabeçalho com o mesmo nome, eles são combinados de acordo com as regras em RFC 2616 seg 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.

Portanto, não cabeçalhos são perdidas.

Há, no entanto, um problema se houver vírgulas dentro de um valor de cabeçalho. Eu ainda não descobri o que está acontecendo aqui, mas a partir de desnatação RFC 2616 ( "Hypertext Transfer Protocol - HTTP / 1.1") e RFC 2965 ( "HTTP mecanismo de gestão do Estado") fico com a impressão de que qualquer vírgulas dentro de um cabeçalho valor é suposto ser citado.

Você precisa definir 'Cookie' não 'Set-Cookie', conjunto 'Set-Cookie' pelo servidor web.

e biscoitos são um dos cabeçalhos, por isso é errado nada em fazer dessa forma.

Você deve usar a biblioteca pedidos. Ele usa urllib3 mas torna as coisas como a adição de biscoitos triviais.

https://github.com/kennethreitz/requests

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

Você pode usar um código como este:

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

Você deve substituir cookie_name e cookie_value

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top