curl指令使用与python中调用shell指令相关问题

今天在使用Linux中curl指令迁移到python中遇到了问题,特此记录。  

近日实习中需要跑hadoop脚本来统计各个小流量组中历史零值率来检验各个实验策略算法的效果,这里的零值率定义为手百每个用户关注作者中从没有展现出的作者数量的比例(例如我关注了100个作者但是从头到尾我是刷出来过90个作者的文章,零值率为0.1)。统计这个指标的步骤如下:

1.在当天的手百日志中对每个小流量号捞出一定量的不重复的cuid。

2.对每个cuid通过关注关系接口获取关注作者的数量,记为a。

3.对每个cuid访问用户模型筛选出截止目前有过展现的pair数量,记为b。

4.对这个cuid的历史零值率为(1-b)/a。

5.对小流量组内所有cuid的零值率做简单平均。

以上除了第三步都十分顺利,第三步中用户模型的访问中遇到了一些问题:

用curl -d '{xxx}' http://xxxxx 访问用户模型可以连接有返回值

在python中我尝试了两种写法,一种是requests

#encoding:utf-8
import requests

data = {"user_id":{"cuid":"E383509BD7466FF4BF4ED13EC0274D47|863918720232668"},"client":"vertical-guanzhu-tmp","token":"644daeb846da35c19d187669c51044fc","service_tag":"common","feature_meta":[{"name":"henghua_user_model"}]}

response = requests.post("http://tc-bjsecond19.tc.baidu.com:8719/UserModelRestService/get_feature", data=data)
print response

另一种是使用urllib2

#encoding:utf-8
import urllib
import urllib2
import json
 
#发起请求的url
post_url = 'http://tc-bjsecond19.tc.baidu.com:8719/UserModelRestService/get_feature'
 
postData  = {"user_id":{"cuid":"9856EF7C34679284D489011674CA3929|440495030204168"},"service_tag":"common","feature_meta":[{"name":"henghua_user_model"}]}
#json序列化
data = json.dumps(postData)
     
req = urllib2.Request(post_url)
response = urllib2.urlopen(req,urllib.urlencode({'sku_info':data}))
 
#打印返回值
print response.read()

均提示错误400,无法连接。检查了代码应该没有问题,具体原因目前还不知,但是任务急迫,查资料发现python中可以通过os.popen(),commands等库调用shell指令:

尝试如下:(下为我的hadoop脚本中的reduce.py)

import os
import sys
import re
import json


if __name__ == '__main__':
    pre_line=""
    while True:
        try:
            line = sys.stdin.readline()
            if not line:    
                break
            id=line.strip().split(':')[0]
            cuid = line.strip().split('\t')[0].strip().split(':')[1]
#            print cuid
            all_num = line.strip().split('\t')[1]
            if pre_line=="":
                pre_line=line
                shell_str='curl -s -d \'{"user_id":{"cuid":'+'"'+cuid+'"'+'},"client":"vertical-guanzhu-tmp", "token":"644daeb846da35c19d187669c51044fc", "service_tag":"common","feature_meta":[{"name":"henghua_user_model"}]}\' http://tc-bjsecond19.tc.baidu.com:8719/UserModelRestService/get_feature'
                file = os.popen(shell_str)      /os.popen执行shell指令  
                a = file.read()
#                print a
                a = json.loads(a)
#                print a
                a = a['feature_status']
                a = a[0]
                a = a['value']
                doc = json.loads(a)
                data = doc['author_dis']
                suc_num=0
                for dat in data:
                    if int(dat[1]) == 5000:
                        suc_num += 1
                print id + '\t' +str(suc_num) +'\t'+ str(all_num)   
            elif line == pre_line:
                continue
            else:  
                pre_line=line
                shell_str='curl -s -d \'{"user_id":{"cuid":'+'"'+cuid+'"'+'},"client":"vertical-guanzhu-tmp", "token":"644daeb846da35c19d187669c51044fc", "service_tag":"common","feature_meta":[{"name":"henghua_user_model"}]}\' http://tc-bjsecond19.tc.baidu.com:8719/UserModelRestService/get_feature'
                file = os.popen(shell_str)
                a = file.read()
                a = json.loads(a)
                a = a['feature_status']
                a = a[0]
                a = a['value']
                doc = json.loads(a)
                data = doc['author_dis']
                suc_num=0
                for dat in data:
                    if int(dat[1]) == 5000:
                        suc_num += 1
                print id + '\t' +str(suc_num) + '\t' + str(all_num)
                          
        except Exception as e:
#            sys.stderr.write(str(e))
            continue

用commands.statusouput()返回的格式有点问题处理不如os.popen()方便,但是commands.statusoutput()可以返回指令执行的状态,即成功与失败,这是它优于os.popen()的地方。

附录:curl指令使用方法

语法:# curl [option] [url]
-A/--user-agent <string>              设置用户代理发送给服务器
-b/--cookie <name=string/file>    cookie字符串或文件读取位置
-c/--cookie-jar <file>                    操作结束后把cookie写入到这个文件中
-C/--continue-at <offset>            断点续转
-D/--dump-header <file>              把header信息写入到该文件中
-e/--referer                                  来源网址
-f/--fail                                          连接失败时不显示http错误
-o/--output                                  把输出写到该文件中
-O/--remote-name                      把输出写到该文件中,保留远程文件的文件名
-r/--range <range>                      检索来自HTTP/1.1或FTP服务器字节范围
-s/--silent                                    静音模式。不输出任何东西
-T/--upload-file <file>                  上传文件
-u/--user <user[:password]>      设置服务器的用户和密码
-w/--write-out [format]                什么输出完成后
-x/--proxy <host[:port]>              在给定的端口上使用HTTP代理
-#/--progress-bar                        进度条显示当前的传送状态

猜你喜欢

转载自blog.csdn.net/weixin_38526306/article/details/86708226
今日推荐