O urllib2 é um módulo do Python que define funções e classes(Objetos) que manipulam URL(s), seja ela uma URL simples baseado no protocolo HTTP, autenticação Digest, envio de dados GET e POST download de arquivos, cookies, sessão etc.

Para a manipulação de dados pela internet ou recursos para um servidor em intranet, a utilização deste módulo é essencial para o funcionamento de sua aplicação.

A versão mais recente de Python 3.x urllib2 foi dividida em varios outros módulos como urllib.request e urllib.error

Abaixo algumas classes e métodos utilizados nos exemplos:

  • urllib2.urlopen(url[, data][, timeout])
  • urllib2.Request(url[, data][, headers][, origin_req_host][, unverifiable])
  • urllib2.read()
  • urllib2.close()
  • urllib2.URLError
  • urllib2.HTTPError
  • urllib.urlencode(query[, doseq])
  • re.search(string[, pos[, endpos]])
  • os.path.exists(path)
  • os.system(command)
  • os.fchmod(fd, mode)

Abaixo segue alguns exemplos da utilização deste módulo.

Requisitando Conteúdo HTTP


#!/usr/bin/env python
# -*- coding: utf-8 -*-
from urllib2 import URLError
from urllib2 import HTTPError
import urllib2

try:
request = urllib2.Request("http://www.nacaolivre.com.br/")

# Abre a conexão
fd = urllib2.urlopen(request)

# Efetua a leitura do conteúdo.
content = fd.read()
fd.close()
print(content)

except HTTPError, e:
print("Ocorreu um erro ao requisitar o conteúdo do servidor!\n")
print("Cod.: ", e.code)

except URLError, e:
print("URL inválido!\n")
print("Mensagem: ", e.reason)

Enviando Dados HTTP GET


#!/usr/bin/env python
# -*- coding: utf-8 -*-
from urllib2 import URLError
from urllib2 import HTTPError
import urllib2
import urllib

try:

# Objeto contendo os dados para envio ao servidor.
data = urllib.urlencode({
"name": "Teste t. Teste",
"address": "Teste, 555",
"country": "Brasil",
"phone": "(55) 5555-5555",
})

url = "http://www.nacaolivre.com.br/index.php" % data

f = urllib2.urlopen(url)

contents = f.read()
f.close()
print contents

except HTTPError, e:
print("Ocorreu um erro ao requisitar o conteúdo do servidor!\n")
print("Cod.: ", e.code)

except URLError, e:
print("URL inválido!\n")
print("Mensagem: ", e.reason)

Enviando Dados HTTP POST


#!/usr/bin/env python
# -*- coding: utf-8 -*-
from urllib2 import URLError
from urllib2 import HTTPError
import urllib2
import urllib

try:

# Objeto contendo os dados para envio ao servidor.
data = urllib.urlencode({
"name": "Teste t. Teste",
"address": "Teste, 555",
"country": "Brasil",
"phone": "(55) 5555-5555",
})

url = "http://www.nacaolivre.com.br/index.php"

# A grande diferença em relação a envio de dados GET está aqui
# o segundo parametro do método.
f = urllib2.urlopen(url, data)

contents = f.read()
f.close()
print contents

except HTTPError, e:
print("Ocorreu um erro ao requisitar o conteúdo do servidor!\n")
print("Cod.: ", e.code)

except URLError, e:
print("URL inválido!\n")
print("Mensagem: ", e.reason)

Download de Arquivo


#!/usr/bin/env python
# -*- coding: utf-8 -*-
from urllib2 import URLError
from urllib2 import HTTPError
import urllib2
import os
import re

# Abre a página para verificação dos links necessários para efetuar download dos arquivos
# de instalação do wenmin, virtualmin e thema
request = urllib2.Request("http://www.webmin.com/download.html")

fd = urllib2.urlopen(request)

# Read the results back.
s1 = fd1.read()

link_webmin = re.search("(http\:\/\/prdownloads\.sourceforge\.net\/webadmin\/webmin).*?(all.deb)", s1)

# Encerra o descritor de arquivo fd1, fd2
fd1.close()

# Verifica a existencia do arquivo webmin para download
if(not link_webmin.group(0)):
print("Arquivo Webmin: não encontrado para download")

else:
print("Arquivo Webmin: " + link_webmin.group(0) + "[ encontrado ]\n");
print("Efetuando Download: " + link_webmin.group(0) + "... \n");

if(not os.path.exists("downloads/" + os.path.basename(link_webmin.group(0)))):
os.system("wget -P downloads " + link_webmin.group(0))

if(os.path.exists("downloads/" + os.path.basename(link_webmin.group(0)))):
os.chmod("downloads/" + os.path.basename(link_webmin.group(0)), 0777)
print(" [ ok ]\n")

print(os.path.basename(link_webmin.group(0)))