pycurl初体验-利用pycurl产生post请求:上传文件

最近有个事情,需求是发送post请求到web服务器,达到文件上传的目的,这个当然是有原因的,因为那个网站没有做批量上传,而需要上传的东西又太多……好了,废话不多说,进入正题:

这样的小事情当然还是用python来写比较简单快捷,用到http请求最直接的方式是用标准库里面的urllib和urllib2,但不能满足这次的需求,因为文件上传要将form表单的method设置成multipart/form-data, 而urllib里面的实用的是默认的application /x-www-form-urlencoded,于是找到了pycurl poster 和urllib2_file三个可用的库,我只尝试了pycurl,其他的有时间再尝试。(http://blog.chinaunix.net/uid-1721137-id-348702.html这里有poster的尝试,我也主要从他这里获取的信息)

关于pycurl可以去它的主页上进一步了解(http://pycurl.sourceforge.net/),可以发送多种协议的信息,而且可以携带cookie,而且有并发控制的实现,很强大!它是著名的libcurl的python绑定,我上common-lisp.net上查了一下,lisp也有对应的库可以使用(cl-curl)!这个世界真美好!

# -*- coding: utf-8 -*-
import pycurl
import os
def upload(filename):
	pc = pycurl.Curl()
	pc.setopt(pycurl.POST, 1)
	pc.setopt(pycurl.URL, 'your url')
	pc.setopt(pycurl.HTTPPOST, [('file fieldname', (pc.FORM_FILE, filename)),\ 
						      ('filed1_name', (pc.FORM_CONTENTS, "value"))])

	pc.perform()
	response_code = pc.getinfo(pycurl.RESPONSE_CODE)
	pc.close()

if __name__ == "__main__":
	filelist = os.listdir(".")
	for f in filelist:
	        upload(f)
	print "OK"
 

 

其中,your url是网站上传请求的url,file fieldname是的name,filename是要上传文件的路径,field1_name是form表单中其他字段的的name,value是对应的值。value的外层最好有FORM_CONTENTS包裹,不然有时候中文的编码问题会导致提交post失败。

这样就可以把当前目录的所有文件上传了,当然这还只是简单的尝试,libcurl功能十分强大,做爬取或自动登录啥的都是手到擒来,而且因为pycurl是堆libcurl的绑定,所以效率应该比urllib高不少,值得研究。决定抽空好好学习一下,并用lisp的cl-curl做的小东西玩玩。

 

你可能感兴趣的:(文件上传,pycurl,post请求)