Hoje, vamos ver três maneiras diferentes de enviar um formulário web em Python. Para isso, faremos uma pesquisa na web com duckduckgo.com pesquisando o termo “python” e salvando o resultado como um arquivo HTML. Usaremos os módulos urllib incluídos do Python e dois pacotes de terceiros: requests e mechanize.
Python é uma linguagem de alto nível, dinâmica e interpretada que tem foco na simplicidade sem abrir mão da robustez. Além disso, aprender Python abre um leque de opções para a sua carreira e também facilita seu caminho para aprender outras linguagem de programação.
Como enviar um formulário web em Python
- Enviando um formulário web com urllib
- Enviando um formulário web com requests
- Enviando um formulário web com mechanize
Enviando um formulário web com urllib
Vamos começar com urllib e urllib2, uma vez que eles estão incluídos na biblioteca padrão do Python. Também importaremos o webbrowser para abrir os resultados da pesquisa para visualização.
Aqui está o código:
1 2 3 4 5 6 7 8 9 10 11 |
import urllib import urllib2 import webbrowser url = "http://duckduckgo.com/html" data = urllib.urlencode({'q': 'Python'}) results = urllib2.urlopen(url, data) with open("results.html", "w") as f: f.write(results.read()) webbrowser.open("results.html") |
A primeira coisa que você tem que fazer quando você quer enviar um formulário web é descobrir o nome do formulário e para qual URL você enviará. Se você for ao duckduckgo e visualizar a fonte, você notará que sua ação está apontando para um link relativo, “/html“. Assim, nosso URL é “http://duckduckgo.com/html“.
O campo de entrada é chamado de “q“. Então, para passar ao duckduckgo um termo de pesquisa, temos de passar para o campo “q“. É aqui que vem a linha urllib.urlencode. Esta linha codifica nosso termo de pesquisa corretamente. Em seguida, abrimos o URL e fazemos a pesquisa. Os resultados serão lidos e gravados no disco.
Finalmente, abrimos nossos resultados salvos usando o módulo webbrowser.
Agora, vamos descobrir como esse processo é diferente quando se usa o pacote requests.
Enviando um formulário web com requests
O pacote requests faz estes envios de uma forma um pouco mais elegante.
Vamos dar uma olhada:
1 2 3 4 5 6 7 |
import requests url = "http://duckduckgo.com/html" payload = {'q':'python'} r = requests.post(url, payload) with open("requests_results.html", "w") as f: f.write(r.content) |
Com requests, você só precisa criar um dicionário com o nome do campo como a chave e o termo de pesquisa como o valor.
Em seguida, use requests.post para fazer a pesquisa.
Finalmente, você usa o objeto de solicitação resultante, “r“, e acessa sua propriedade content, que deverá ser salva no disco.
Ignoramos a parte do webbrowser neste exemplo (e no próximo) por brevidade.
Agora, vamos ver como mechanize faz o seu trabalho.
Enviando um formulário web com mechanize
O módulo mechanize tem muitas atributos interessantes para navegar na internet com Python. Infelizmente, ele não suporta JavaScript. Enfim, vamos continuar com o show!
1 2 3 4 5 6 7 8 9 10 11 12 |
import mechanize url = "http://duckduckgo.com/html" br = mechanize.Browser() br.set_handle_robots(False) # ignore robots br.open(url) br.select_form(name="x") br["q"] = "python" res = br.submit() content = res.read() with open("mechanize_results.html", "w") as f: f.write(content) |
Como você pode ver, mechanize é um pouco mais detalhado do que os outros dois métodos anteriores. Também precisamos dizer-lhe para ignorar a diretiva robots.txt ou ele falhará. Claro, se você quer ser um bom internauta, então você não deve ignorá-lo.
De qualquer forma, para começar, você precisa de um objeto Browser. Então você abre o URL, seleciona o formulário (neste caso, “x“) e configura um dicionário com os parâmetros da busca como antes.
Note que em cada método, a configuração de dict é um pouco diferente.
Em seguida, você envia a consulta e lê o resultado. Agora, basta salvar o resultado no disco e está pronto!
Conclusão
Dos três, requests é, provavelmente, o mais simples. Mechanize, dos três, é os mais detalhado. Este pacote tem muitas utilidades e, na maioria das vezes, é usado para foi feito para raspagem de dados e testes de sites.