Python实战---使用多线程爬取斗图啦表情包

2023-10-18 17:20

本文主要是介绍Python实战---使用多线程爬取斗图啦表情包,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

使用多线程爬取斗图啦表情包

目标

爬取前一百页的表情包。

话不多说,直接上爬取结果:
在这里插入图片描述
只是作为练习,所以中途就把程序关掉了,可以看出来多线程爬取是真的快。

思路

1、先写出不使用多线程爬取页面的代码
2、使用多线程的生产者和消费者模式来爬取。

实现代码
'''
@Description: 爬取斗图啦的表情包
@Author: sikaozhifu
@Date: 2020-06-11 14:20:53
@LastEditTime: 2020-06-11 15:36:21
@LastEditors: Please set LastEditors
'''
import requests
from lxml import etree
import os
from urllib import request
import re
import threading
from queue import Queueclass Producer(threading.Thread):def __init__(self, page_queue, img_queue, *args, **kwargs):super(Producer, self).__init__(*args, **kwargs)self.page_queue = page_queueself.img_queue = img_queuedef run(self):while True:if self.page_queue.empty():breakurl = self.page_queue.get()self.pares_url(url)def pares_url(self, url):headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36'}response = requests.get(url, headers=headers)text = response.texthtml = etree.HTML(text)imgs = html.xpath('//div[@class = "page-content text-center"]//img[@class != "gif"]')for img in imgs:img_url = img.get('data-original')alt = img.get('alt')# 要用正则表达式去掉win10下不满足命名规则的特殊符号alt = re.sub(r'[\??。\.!!,,\/:\*<>|"]', '', alt)suffix = os.path.splitext(img_url)[1]filename = alt + suffixself.img_queue.put((img_url, filename))class Consumer(threading.Thread):def __init__(self, page_queue, img_queue, *args, **kwargs):super(Consumer, self).__init__(*args, **kwargs)self.page_queue = page_queueself.img_queue = img_queuedef run(self):while True:if self.img_queue.empty() and self.page_queue.empty():breakimg_url, filename = self.img_queue.get()request.urlretrieve(img_url, 'images/'+filename)print(filename + '下载完成!')def main():page_queue = Queue(100)img_queue = Queue(1000)for x in range(1, 101):url = 'https://www.doutula.com/photo/list/?page=%s' % xpage_queue.put(url)for x in range(15):t = Producer(page_queue, img_queue)t.start()for x in range(64):t = Consumer(page_queue, img_queue)t.start()if __name__ == "__main__":main()

也可以在控制台打印爬取的图片名字,简直快到飞起:
在这里插入图片描述

总结

多线程爬取就是舒服哇, i 了 i 了。

这篇关于Python实战---使用多线程爬取斗图啦表情包的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/234055

相关文章

Java function函数式接口的使用方法与实例

《Javafunction函数式接口的使用方法与实例》:本文主要介绍Javafunction函数式接口的使用方法与实例,函数式接口如一支未完成的诗篇,用Lambda表达式作韵脚,将代码的机械美感... 目录引言-当代码遇见诗性一、函数式接口的生物学解构1.1 函数式接口的基因密码1.2 六大核心接口的形态学

Python实现文件下载、Cookie以及重定向的方法代码

《Python实现文件下载、Cookie以及重定向的方法代码》本文主要介绍了如何使用Python的requests模块进行网络请求操作,涵盖了从文件下载、Cookie处理到重定向与历史请求等多个方面,... 目录前言一、下载网络文件(一)基本步骤(二)分段下载大文件(三)常见问题二、requests模块处理

使用DeepSeek API 结合VSCode提升开发效率

《使用DeepSeekAPI结合VSCode提升开发效率》:本文主要介绍DeepSeekAPI与VisualStudioCode(VSCode)结合使用,以提升软件开发效率,具有一定的参考价值... 目录引言准备工作安装必要的 VSCode 扩展配置 DeepSeek API1. 创建 API 请求文件2.

使用TomCat,service输出台出现乱码的解决

《使用TomCat,service输出台出现乱码的解决》本文介绍了解决Tomcat服务输出台中文乱码问题的两种方法,第一种方法是修改`logging.properties`文件中的`prefix`和`... 目录使用TomCat,service输出台出现乱码问题1解决方案问题2解决方案总结使用TomCat,

解决IDEA使用springBoot创建项目,lombok标注实体类后编译无报错,但是运行时报错问题

《解决IDEA使用springBoot创建项目,lombok标注实体类后编译无报错,但是运行时报错问题》文章详细描述了在使用lombok的@Data注解标注实体类时遇到编译无误但运行时报错的问题,分析... 目录问题分析问题解决方案步骤一步骤二步骤三总结问题使用lombok注解@Data标注实体类,编译时

C语言小项目实战之通讯录功能

《C语言小项目实战之通讯录功能》:本文主要介绍如何设计和实现一个简单的通讯录管理系统,包括联系人信息的存储、增加、删除、查找、修改和排序等功能,文中通过代码介绍的非常详细,需要的朋友可以参考下... 目录功能介绍:添加联系人模块显示联系人模块删除联系人模块查找联系人模块修改联系人模块排序联系人模块源代码如下

Java中使用Java Mail实现邮件服务功能示例

《Java中使用JavaMail实现邮件服务功能示例》:本文主要介绍Java中使用JavaMail实现邮件服务功能的相关资料,文章还提供了一个发送邮件的示例代码,包括创建参数类、邮件类和执行结... 目录前言一、历史背景二编程、pom依赖三、API说明(一)Session (会话)(二)Message编程客

C++中使用vector存储并遍历数据的基本步骤

《C++中使用vector存储并遍历数据的基本步骤》C++标准模板库(STL)提供了多种容器类型,包括顺序容器、关联容器、无序关联容器和容器适配器,每种容器都有其特定的用途和特性,:本文主要介绍C... 目录(1)容器及简要描述‌php顺序容器‌‌关联容器‌‌无序关联容器‌(基于哈希表):‌容器适配器‌:(

Python判断for循环最后一次的6种方法

《Python判断for循环最后一次的6种方法》在Python中,通常我们不会直接判断for循环是否正在执行最后一次迭代,因为Python的for循环是基于可迭代对象的,它不知道也不关心迭代的内部状态... 目录1.使用enuhttp://www.chinasem.cnmerate()和len()来判断for

使用Python实现高效的端口扫描器

《使用Python实现高效的端口扫描器》在网络安全领域,端口扫描是一项基本而重要的技能,通过端口扫描,可以发现目标主机上开放的服务和端口,这对于安全评估、渗透测试等有着不可忽视的作用,本文将介绍如何使... 目录1. 端口扫描的基本原理2. 使用python实现端口扫描2.1 安装必要的库2.2 编写端口扫