Em Python, quais são as diferenças entre os urllib
, urllib2
, urllib3
e requests
módulos? Por que existem três? Eles parecem fazer a mesma coisa ...
python
python-requests
urllib2
urllib
python-2.x
Paul Biggar
fonte
fonte
requests
maior parte do tempo. às vezesurllib2
funciona, mas requer mais código e é menos elegante. não useurllib
.urllib
no Python 3 existe outra opção, limpa de várias maneiras. Mas, felizmente, a documentação oficial também observa que " O pacote de solicitações é recomendado para uma interface de cliente HTTP de nível superior " na 21.6. urllib.request - Biblioteca extensível para abrir URLs - documentação do Python 3.6.3Respostas:
Eu sei que já foi dito, mas eu recomendo o
requests
pacote Python.Se você já usou outras linguagens além do python, provavelmente está pensando
urllib
eurllib2
é fácil de usar, sem muito código e altamente capaz, é assim que eu pensava. Mas orequests
pacote é tão incrivelmente útil e curto que todos deveriam usá-lo.Primeiro, ele suporta uma API totalmente tranquila e é tão fácil quanto:
Independentemente de se GET / POST, você nunca precisa codificar parâmetros novamente, basta usar um dicionário como argumento e é bom:
Além disso, ele ainda possui um decodificador JSON interno (novamente, eu sei que
json.loads()
não há muito mais para escrever, mas isso com certeza é conveniente):Ou, se seus dados de resposta forem apenas texto, use:
Esta é apenas a ponta do iceberg. Esta é a lista de recursos do site de solicitações:
fonte
urllib
e que também documenta oficialmente que " O pacote de solicitações é recomendado para uma interface de cliente HTTP de nível superior " na seção 21.6. urllib.request - Biblioteca extensível para abrir URLs - documentação do Python 3.6.3 , eurllib3
é uma ótima biblioteca usada porrequests
.urllib.parse()
O urllib2 fornece algumas funcionalidades extras, ou seja, a
urlopen()
função pode permitir que você especifique cabeçalhos (normalmente você precisaria usar o updplib no passado, o que é muito mais detalhado.) Mais importante ainda, o urllib2 fornece aRequest
classe, o que permite mais abordagem declarativa para fazer uma solicitação:Observe que
urlencode()
está apenas no urllib, não no urllib2.Também existem manipuladores para implementar o suporte a URL mais avançado no urllib2. A resposta curta é que, a menos que você esteja trabalhando com código legado, provavelmente desejará usar o abridor de URL do urllib2, mas ainda precisará importar para o urllib algumas das funções do utilitário.
Resposta bônus Com o Google App Engine, você pode usar qualquer um dettttplib, urllib ou urllib2, mas todos são apenas invólucros para a API de busca de URL do Google. Ou seja, você ainda está sujeito às mesmas limitações, como portas, protocolos e a duração da resposta permitida. Você pode usar o núcleo das bibliotecas como seria de esperar para recuperar URLs HTTP.
fonte
urlopen()
eRequest
do urllib2 eurlencode()
do urllib . Não há nenhum dano real no uso das duas bibliotecas, desde que você use o urlopen correto. Os [urllib docs] [1] são claros quanto ao uso aceito. [1]: docs.python.org/library/urllib2.html#urllib2.urlopenurllib2.urlopen
; contém outras variações também.requests
também permitem que os cabeçalhos personalizados: docs.python-requests.org/en/master/user/quickstart/...urllib e urllib2 são dois módulos Python que solicitam URLs relacionados a itens, mas oferecem funcionalidades diferentes.
1) urllib2 pode aceitar um objeto Request para definir os cabeçalhos para uma solicitação de URL, urllib aceita apenas uma URL.
2) urllib fornece o método urlencode que é usado para a geração de strings de consulta GET, urllib2 não possui essa função. Esse é um dos motivos pelos quais o urllib é frequentemente usado junto com o urllib2.
Requests - Requests 'é uma biblioteca HTTP simples e fácil de usar, escrita em Python.
1) O Python Requests codifica os parâmetros automaticamente, para que você os transmita como argumentos simples, ao contrário do caso do urllib, onde você precisa usar o método urllib.encode () para codificar os parâmetros antes de passá-los.
2) Decodificou automaticamente a resposta em Unicode.
3) As solicitações também têm um tratamento de erro muito mais conveniente. Se sua autenticação falhar, o urllib2 gerará um urllib2.URLError, enquanto as solicitações retornarão um objeto de resposta normal, conforme o esperado. Tudo o que você precisa para ver se a solicitação foi bem-sucedida por resposta booleana.ok
fonte
Uma diferença considerável é sobre a portabilidade do Python2 para o Python3. O urllib2 não existe para python3 e seus métodos portados para urllib. Portanto, você está usando muito isso e deseja migrar para o Python3 no futuro, considere usar o urllib. No entanto, a ferramenta 2to3 fará automaticamente a maior parte do trabalho para você.
fonte
Apenas para adicionar às respostas existentes, não vejo ninguém mencionando que solicitações de python não são uma biblioteca nativa. Se você concorda em adicionar dependências, as solicitações são aceitáveis. No entanto, se você estiver tentando evitar adicionar dependências, o urllib é uma biblioteca python nativa que já está disponível para você.
fonte
Gosto da
urllib.urlencode
função e ela não parece existirurllib2
.fonte
urllib
no Python 3 há outra opção, limpa de várias maneiras. Mas, felizmente, a documentação oficial também observa que " O pacote de solicitações é recomendado para uma interface de cliente HTTP de nível superior " na seção 21.6. urllib.request - Biblioteca extensível para abrir URLs - documentação do Python 3.6.3Para obter o conteúdo de um URL:
É difícil escrever o código Python2 e Python3 e
request
dependências para as respostas porque elasurlopen()
funcionam erequests.get()
retornam tipos diferentes:urllib.request.urlopen()
retorna umhttp.client.HTTPResponse
urllib.urlopen(url)
retorna uminstance
request.get(url)
retorna umrequests.models.Response
fonte
Você geralmente deve usar o urllib2, pois isso facilita um pouco as coisas ao aceitar objetos Request e também gera uma exceção URLException em erros de protocolo. No entanto, com o Google App Engine, você também não pode usar. Você precisa usar a API de busca de URL fornecida pelo Google em seu ambiente Python em área restrita.
fonte
Um ponto-chave que acho que falta nas respostas acima é que urllib retorna um objeto do tipo
<class http.client.HTTPResponse>
enquantorequests
retorna<class 'requests.models.Response'>
.Devido a isso, o método read () pode ser usado com
urllib
mas não comrequests
.PS:
requests
já é rico em tantos métodos que dificilmente precisa de mais umread()
;fonte