赞
踩
首先需要理解requests 模块
requests是使用Apache2 licensed 许可证的HTTP库。
用python编写。
比urllib2模块更简洁。
Request支持HTTP连接保持和连接池,支持使用cookie保持会话,支持文件上传,支持自动响应内容的编码,支持国际化的URL和POST数据自动编码。
在python内置模块的基础上进行了高度的封装,从而使得python进行网络请求时,变得人性化,使用Requests可以轻而易举的完成浏览器可有的任何操作。
现代,国际化,友好。
requests会自动实现持久连接keep-alive
r.encoding #获取当前的编码
r.encoding = 'utf-8' #设置编码
r.text #以encoding解析返回内容。字符串方式的响应体,会自动根据响应头部的字符编码进行解码。
r.content #以字节形式(二进制)返回。字节方式的响应体,会自动为你解码 gzip 和 deflate 压缩。
r.headers #以字典对象存储服务器响应头,但是这个字典比较特殊,字典键不区分大小写,若键不存在则返回None
r.status_code #响应状态码
r.raw #返回原始响应体,也就是 urllib 的 response 对象,使用 r.raw.read()
r.ok # 查看r.ok的布尔值便可以知道是否登陆成功
#*特殊方法*#
r.json() #Requests中内置的JSON解码器,以json形式返回,前提返回的内容确保是json格式的,不然解析出错会抛异常
r.raise_for_status() #失败请求(非200响应)抛出异常
file_name = username + "_test.csv"
with open(file_name, "wb") as f:
f.write(res.content)
df = pd.read_csv(file_name, sep='\t')
理解之后获取文件流就迎刃而解了,很显然用 r.content 就这个方法就OK了,可以手动调试一下,比如我这边的获取的就是 csv 文件形式的数据,所有数据以\n分行,并通过\t分隔开。
[in]:res.content
[out]:b'Date\tCampaign Id\tOffer Id\tLocation\tImpression\tClick\tConversion\tEcpm\tCpc\tCtr\tCvr\tIvr\tSpend\n20211030\t8907\t37934\tUS\t0\t63\t0\t0\t0.00000\t0\t0.00000\t0\t0.00000\n20211030\t14052\t52045\tVN\t0\t32\t0\t0\t0.00000\t0\t0.00000\t0\t0.00000\n20211030\t14052\t52616\t**\t0\t1\t0\t0\t0.00000\t0\t0.00000\t0\t0.00000\n20211030\t14052\t54484\tID\t0\t20\t0\t0\t0.00000\t0\t0.00000\t0\t0.00000\n20211030\t9856\t44259\tUS\t0\t1\t0\t0\t0.00000\t0\t0.00000\t0\t0.00000\n20211030\t14052\t57610\tID\t44\t494\t0\t0.00000\t0.00000\t11.22727\t0.00000\t0.00000\t0.00000\n20211030\t14052\t62767\tUS\t523973\t28932\t1642\t1.88025\t0.03405\t0.05522\t0.05675\t0.00313\t985.20000\n20211030\t14052\t52062\tVN\t4\t45\t0\t0.00000\t0.00000\t11.25000\t0.00000\t0.00000\t0.00000\n20211030\t14052\t62767\tMM\t4\t0\t0\t0.00000\t0\t0.00000\t0\t0.00000\t0.00000\n20211030\t14052\t52616\tID\t792563\t29384\t2337\t0.15534\t0.00419\t0.03707\t0.07953\t0.00295\t123.11500\n20211030\t9856\t40895\tUS\t0\t17\t0\t0\t0.00000\t0\t0.00000\t0\t0.00000\n20211030\t11745\t46226\tID\t0\t1\t0\t0\t0.00000\t0\t0.00000\t0\t0.00000\n20211030\t8907\t45078\tUS\t0\t20\t0\t0\t0.00000\t0\t0.00000\t0\t0.00000\n20211030\t14052\t53382\tID\t1\t50\t0\t0.00000\t0.00000\t50.00000\t0.00000\t0.00000\t0.00000\n20211031\t14052\t62767\tUK\t1\t0\t0\t0.00000\t0\t0.00000\t0\t0.00000\t0.00000\n20211031\t14052\t52616\tSG\t1\t0\t0\t0.00000\t0\t0.00000\t0\t0.00000\t0.00000\n20211031\t8907\t37934\tUS\t0\t60\t0\t0\t0.00000\t0\t0.00000\t0\t0.00000\n20211031\t8907\t39150\tUS\t0\t1\t0\t0\t0.00000\t0\t0.00000\t0\t0.00000\n20211031\t14052\t52045\tVN\t0\t29\t0\t0\t0.00000\t0\t0.00000\t0\t0.00000\n20211031\t9856\t42378\tBR\t0\t1\t0\t0\t0.00000\t0\t0.00000\t0\t0.00000\n20211031\t14052\t52616\tUS\t1\t0\t0\t0.00000\t0\t0.00000\t0\t0.00000\t0.00000\n20211031\t8907\t38997\tUS\t0\t3\t0\t0\t0.00000\t0\t0.00000\t0\t0.00000\n20211031\t14052\t57610\tID\t43\t437\t0\t0.00000\t0.00000\t10.16279\t0.00000\t0.00000\t0.00000\n20211031\t9856\t40895\tUS\t0\t13\t0\t0\t0.00000\t0\t0.00000\t0\t0.00000\n20211031\t14052\t53382\tID\t1\t33\t0\t0.00000\t0.00000\t33.00000\t0.00000\t0.00000\t0.00000\n20211031\t14052\t62767\tMM\t2\t0\t0\t0.00000\t0\t0.00000\t0\t0.00000\t0.00000\n20211031\t8907\t45078\tUS\t0\t26\t0\t0\t0.00000\t0\t0.00000\t0\t0.00000\n20211031\t9856\t44259\tUS\t0\t1\t0\t0\t0.00000\t0\t0.00000\t0\t0.00000\n20211031\t14052\t62767\tUS\t594255\t35266\t1697\t1.71341\t0.02887\t0.05934\t0.04812\t0.00286\t1018.20000\n20211031\t14052\t62767\tSG\t1\t0\t0\t0.00000\t0\t0.00000\t0\t0.00000\t0.00000\n20211031\t14052\t54484\tID\t1\t15\t0\t0.00000\t0.00000\t15.00000\t0.00000\t0.00000\t0.00000\n20211031\t14052\t52616\tID\t740982\t34884\t3040\t0.22202\t0.00472\t0.04708\t0.08715\t0.00410\t164.51500\n20211031\t14052\t52062\tVN\t4\t46\t0\t0.00000\t0.00000\t11.50000\t0.00000\t0.00000\t0.00000\n'
一般流数据就下载到文件中,在对文件进行处理,比如我这边的就是通过pandas读取文件数据,并对数据进行加工和输出。
当然也可以将数据放到内存中,对内存进行读取。
这边是使用的pandas读取csv文件的形式,一般最常见的就是读取文件,不过想一想如果直接将数据存入内存中就不需要磁盘这个中介了,而且存在磁盘在某种情况下设置相同文件存在误读的风险。而根据pandas文档对read_csv的介绍,确实是可以读取内存的。
这边就用到了io模块的 BytesIO 和 StringIO
# before
file_name = username + "_test.csv"
with open(file_name, "wb") as f:
f.write(res.content)
df = pd.read_csv(file_name, sep='\t')
# after
res_data = io.BytesIO(res.content)
df = pd.read_csv(res_data, sep='\t')
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。