今天我们花些时间来看下三种用python提交一个web表单的方法,因此,我们用搜索引擎duckduckgo.com以"python"为关键词进行搜索,然后将结果保存为一个HTML文件,我们用python自带的urllib模块和两个第三方包:requests 和mechanize.,我们用三个小脚本来进行测试.
用urllib提交一个web表单
我们开始需要用到urllib和urllib2这两个模块,他们都是python自带的标准库,然后import webbrowser,打开搜索结果以便查看.下面是代码:
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")
当你想提交一个web表单时,你需要做的第一件事是找到表单是被谁调用以及你要发布到哪个链接上,当你访问duckduckgo站点查看源代码时,你会发现表单的action指向“/html”.因此我们的url是"http://duckduckgo.com/html".输入区域被命名为"q",因此要传给duckduckgo一个搜索关键词,我们要将它输入到"q"区域,这就是urllib.urlencode要做的事,,它将我们的搜索词编码,然后我们打开这个url,并搜索,搜索结果被写入磁盘,最后,我们用webbrowser模块打开我们保存的结果.下面让我们看下使用requests包的不同之处.
用requests提交一个web表单
requests包提交一个表单就显得比较优雅,简洁.如下:
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)
使用requests时,你仅仅需要用表单的区域名作为key,搜索词作为value,生成一个字典,然后你用requests.post去搜索,最后,你用搜索结果的对象"r",将它的内容写入到磁盘,在这里,我们跳过了用webbrowser模块打开文件的部分,以便代码看起来更简洁.下面我们来看下用mechanize做同样的事.
用mechanize提交一个表单
对于用python浏览internet,mechanize模块有非常多的优良特性,但很不幸,它不支持javascript,不管怎样,让我们看下它是如何使用的.
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)
就如你看到的,mechanize相比前两种方法,它显得有点儿繁琐,我们需要告诉它,忽略掉robots.txt,否则它会出错,当然,如果你想成为一个遵守网络规范的网民,你不应该忽略它.首先,你需要一个浏览对象,然后你打开这个url,选择表单(在这里是"x"),接着用搜索参数建立一个字典,记住,在在不同的方法里,建立字典的方式有小小的不on过.接着你提交这个查询,并读搜索结果,最终你保存这个搜索结果到磁盘.到这里就结束了.
总结
上述三种方法中,requests是最简单易用的,urllib则比较严谨,mechanize是用来做更多的事,它被用来抓屏和站点测试,所以虽然有点儿复杂,但一点儿也不奇怪.你也可以用selenium来提交一个web表单,你可以阅读这个blog的存档以了解它的用法.
来源:http://www.blog.pythonlibrary.org/2012/06/08/python-101-how-to-submit-a-web-form/