-
首先我们要使用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()
最后显示部分成果