Python 爬取表情包-斗图不会输在起跑线

               Python 爬取表情包-斗图不会输在起跑线

对于酷爱聊天的朋友来说,表情包应该是他们心中的灵魂,没有图的聊天只能算虾扯蛋了。图片(表情包)赋予了聊天更多的内涵,很多时候一张内涵深刻的表情图片结合聊天时的上下语境,会让更多人认识到一个会聊天的人是多么的可贵,so,拥有的素材的多少(表情包),常常是斗图的关键,说不过某个人的时候,大可以洪水攻击嘛,以量取胜也是胜,这应该是一个朴素的道理。。

说了这么半天,那么现在有一个机会摆在你我的面前,作为Python的使用者,我想,我们应该是无物不爬的,当然,爬取的时候需要考虑道德因素,法律因素,仅仅是理论上的无物不爬,对么? 有人做了个网站叫斗图啦网站,方便狂热的斗图大神们在网站内寻找素材。我想,我应该安利一波这个网站,界面简洁大方,广告没有,是热心网友出于对表情包的热爱所开发的一个网站,因此,出于喜爱的原因,恳请各位不要爬坏了这个网站,毕竟,免费,无强制广告的良心网站不多了。

下面,从爬虫的角度来看看这个网站吧。https://www.doutula.com/

该网站没有使用什么特别的技术,仅仅是静态网页,没有动态加载之类的东西,也没有使用cookie,异步加载页面,可能有headers限制,相对爬虫来说,没有什么技术含量,直接爬就可以,需要注意一下,该网站是utf-8编码,不同于很多网站gbk,gb2312等编码,相对来说,难度又降低了很多。

下面,开始整活,直接上源码:

import requests
import  re
import time
#导入的包,time包主要用来生成文件名字
url='https://www.doutula.com/photo/list/?page='
headers = {
        "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/53"
                      "7.36 (KHTML, like Gecko) Chrome/81.0.4044.122 Safari/537.36"
    }
for i in range(0,2):
    thisurl=url+str(i+1)

    data=requests.get(url=thisurl,headers=headers)
    data.encoding='utf-8'
#指定读取的编码格式与网页一致。
    #print(data)
    print('开始爬取第',str(i+1),'页')
    pat='data-backup="(.*?)">'
    picurl=re.compile(pat,re.S).findall(data.text)
#整个分页里所包含的图片网址列表
    #print(picurl)
    for j in range(0,len(picurl)):
        #print(picurl[j])
#这一步是关键,取出每个图片所对应的网址
        pic=requests.get(picurl[j]).content
#requests模块读取图片到内存,因为对象是映射在内存,get方法后的content表示二进制形式。
#如果为text,表示是读取为文本形式
        with open(str(time.time())+'.gif','wb') as f:
#使用with语句是为了程序的运行速度,实现自动开闭数据流。
#保存的时候,文件名字不能有重复,如果重复,必定覆盖了,因此,使用了time()函数,因为时间不会重复
#一开始,打算使用自增变量,但实践后发现,变量作用域有限,无法突破循环的限制。
            f.write(pic)

使用正则提权data-backup="http://img.doutula.com/production/uploads/image/2020/05/01/20200501264325_erazHB.jpg">中的http://img.doutula.com/production/uploads/image/2020/05/01/20200501264325_erazHB.jpg,该页面全部符合的选项提取出来后就保存在了一个列表中。上图,我们可以看到是68个这样的网址,该网址即为图片的地址,保存在内存中,然后写入磁盘即可。

爬取的起始网址是https://www.doutula.com/photo/list/?page= ,分页是page=后面的数字,第一个页面省略了数字1,第二个页面为https://www.doutula.com/photo/list/?page=2,以此类推,该页面是该站的所有图片,总共有3417页,每页的图片是68个图片,在该源码中,爬取页面数量在第一个for循环内,本例为爬取两页,第二个for循环是循环读取分页的图片网址列表,该列表为68个元素的列表,该例中,列表定义的名字为picurl。

第二个循环主要做的事情是,循环取出picurl的每个图片网址,使用requests模块,将每个图片网址以二进制形式读取到内存中,这样图片就存到了内存中,然后从内存中以写二进制流形式,将读取到的内容写入以当前时间戳为名字的gif文件中,第二个循环读取完68个图片网址后再将第二页的图片网址读取并保存文件,直到所设定的两页网页读取完毕,程序结束。

本例只设定了爬取两页,有更多需要自己更改第一个循环内的数字。保存的图片格式为gif,是由于gif兼容jpg,png等静态格式图,并且网页内有个别的图片是gif,关键是gif格式兼容性更好。

爬取结束后,Windows下,爬虫程序所在目录就会保存有所下载的图片,缩略图形式查看简直不要太简单。图片复制到聊天工具的图片存储位置就可以开心的使用了。

猜你喜欢

转载自blog.csdn.net/alwaysbefine/article/details/105901234
今日推荐