找回密码
 加入怎通
查看: 217|回复: 1

pycurl简易实用demo(pythonurl)

[复制链接]
我来看看 发表于 2023-03-21 23:19:33 | 显示全部楼层 |阅读模式
. S- a R# M: A, m* d2 s/ ?

pycURl是python编写的ibcurl.的接口,今天在使用的时候,出现了一个小问题,我发送的数据对方无法正常接收,后来才知道是content-type设置不正确的原因.pyCURL默认的Content-Type是

: r+ _1 `( g7 P

application/x-www-form-urlencoded,也就是说,如果没有明确设定,则发送的数据是url编码之后的数据.可是如果用这个工具发送json字符串 的request body,则必须显式指定json对应的内容类型

2 ^6 z9 s8 t8 w' E) ?

Content-Type:application/json;charset=xxxx,否则接收方收到的数据是错误的.以下是我写的一个简易curl,具有基本的获取响应数据,和上传文件,携带cookie,保存cookie等功能.

5 Z: {* o- W9 W3 n' u4 G* S

import osimport pycurlimport urllibfrom StringIO import StringIOurl:请求的urlcookies:携带的cookieposdata:请求体,可以是字符串,或者其他可以urlencode的类型uploadfiles:上传文件的参数,格式为{name:filename,path:filepath}referer:来源httpheader:自定义header头ua:客户端代理名cookiejar:存储请求响应后的cookie的文件路径customrequest:自定义请求方法注意:1.暂时没有进行ssl验证2.由于后续需要对请求获取各种数据,比如HTTP_CODE,所以请求发出后并没有关闭,而是将pycurl.Curl对象返回方便查询

, B o( x* D& }* |( |: T' `

def myCurl(url,cookies=,postdata=,uploadfiles=,referer=,httpheader=,ua=,cookiejar=,customrequest=):    buffer

0 P$ l; W) ?5 h# {

= StringIO()    c = pycurl.Curl()    c.setopt(c.WRITEDATA, buffer)    c.setopt(pycurl.SSL_VERIFYPEER, 0)    c.setopt(pycurl.SSL_VERIFYPEER, 0)    c.setopt(pycurl.SSL_VERIFYHOST, 0)    c.setopt(pycurl.FOLLOWLOCATION,

+ D- a& C5 c7 q

1)    if(ua == ):        c.setopt(pycurl.USERAGENT,Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.79 Safari/537.36

6 l+ z' I1 a8 |6 \; A

)    else:        c.setopt(pycurl.USERAGENT,ua)    if(httpheader):        c.setopt(pycurl.HTTPHEADER,httpheader)    

. ^0 x) t) P$ O9 g- _

if(referer):        c.setopt(pycurl.REFERER, referer)    if(cookies):        c.setopt(pycurl.COOKIE,cookies)    c.setopt(pycurl.URL,url)    

8 N2 _0 S: u5 c8 D0 V/ h% H

if(customrequest):        c.setopt(pycurl.CUSTOMREQUEST, customrequest)    if(postdata):        if isinstance(postdata,str):

) |% k; }" D# g/ a

#字符串不要使用urlencode postfields=postdata        else:            postfields=urllib.urlencode(postdata)        c.setopt(c.POSTFIELDS, postfields)    

T `) w. l3 q/ l/ E

if(uploadfiles):#如果需要上传文件 multipartFormData=[]        fileTuple=(uploadfiles[name], (                

( B2 u6 |# d0 Y7 K

# upload the contents of this file c.FORM_FILE, uploadfiles[path],            ))        multipartFormData.append(fileTuple)        

9 f4 c' ~/ y" t3 J! m

if (postdata): #除了文件还要上传其他一些数据,也要加上for index in postdata:                if(isinstance(postdata[index],int)):                    postdata[index]

+ V: E, k3 k( Y2 _3 a# g2 P

=str(postdata[index])                multipartFormData.append((index,postdata[index]))        c.setopt(c.HTTPPOST, multipartFormData)    

* {2 V* q4 P5 q3 x9 e5 W1 |, S

if cookiejar:        c.setopt(pycurl.COOKIEJAR, cookiejar)    res=c.perform()    if cookiejar:        cookieStr

0 c, ?0 M' B( k3 y* ]2 K' R) _

= for line in open(cookiejar):            if (line.find(#) == 0 or line == \n): # 注意换行并不是空字符串,也要去掉continue

- m G/ ~+ M J" F# V/ L

           line = line.strip(\n) # 去掉空字符串 lineArr = line.split(\t) # 根据制表符切开 length = len(lineArr)            name

* u7 E( L1 v0 p% D" w' @

= lineArr[length - 2]            value = lineArr[length - 1]            cookieStr = cookieStr + name +

! y. E( s6 l- O

= + value + ;        cookieStr.strip(; )        os.remove(cookiejar)    if cookiejar:        data = {

' I+ O4 q7 `! s5 _3 x) d

c: c, data: buffer.getvalue(),cookies:cookieStr}    else:        data = {c: c, data: buffer.getvalue()}    

4 A/ P; N! s) B

#c.close() # getinfo must be called before close.return data

. c" T6 R3 L, c& w0 _4 e, F0 b: U ! \( x) Z* d& Q4 X 1 _ j& z5 q$ b$ J2 J! A 5 b1 N& @* f5 X0 J ( z+ r, C+ U# P

暂时无法加载帖子列表

回复

使用道具 举报

kmleelee 发表于 2026-09-08 15:49:38 | 显示全部楼层
这个思路很新颖,打开了新世界的大门,谢谢分享
回复

使用道具 举报

    您需要登录后才可以回帖 登录 | 加入怎通

    本版积分规则

    QQ|手机版|小黑屋|网站地图|真牛社区 ( 苏ICP备2023040716号-2 )

    GMT+8, 2026-9-12 11:19 , Processed in 0.037674 second(s), 25 queries , Gzip On.

    免责声明:本站信息来自互联网,本站不对其内容真实性负责,如有侵权等情况请联系420897364#qq.com(把#换成@)删除。

    Powered by Discuz! X3.5

    快速回复 返回顶部 返回列表