python 獲取搜狗輸入法裡面所有的表情圖片
阿新 • • 發佈:2018-11-15
-
首先我們要使用fiddler爬取搜狗輸入法表情介面,開啟搜狗輸入法鍵盤,裡面有個表情,點選進去會進去搜狗的圖片表情 ,其中有個輸入框,我們要抓取的就是輸入對應的文字,找到搜狗所有的管理按圖片; 比如我輸入的是
"哈士奇",會出現
其中的介面引數,我直接提供大家,大家可以按照這個介面格式進行獲取圖片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()
最後顯示部分成果