1. 程式人生 > >python 獲取搜狗輸入法裡面所有的表情圖片

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 獲取搜狗輸入法裡面所有的表情圖片