转自:http://www.xuebuyuan.com/743876.html
使用pycurl进行web提交
之前使用python提交数据到服务器时都是采用自带的urllib库。前一段时间登录某Cas系统时,总是莫名的失败。失败的原因好像是cookie的问题,各个页面需要共享cookie。尝试了多个给urllib设置cookie的方法,还是没能成功。
后来,试了pycurl,竟然成功了,那就使用pycurl吧。(很抱歉,我没能追查出为什么采用urllib2没有成功,也没有彻底研究出为何pycurl能够成功)
pycurl官方下载链接我没有打开,本人通过该链接下载。另外,本人使用的是python2.7。
首先,对pycurl进行简单的封装
def initCurl(): '''初始化一个pycurl对象, 尽管urllib2也支持 cookie 但是在登录cas系统时总是失败,并且没有搞清楚失败的原因。 这里采用pycurl主要是因为pycurl设置了cookie后,可以正常登录Cas系统 ''' c = pycurl.Curl() c.setopt(pycurl.COOKIEFILE, "cookie_file_name")#把cookie保存在该文件中 c.setopt(pycurl.COOKIEJAR, "cookie_file_name") c.setopt(pycurl.FOLLOWLOCATION, 1) #允许跟踪来源 c.setopt(pycurl.MAXREDIRS, 5) #设置代理 如果有需要请去掉注释,并设置合适的参数 #c.setopt(pycurl.PROXY, ‘http://11.11.11.11:8080′) #c.setopt(pycurl.PROXYUSERPWD, ‘aaa:aaa’) return c
然后,封装出HTTP中的两个常用方法,GET和POST
def GetDate(curl, url): '''获得url指定的资源,这里采用了HTTP的GET方法 ''' head = ['Accept:*/*', 'User-Agent:Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.97 Safari/537.11'] buf = StringIO.StringIO() curl.setopt(pycurl.WRITEFUNCTION, buf.write) curl.setopt(pycurl.URL, url) curl.setopt(pycurl.HTTPHEADER, head) curl.perform() the_page =buf.getvalue() buf.close() return the_page def PostData(curl, url, data): '''提交数据到url,这里使用了HTTP的POST方法 备注,这里提交的数据为json数据, 如果需要修改数据类型,请修改head中的数据类型声明 ''' head = ['Accept:*/*', 'Content-Type:application/xml', 'render:json', 'clientType:json', 'Accept-Charset:GBK,utf-8;q=0.7,*;q=0.3', 'Accept-Encoding:gzip,deflate,sdch', 'Accept-Language:zh-CN,zh;q=0.8', 'User-Agent:Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.97 Safari/537.11'] buf = StringIO.StringIO() curl.setopt(pycurl.WRITEFUNCTION, buf.write) curl.setopt(pycurl.POSTFIELDS, data) curl.setopt(pycurl.URL, url) curl.setopt(pycurl.HTTPHEADER, head) curl.perform() the_page = buf.getvalue() #print the_page buf.close() return the_page
当然,还需要一些引用
import pycurl import StringIO import urllib
好了,给出个例子
c = initCurl() html = GetDate(c, 'http://www.baidu.com') print html