python 获取搜狗输入法里面所有的表情图片

  1. 首先我们要使用fiddler爬取搜狗输入法表情接口,打开搜狗输入法键盘,里面有个表情,点击进去会进去搜狗的图片表情 ,其中有个输入框,我们要抓取的就是输入对应的文字,找到搜狗所有的管理按图片; 比如我输入的是
    "哈士奇",会出现
    python 获取搜狗输入法里面所有的表情图片
    其中的接口参数,我直接提供大家,大家可以按照这个接口格式进行获取图片

     http://config.pinyin.sogou.com/picface/interface/query_zb.php?cands=5ZOI5aOr5aWH&tp=0&page=1&h=D9BB9D40B88283286D79B44EB3849EBE&v=8.9.0.2180&r=0000_sogoupinyin_8.9c&pv=6.1.7601&sdk=1.1.0.1819
     其中只有参数 cands 以及 page 是变化的,cands是要搜索的条件即我们输入的"哈士奇",page是获取的页数
     显然输入的中文进行了编码,这就是 base64编码,但是经过 python base64 编码得到的是5ZOI5aOr5aWH,而
     我抓取接口参数是5zoi5AoR5Awh 。可能就是大小写的原因,但是我替换我生成的5ZOI5aOr5aWH参数,接口
     没有返回参数,反而5zoi5AoR5Awh 就返回了参数。。。。。

2.难点介绍

 1.cands 是base64 加密后的字符串,但是需要使用 python里面字符串函数 swapcase()  ,这个函数的意思是
 字符串内大写字符转化小写,而小写字母转化大写 , 即搜狗接口参数需要在我们进行base64加密之后进行
     转化,接口才可通
     2.解析图片,一般搜狗返回的是 图片url,比如 
     https://emoi-cncdn.bing.com/emotionimage/chat/b6be53fab273d5742de330b29e9f3a93.jpg,  这种我们自然
     可以获取二进制和图片后缀, 但是搜狗也会返回
     http://i03picsos.sogoucdn.com/3057c3f30647ee17 ,这种有二进制,但是不知道图片后缀

3.代码解释

     # -*- coding: UTF-8 -*-
     import base64
     import sys,requests,json,os,re

         #保存图片
    def save_img(content,path,name):
                    isExists=os.path.exists(path)
                    if not isExists:
                            os.makedirs(path) 
                    i_path = path+'\\'+name
                    with open(i_path,'ab') as f:    
                            f.write(content)     

                                    #获取接口的json数据
    def sougou_face(keyword,page):
        #搜狗的base64 加密,得到字符串需要转化 ,接口才可以使用
        serach_word = base64.b64encode(keyword)
        serach_word = serach_word.swapcase()     # 实现 大写转化小写,小写转化大写
        url_send = 'http://config.pinyin.sogou.com/picface/interface/query_zb.php'
        params = 'tp=0&page='+str(page)+'&h=D9BB9D40B88283286D79B44EB3849EBE&v=8.9.0.2180&r=0000_sogoupinyin_8.9c&pv=6.1.7601&sdk=1.1.0.1819';
        url_send = url_send+'?cands='+serach_word+'&'+params
        head={"Content-Type":"application/json;charset=utf-8"}
        response = requests.get(url_send,headers=head)
        return response.content

        #解析图片
    #http://i03picsos.sogoucdn.com/3057c3f30647ee17  可能存在这种图片
    def list_img(sogou_data):
        json_data = json.loads(sogou_data)
        if(json_data['imglist']):
            for k in json_data['imglist']:
                img_id = k['id']   #图片唯一标识
                img_type = k['url'][-3:]
                img_list = ['jpg','gif','png']
                #不带后缀时候  可以直接赋值后缀
                if img_type not in img_list:
                    img_type = 'jpg'
                response = requests.get(k['url']).content
                path = 'D:\\python\\study\\splider\\mask\\img\\'+k['keywords']
                save_img(response,path,img_id+'.'+img_type) 
        else:
                print u'未找到图片,停止程序' 
                exit()

   sogou_data = sougou_face('哈士奇',1)
    list_img(sogou_data)
    exit()

    #====================== 代码解释 =====================

    1.sogou_data = sougou_face('哈士奇',1)  
    搜索关键词为哈士奇,即接口参数中的 cands,1 代表搜索第一页,其中函数返回的是二进制
    2.list_img(sogou_data) 
    根据二进制生成对应的图片 ,在函数 list_img 里面
             img_id = k['id']   #图片唯一标识
                img_type = k['url'][-3:]
                img_list = ['jpg','gif','png']
                #不带后缀时候  可以直接赋值后缀
                if img_type not in img_list:
                    img_type = 'jpg'
     就是上面所说的,返回如果没有图片后缀的话,我们自动给图片后缀为jpg,保存路径可自动更改
     3.如果爬虫的同学,可以修改代码里面的 sougou_face('哈士奇',1)  ,即修改参数页数,sougou_face('哈士奇',2)  
     sougou_face('哈士奇',3)   sougou_face('哈士奇',4)  ,循环即可自动抓去 ,本文只显示手动抓取某一页
     4.这是早上突发奇想完成的,代码肯定有需要改善的地方,希望各位提出,谢谢!!
     5.最后如果你在 本地调试 ,cmd命令里面直接传参数
     cmd   python test.py 哈士奇 1    
     只需要添加  ,至于为什么要编码 ,就是cmd窗口默认是gbk编码,我们接受的值需要转化
     s_name = sys.argv[1].decode('gbk').encode('utf8')
    s_page = sys.argv[2]
    sogou_data = sougou_face(s_name,s_page)
    list_img(sogou_data)
    exit()

最后显示部分成果
python 获取搜狗输入法里面所有的表情图片

猜你喜欢

转载自blog.51cto.com/11484956/2317168
今日推荐