来斗图吧 骚年!

之前有介绍过GitHub上的表情包仓库,但感觉数量太少,不能满足经常斗图的需求,于是我决定从无所不有的互联网中挖掘表情包资源。

image

这次的爬取目标是人均年薪百万的某乎,里面有关表情包的问答,几乎每个回答都给出了大量的表情包,来自五湖四海的网友在某乎以表情包会友,那我就来把你们发的全部都收集起来~

image

首先我们先把所有回答展开,查看全部回答。打开开发者工具,找到回答所在页面,将Requests Headers里的内容全部拷贝到咱们自己的Headers中。利用 requests 爬取该页面。

params 中的 offset 根据页面的更改更改其值,每翻一页,offset 就加5 。其他的参数不发生改变。

接着观察网页源代码,我们可以清楚的看到每一张图片的链接就放在 data-actualsrc 之后。

image

而这个链接的获取可以使用正则表达式将其从网页源代码中获取。

pic_urls=re.findall(r'data-actualsrc="(.*?.(gif|jpg|png))',content)

根据这些图片的url链接,我们只要再构造requests请求,便可以把所有图片下载下来。一个很直观的想法就是先访问源网页,用一个列表保存所有的图片url,然后遍历这个列表,逐个访问并下载内容。

这样操作的话消耗的内存比较大,并且下载图片的速度较慢,因此我采取了另外一种策略,一个简单的 Requests + Redis 的分布式爬虫。

image

获取图片URL

按照之前所说的那样,爬取获得URL链接,不同的是,我们将其存储在Redis中把所有 url 添加到同一个集合中。

def get_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=requests.get(self.url,headers=self.headers,params=params)
        data=r.json()['data']
        for i in data:
            content=i['content']
            pic_urls=re.findall(r'data-actualsrc="(.*?.(gif|jpg|png))',content)
            for j in range(len(pic_urls)):
                self.r.sadd("urls",pic_urls[j][0])
image

图片下载

新建一个py文件用于下载图片,因为链接的获取速度比图片下载速度快不少,因此在图片下载这一环中采用了多线程处理 requests 请求。

    def download(self):
        if "urls" in self.r.keys():
            while True:
                try:
                    url=self.r.spop("urls")
                    r=requests.get(url,headers=self.headers)
                    with open(img_path+os.path.sep+'{}{}'.format(self.count,url[-4:]),'wb') as f:
                        f.write(r.content)                    
                    print("已经成功下载{}张表情包!".format(self.count))
                    self.count+=1
                except:
                    if "urls" not in self.r.keys():
                        print("表情包已全部下载完成")
                        break
                    else:
                        print("{}请求发送失败!".format(url))
                        continue
        else:
            self.download(self)

两个程序同时运行,一边获取url存入Redis, 另一边提取url 下载图片。大大加快了下载速度,并且减少了内存的使用。

成果展示

一共爬取了5W+张表情包,包含骚骚的gif动图。哈哈!斗胆问一句:斗图谁与争锋?

image

所有表情包我已经放入某盘,后台回复 表情包 即刻获取~

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • [TOC] 1.基本概念 爬虫就是获取网页并提取和保存信息的自动化程序 1.HTTP基本原理理 1.URI和URL...
    文化银儿阅读 1,722评论 0 0
  • 前言 你还在,你还在,头悬梁锥刺股。 下,下,下,表情包吗? 你还以为盗个图战胜小学生。 就能成为斗图王吗? 你还...
    猫先生的早茶阅读 564评论 0 0
  • 点击查看原文 Web SDK 开发手册 SDK 概述 网易云信 SDK 为 Web 应用提供一个完善的 IM 系统...
    layjoy阅读 14,032评论 0 15
  • 之前看朋友发的一个活动很有意思,是青岛官方组织的城市定向赛,就是在一定的时间内完成不同点位的任务,听闻大概有一万多...
    如此青梨阅读 159评论 0 0
  • 第一章名词。 这是要点名词,根据其意义分为专有名词和普通名词,名词分为可数名词和不可数名词,名词的所有
    一娃妈妈阅读 177评论 0 0