轉自: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
