原创 小瑜 3月28日
大家好,我是小瑜!在文末给大家准备了一些爬虫的学习资料,需要的自己提取。
最近小瑜在跟别人聊天的时候,常常因为没有一个有趣的表情包而使得聊天枯燥无味且尴尬,所以,小瑜花费了一个小时,用Python爬取了40w+表情包。现在来分享给大家!
分析网页
我们此次是从百度图片中爬取表情包。
首先我们按F12打开开发者模式,对name里面的网页进行观察,发现我们要的图片数据存在XHR中,如图:
我们进一步发现,单个网页中只存有30张表情包的数据,那么我们只要找到每个网页URL之间的关系,就可以进行批量提取了。我观察了前三个URL中的params参数,发现了URL之间存在的规律,每一页的params参数中的gsm参数在上一页中存储着,且pn参数比上一页多30。如图:
所以,综上我们就构建出了网页的URL,部分代码如下:
('word','表情包'),
('s',''),
('se',''),
('tab',''),
('width',''),
('height',''),
('face','0'),
('istype','2'),
('qc',''),
('nc','1'),
('fr',''),
('expermode',''),
('force',''),
('pn', str(page *30)),
('rn','30'),
('gsm', re.findall('"gsm":"(.*?)"',response.text)),
)
获取数据
从上面我们可以看出百度图片的数据用json转化成字典的形式提取是最简单的方式,但是它提取到第10页后会出现这个错误。
好不容易才分析好了网页,没想到才爬取了10页数据就over了。
不过,小瑜并没有放弃,而是继续的研究。
皇天不负有心人,终于让小瑜找到了解决办法。我们不在将数据转化成字典,而是转化成字符串,然后用正则表达式进行提取,就可以批量获取表情包了。代码如下:
response = requests.get('https://image.baidu.com/search/acjson', headers=headers,cookies=cookies,params=params)
a = re.findall('"thumbURL":"(.*?jpg)"', response.text)
names = re.findall('"fromPageTitleEnc":"(.*?)",',response.text)
让我们来看看提取的效果:
效果很好,没有什么问题,那我们就可以开始着手准备存储图片了。
存储图片
数据存储的方式在之前的文章已经讲的很清楚了(不懂的朋友可以看看这篇文章一文教会你,Python数据如何存储),这里我们不在详细介绍,我们直接展示代码:
foriina:
r = requests.get(i)
try:
withopen(f'{names[x]}.jpg','ab')asf:
f.write(r.content)
x=x+1
except:
pass
让我们来看看效果图:
总结
1. 本文详细的介绍了如何从百度图片上批量获取表情包,请读者仔细阅读,并加以操作!(仅供学习,不做商用)
2. URL中params参数需要在上一页数据中获取,是URL构造的新形式,请读者仔细研究!
3. 资料下载到本地打开,直接网页打开会显示压缩包错误。(链接:https://pan.baidu.com/s/1Lq5J9-o7horh0RN15mS9Iw
提取码:gols)