Pergunta

Em Python, quais são as diferenças entre o urllib, urllib2, urllib3 e < a href = "http://docs.python-requests.org/en/latest/index.html" rel = "nofollow noreferrer"> requests módulo? Por que há três? Eles parecem fazer a mesma coisa ...

Foi útil?

Solução

Eu sei que tem sido dito já, mas eu recomendo o requests Python pacote.

Se você tem outros que python línguas utilizadas, você provavelmente está pensando urllib e urllib2 são fáceis de usar, não muito código, e altamente capaz, é assim que eu costumava pensar. Mas o pacote requests é tão incrivelmente útil e curta que todos devem estar usando-o.

Primeiro, ele suporta uma API totalmente repousante, e é tão fácil como:

import requests

resp = requests.get('http://www.mywebsite.com/user')
resp = requests.post('http://www.mywebsite.com/user')
resp = requests.put('http://www.mywebsite.com/user/put')
resp = requests.delete('http://www.mywebsite.com/user/delete')

Independentemente de GET / POST, você nunca tem que parâmetros codificar novamente, ele simplesmente pega um dicionário como um argumento e é bom para ir:

userdata = {"firstname": "John", "lastname": "Doe", "password": "jdoe123"}
resp = requests.post('http://www.mywebsite.com/user', data=userdata)

Além disso, ele mesmo foi construído em um JSON decodificador (mais uma vez, eu sei json.loads() não é muito mais para escrever, mas esta certeza é conveniente):

resp.json()

Ou se seus dados de resposta é apenas texto, use:

resp.text

Esta é apenas a ponta do iceberg. Esta é a lista de funcionalidades do site pedidos:

  • domínios e URLs Internacional
  • Mantenha-Alive & Pool de conexões
  • Sessões com Cookies Persistência
  • Navegador de estilo Verificação SSL
  • Basic / autenticação Digest
  • Key elegante / Valor cookies
  • Descompressão automática
  • Corpos Unicode resposta
  • Multipart uploads de arquivos
  • tempos limite de conexão
  • Suporte .netrc
  • item da lista
  • Python 2,6-3,4
  • thread-safe.

Outras dicas

urllib2 oferece algumas funcionalidades extra, ou seja, a função urlopen() pode permitir que você especificar cabeçalhos (normalmente você teria que usar httplib no passado, que é muito mais detalhado.) Mais importante, porém, urllib2 fornece a classe Request, o que permite uma abordagem mais declarativa para fazer um pedido:

r = Request(url='http://www.mysite.com')
r.add_header('User-Agent', 'awesome fetcher')
r.add_data(urllib.urlencode({'foo': 'bar'})
response = urlopen(r)

Note que urlencode() está apenas em urllib, urllib2 não.

Há também manipuladores de execução do apoio URL mais avançado em urllib2. A resposta curta é, a menos que você está trabalhando com código legado, você provavelmente vai querer usar o abridor de URL de urllib2, mas você ainda precisa importar para urllib para algumas das funções de utilidade.

resposta Bonus Com o Google App Engine, você pode usar qualquer um dos httplib, urllib ou urllib2, mas todos eles são apenas wrappers para o URL do Google Fetch API. Ou seja, você ainda está sujeito às mesmas limitações, como portas, protocolos, bem como a duração da resposta permitido. Você pode usar o núcleo das bibliotecas como seria de esperar para a recuperação HTTP URLs, no entanto.

urllib e urllib2 são ambos módulos Python que fazem URL solicitar coisas relacionadas, mas oferecem diferentes funcionalidades.

1) urllib2 pode aceitar um objeto de solicitação para definir os cabeçalhos para um pedido de URL, urllib aceita apenas uma URL.

2) urllib fornece o urlencode método que é usado para a geração de cadeias de consulta GET, urllib2 não tem tal função. Esta é uma das razões pelas quais urllib é frequentemente usado juntamente com urllib2.

Pedidos -. Pedidos é um simples, fácil de usar biblioteca HTTP escrito em Python

1) Python Pedidos codifica os parâmetros automaticamente assim que você apenas passá-los como argumentos simples, ao contrário, no caso de urllib, onde você precisa usar o método urllib.encode () para codificar os parâmetros antes de passá-los.

2) É decodificado automaticamente a resposta em Unicode.

3) Solicita também tem erro muito mais conveniente handling.If sua autenticação falhou, urllib2 elevaria a urllib2.URLError, enquanto os pedidos retornaria um objeto de resposta normal, como esperado. Tudo que você tem que ver se a solicitação foi bem-sucedida boolean response.ok

Por exemplo referência - https://dancallahan.info/journal/python-requests/

urllib2.urlopen aceita uma instância da classe pedido ou uma url, enquanto urllib.urlopen só aceita um URL.

Uma discussão semelhante ocorreu aqui: http://www.velocityreviews.com/forums /t326690-urllib-urllib2-what-is-the-difference.html

Eu como a função urllib.urlencode, e não parecem existir em urllib2.

>>> urllib.urlencode({'abc':'d f', 'def': '-!2'})
'abc=d+f&def=-%212'

Uma diferença considerável é de cerca de portar python2 para Python3. urllib2 não existe para python3 e seus métodos portado para urllib. Então você está usando esse pesadamente e quiser migrar para Python3 no futuro, considere usar urllib. No entanto 2to3 ferramenta irá automaticamente fazer a maior parte do trabalho para você.

Só para acrescentar às respostas existentes, eu não vejo ninguém mencionar que os pedidos de Python não é uma biblioteca nativa. Se você estiver ok com dependências acrescentando, em seguida, solicita está bem. No entanto, se você está tentando evitar a adição de dependências, urllib é uma biblioteca python nativa que já está disponível para você.

Geralmente, você deve usar urllib2, já que isso torna as coisas um pouco mais fácil, por vezes, por aceitar o pedido objetos e também irá levantar uma URLException em erros de protocolo. Com o Google App Engine, porém, você não pode usar qualquer um. Você tem que usar a Busca de URL API que o Google oferece em sua Python sandboxed meio ambiente.

Para obter o conteúdo de um url:

try: # Try importing requests first.
    import requests
except ImportError: 
    try: # Try importing Python3 urllib
        import urllib.request
    except AttributeError: # Now importing Python2 urllib
        import urllib


def get_content(url):
    try:  # Using requests.
        return requests.get(url).content # Returns requests.models.Response.
    except NameError:  
        try: # Using Python3 urllib.
            with urllib.request.urlopen(index_url) as response:
                return response.read() # Returns http.client.HTTPResponse.
        except AttributeError: # Using Python3 urllib.
            return urllib.urlopen(url).read() # Returns an instance.

É difícil escrever python2 e Python3 e request dependências de código para as respostas, porque eles urlopen() funções e função requests.get() retorno tipos diferentes:

  • python2 urllib.request.urlopen() retorna um http.client.HTTPResponse
  • Python3 urllib.urlopen(url) retorna um instance
  • Request request.get(url) retornos uma requests.models.Response

Um ponto importante que eu encontrar ausente nas respostas acima é que urllib retorna um objeto do tipo <class http.client.HTTPResponse> enquanto requests retornos <class 'requests.models.Response'>.

Devido a isso, ler () método pode ser usado com urllib mas não com requests.

P.S. : requests já é rico com tantos métodos que dificilmente precisa de mais um como read();>

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