当前位置: 首页 > 后端技术 > Python

打架吧骚年!

时间:2023-03-26 01:39:32 Python

之前在GitHub上介绍过表情包仓库,但是觉得数量太少,无法满足频繁打架图片的需要,于是决定从无处不在的网络中挖出表情包资源。这次的爬取对象是人均年薪百万的谋虎。在关于表情的问答中,几乎每个答案都给出了大量的表情。把你的帖子都收起来吧~首先,展开所有的答案,检查所有的答案。打开开发者工具,找到答案所在的页面,将RequestsHeaders中的内容全部复制到我们自己的Headers中。使用请求来抓取页面。params中的offset会随着翻页改变其值,每翻一页offset加5。其他参数不变。然后观察网页源码,我们可以清楚的看到每张图片的链接都放在了data-actualsrc之后。而这个链接可以通过正则表达式从网页的源代码中获取。pic_urls=re.findall(r'data-actualsrc="(.*?.(gif|jpg|png))',content)根据这些图片的url链接,我们只需要构造请求下载所有图片下来,一个很直观的想法是,先访问源网页,将所有的图片网址保存在一个列表中,然后遍历列表,逐个访问下载内容,这个操作非常耗内存,下载图片速度比较慢,所以我采用了另一种策略,一个简单的Requests+Redis的分布式爬虫,前面说的获取图片url,爬取得到url链接,不同的是我们存储在redis中,把所有添加的url都放在到同一套。defget_urls(self,offset,urls):params={'include':'data[*].is_normal,admin_closed_comment,reward_info,is_collapsed,annotation_action,annotation_detail,collapse_reason,is_sticky,collapsed_by,suggest_edit,comment_count,can_comment,content,editable_content,voteup_count,reshipment_settings,comment_permission,created_time,updated_time,review_info,relevant_info,question,excerpt,relationship.is_authorized,is_author,voting,is_thanked,is_nothelp,is_labeled,is_recognized,paid_info,paid_info_content;data[*].mark_infos[*].url;data[*].author.follower_count,badge[*].topics','limit':5,'offset':offset,'platform':'desktop','sort_by':'default'}r=请求。get(self.url,headers=self.headers,params=params)data=r.json()['data']foriindata:content=i['content']pic_urls=re.findall(r'data-actualsrc="(.*?.(gif|jpg|png))',content)forjinrange(len(pic_urls)):self.r.sadd("urls",pic_urls[j][0])图片下载新一个py文件用来下载图片,因为链接获取速度比图片下载速度快很多,所以在图片下载链接中使用多线程处理请求defdownload(self):if"urls"inself.r.keys():whileTrue:try:url=self.r.spop("urls")r=requests.get(url,headers=self.headers)打开(img_path+os.path.sep+'{}{}'.format(self.count,url[-4:]),'wb')asf:f.write(r.content)print("already成功下载{}个表情符号!".format(self.count))self.count+=1except:if"urls"notinself.r.keys():print("Allemoticonshavebeendownloaded")breakelse:print("{}requestfailedtosend!".format(url))continueelse:self.download(self)两个程序同时运行,一方获取url存入Redis,另一方提取下载图片的url。大大加快下载速度并减少内存使用。结果显示,一共爬取了5W+表情,包括骚骚gif动图。哈哈!大胆发问:谁来争锋?我把所有的表情包都放到了某个盘里,后台回复表情包立马就可以拿到~