后浪青年的聊天,需要 Python 助威

来源:Python 技术「ID: pythonall」

微信已经成为了我们大多数国人的聊天工具,在微信聊天中,选择合适的时机发送适当的表情,不仅可以丰富我们的聊天内容,而且还有化解尴尬、增进感情等等效果。而后浪们还会经常开启战斗模式——斗图。这时候谁的库存弹药充足谁就可获胜。今天我就用 Python 来爬取表情包,希望为各位后浪青年的聊天储备弹药,为增进后浪青年的交流略尽绵薄之力。

选定目标

既然是要抓取表情供后浪青年使用,那么我们就要选择后浪青年喜欢的表情社区作为目标,这里我把我那毒辣的眼神瞄向了“斗图啦”,网址是 https://www.doutula.com/。

我们进入网站,可以看到首页是这样子的:

首页

我们的目标是补充弹药库,所以我们需要关注网站的最新表情。我选择爬取的模块是“最新表情”栏目,点击进去是这样的:

最新表情

目标分析

既然确定了目标,接下来我们就需要对目标页面进行分析,进而选择合适的爬取方式。

获取页面内容

我们首先可以看到这个页面是以分页的形式展现内容的,那么首先应该想到的是点击不同分页,看看 URL 是否是有规律的。于是,我点击第二页,第三页,对应的 URL 分别是:https://www.doutula.com/photo/list/?page=2 和 https://www.doutula.com/photo/list/?page=3。这就好办了,除了第一页,其他的页面 URL 是根据分页数有规律变化的,那么我们就可以通过直接请求 URL 来获取每一页内容。

解析页面内容

获取到每一页的内容之后,我们就可以对每一页的网页内容进行解析了。我们在页面点击右键,然后选择“显示源码”,来看看页面的源码是怎样的,从中找到解析内容的蛛丝马迹。最简单的方法是从页面中找到一个图片的名称,去源码页面搜索,我搜索之后的结果是这样的:

源码页面

我们很容易地看到每个图片都是一个 a 标签,从 a 标签中,我们可以获取到图片的 URL 以及图片的名称和后缀等信息。

下载图片

获取到图片的 URL 之后,我们只需要下载下来保存到本地目录就可以了。

代码实现

废话不多说,遵循目标分析的步骤,我直接将代码贴出来:

import threading
import requests
from lxml import etree
import os
import random
import time
from queue import Queue

headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.94 Safari/537.36',
    'cookie' : '你的cookie'
}

class Producer(threading.Thread):
    def __init__(self, page_queue, img_queue, *args, **kwargs):
        super(Producer, self).__init__(*args, **kwargs)
        self.page_queue = page_queue
        self.img_queue = img_queue

def run(self):
        while True:
            if self.page_queue.empty():
                break
            # 休息几秒钟
            time.sleep(random.randint(1, 3))
            url = self.page_queue.get()
            self.parse_page(url)

def parse_page(self, url):
        response = requests.get(url, headers=headers)
        text = response.text
        html = etree.HTML(text)
        imgs = html.xpath("//div[@class='random_picture']//a//img")
        for img in imgs:
            # 过滤动图
            if img.get('class') == 'gif':
                continue

# 获取图片url
            img_url = img.xpath(".//@data-backup")[0]
            if img_url.split('.')[-1] == 'gif':
                continue

# 获取图片后缀
            suffix = os.path.splitext(img_url)[1]

# 获取图片名称
            alt = img.xpath(".//@alt")[0]
            
            img_name = alt + suffix
            self.img_queue.put((img_url, img_name))

class Consumer(threading.Thread):
    def __init__(self, page_queue, img_queue, *args, **kwargs):
        super(Consumer, self).__init__(*args, **kwargs)
        self.page_queue = page_queue
        self.img_queue = img_queue

def run(self):
        while True:
            if self.img_queue.empty() and self.page_queue.empty():
                return

img = self.img_queue.get(block=True)
            url, filename = img
            with open("./images/"+filename, 'wb') as f:
                f.write(requests.get(url, timeout=30, headers=headers).content)
                f.close()
                print(filename + ' 下载完成!')

def main():
    # url队列
    page_queue = Queue(15)
    img_queue = Queue(20)
    page_queue.put('https://www.doutula.com/photo/list/')
    for x in range(2, 6):
        url = "https://www.doutula.com/photo/list/?page={}" .format(str(x))
        page_queue.put(url)

for x in range(6):
        t = Producer(page_queue, img_queue)
        t.start()

for x in range(6):
        t = Consumer(page_queue, img_queue)
        t.start()

if __name__ == '__main__':
    main()

我们的代码中使用了生产者消费者模式,各自使用了队列来实现。生产者不断从页面中获取图片链接,而消费者不断地下载这些获取到的图片到本地保存。

我这里为了方便,只爬取了5页的图片。运行代码(请将 cookie 改为你自己浏览器的 cookie),就会在代码同级目录下的 images 目录下生成图片了。生成完成后的目录是这样的:

结果文件夹

准备战斗

获取到弹药之后,我的小伙伴还没等到5秒钟,就开始战斗了:

聊天

有了这个程序之后,小伙伴再也不担心图穷了,想要弹药随时爬取。

总结

本文主要使用 python 来爬取“斗图啦”网站的最新表情,希望后浪们在获取源源不断的表情,与小伙伴斗得不亦乐乎的同时,不要忘记了掌握 python 的爬虫知识以及生产者消费者的设计模式。

(0)

相关推荐

  • Python爬取网易云音乐辑的图片、专辑名和专辑出版时间

    本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理. 作者:阿里波特 来源:CSDN Python爬虫.数据分析.网站开发等案例教程视频免费在线观看 h ...

  • python测试开发django-49.allow_tags和mark_safe

    前言 前面一篇使用allow_tags方法可以在xadmin的后台页面中插入html代码,在2.x版本ModelAdmin里面删除了allow_tags属性的支持,使用mark_safe函数代替 al ...

  • python 企业微信告警

    目标: 为了实现服务器性能监控指标告警,通过alertmanager触发告警后发送到webhook,然后通过python脚本实现数据清洗,并把告警内容发送给指定的企业微信用户. 由于频繁获取企业微信a ...

  • 特稿:如何在濮阳优雅的当一名“后浪”青年

    今天是五四青年节,这是一个令人热血沸腾的节日.从昨天开始,B站的一个短片刷屏了.从今以后,90后.00后们又多了一个幽默而不失庄重的头衔:后浪. 有人说一个国家最好看的风景,是这个国家的年轻人.其实城 ...

  • 40年 青年艺术“后浪”如何突围?

    几天前,艺术家阿布在艺术头条直播中多次谈及了她对当下年轻艺术家的建议: 艺术家的艺术必须来自你的灵感. 艺术是就像呼吸一样,如果你不呼吸你就会死亡,如果你不创作你就会死亡. 艺术家必须真正地去洞察,去 ...

  • (两会青年说)后浪们!听董明珠为你选择职业做规划

    年轻人如何选择就业"东家"?人才发展路径应该是怎样的?我们一起来看环球资讯广播对全国人大代表.珠海格力电器股份有限公司董事长兼总裁董明珠的专访. 金句1:薪酬要考虑,年轻人也需关注 ...

  • 《后浪》:致敬五四,致敬青年!

    又是一年五四青年节,向历史致敬,向时代致敬,向青年人致敬.为此B站联合几大主流媒体向新一代的青年发出了最诚挚的赞美.最满怀希望的期冀. 这段名为<后浪>的小视频,从昨天到现在我前前后后看了 ...

  • 40年青年艺术“后浪”如何突围

    艺术家的艺术必须来自你的灵感.艺术是就像呼吸一样,如果你不呼吸你就会死亡,如果你不创作你就会死亡.艺术家必须真正地去洞察,去找到一些超越性的东西,拥有更广阔的前景而不是仅仅作为对每天新闻的反应.如果你 ...

  • 你说《后浪》忽略了小镇青年,但你当年嘲笑快手的样子,仍历历在目

    我的朋友圈被<后浪>刷屏了. 前浪站在时代的前头,用充满鼓励.羡慕的眼神看着我们这帮后浪,满腔热血的大吼着:奔涌吧,后浪,我们在同一条奔涌的河流. 后浪们热泪盈眶,感谢前浪们的殷切希望和炙 ...

  • 一些思考:当下的中国青年,和B站的“后浪”不同

    "后浪"一词突然在五四青年节火了. "那些抱怨一代不如一代的人,应该看看,一个国家最好看的风景,就是这个国家的年轻人.你们有幸遇见这样的时代,时代更有幸遇见这样的你们.& ...

  • 得青年者得天下,探岳X和领克05谁能满足年轻后浪们的冒险精神?

    因懂你,更知你.领克05为年轻而来. 前方1910字符   需5分钟共享 随着Z世代登上汽车消费市场主舞台,"得青年者得天下"成为共识,众车企也纷纷铺开年轻化战略新画卷.为迎合这一 ...

  • 【远方】青年《尽情奔涌吧,后浪》作者:一两棉花 主播:黑珍珠

    作者:一两棉花 主播:黑珍珠 编辑:木子迦勒 尽情奔涌吧,后浪 文/一两棉花 JIN RI QIU FEN 2020年5月4日,为致敬五四青年节,bilibili发布一段"献给新一代的演讲& ...