【玩转Python系列【小白必看】Python多线程爬虫:下载表情包网站的图片

news/2024/5/15 20:35:53

文章目录

  • 前言
    • 1. 导入模块和库
    • 2. 定义函数 `download_image(url, filepath)`
    • 3. 定义函数 `get_page()`
    • 4. 主程序入口
  • 完整代码
    • 运行效果
  • 结束语

在这里插入图片描述

前言

本文主要介绍了使用Python编写的多线程爬虫程序,用于下载表情包网站上的图片。通过解析网页内容和使用XPath定位,可以获取到图片的URL,并将其保存到本地。

1. 导入模块和库

在这里插入图片描述

import requests
from lxml import etree
from threading import Thread
from queue import Queue
import ssl
ssl._create_default_https_context = ssl._create_unverified_context
  1. import requests:导入requests库,它是一个用于发送HTTP请求的流行库,可以方便地进行网络通信。
  2. from lxml import etree:从lxml库中导入etree模块,它用于处理XML数据,提供了一种灵活且高效的方式来解析和操作XML文档。
  3. from threading import Thread:从threading库中导入Thread类,它用于创建并管理线程,可以实现多任务并发执行。
  4. from queue import Queue:从queue库中导入Queue类,它是Python内置的线程安全的队列,用于在多线程环境下进行安全的数据交换。
  5. import ssl:导入ssl库,它提供了用于操作SSL/TLS协议的函数,用于创建和配置安全套接字。
  6. ssl._create_default_https_context = ssl._create_unverified_context:设置SSL上下文,将验证关闭,以允许使用不受信任的证书。

2. 定义函数 download_image(url, filepath)

在这里插入图片描述

def download_image(url, filepath):headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36'}resp = requests.get(url, headers=headers)with open(filepath, 'wb') as f:f.write(resp.content)
  1. headers定义了一个字典变量,其中包含了User-Agent头信息。User-Agent头部告诉服务器发送请求的客户端程序的类型和版本号。这里使用常见的浏览器User-Agent信息,以模拟浏览器行为。

  2. resp = requests.get(url, headers=headers)发送GET请求到指定的URL,并传入了上面定义的headers。requests.get()返回一个Response对象,该对象包含服务器响应的内容和其他相关信息。

  3. with open(filepath, 'wb') as f:打开指定的文件路径,使用二进制模式写入文件。'wb'表示以二进制写入模式打开文件。

  4. f.write(resp.content)将从服务器响应中获得的原始二进制数据写入文件。resp.content获取响应的内容,其中包含了图像的二进制数据。

3. 定义函数 get_page()

在这里插入图片描述

def get_page():while not q.empty():url = q.get()resp = requests.get(url)e = etree.HTML(resp.text)src_list = e.xpath('//div[@class="tagbqppdiv"]/a/img/@data-original')name_list = e.xpath('//div[@class="tagbqppdiv"]/a/img/@title')for src, name in zip(src_list, name_list):end = src.split('.')[-1]new_name = f'doutu/{name}.{end}'.replace('?', '')print(f'正在下载{new_name}')download_image(src, new_name)
  1. while not q.empty(): 循环直到队列q为空。
  2. url = q.get() 从队列q中取出一个元素,赋值给变量url
  3. resp = requests.get(url) 发送GET请求到指定的url,并返回Response对象,赋值给变量resp
  4. e = etree.HTML(resp.text) 使用etree.HTML()将获取到的响应文本转换成可进行XPath查询的ElementTree对象,赋值给变量e
  5. src_list = e.xpath('//div[@class="tagbqppdiv"]/a/img/@data-original') 使用XPath定位找到所有<div class="tagbqppdiv"><a><img>标签的data-original属性值,保存在列表src_list中。
  6. name_list = e.xpath('//div[@class="tagbqppdiv"]/a/img/@title') 使用XPath定位找到所有<div class="tagbqppdiv"><a><img>标签的title属性值,保存在列表name_list中。
  7. for src, name in zip(src_list, name_list): 遍历src_listname_list中的元素,依次赋值给变量srcname
  8. end = src.split('.')[-1]src按照.进行分割,取最后一个元素作为文件扩展名,赋值给end变量。
  9. new_name = f'doutu/{name}.{end}'.replace('?', '') 根据获取到的文件名、扩展名以及固定的目录路径,拼接成新的文件路径字符串。并且移除文件名中的问号字符(如果有的话)。
  10. print(f'正在下载{new_name}') 打印提示信息,显示当前正在下载的文件名。
  11. download_image(src, new_name) 调用download_image函数,下载并保存图片。

4. 主程序入口

在这里插入图片描述

if __name__ == "__main__":q = Queue()for i in range(1, 10):q.put(f'https://www.fabiaoqing.com/biaoqing/lists/page/{i}.html')for j in range(3):t = Thread(target=get_page)t.start()
  1. q = Queue() 创建一个队列对象,用于存储要下载的网页URL。
  2. 使用for循环将从1到9的数字作为参数拼接成网页URL,并将URL放入队列q中。
  3. for j in range(3): 使用for循环创建3个线程。
  4. t = Thread(target=get_page) 创建一个线程,目标函数是get_page函数。
  5. t.start() 启动线程,开始执行get_page函数。

完整代码

import requests  # 导入requests库,用于发送HTTP请求
from lxml import etree  # 导入lxml库中的etree模块,用于处理和解析XML数据
from threading import Thread  # 导入threading库中的Thread类,用于创建线程
from queue import Queue  # 导入queue库中的Queue类,用于创建线程安全的队列
import ssl  # 导入ssl库,用于创建和配置安全套接字
ssl._create_default_https_context = ssl._create_unverified_context  # 设置SSL上下文,允许使用不受信任的证书def download_image(url, filepath):headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36'}  # 定义请求头部信息,模拟浏览器访问resp = requests.get(url, headers=headers)  # 发送GET请求到指定的URL,并传入请求头部信息with open(filepath, 'wb') as f:  # 使用二进制写入模式打开指定文件路径f.write(resp.content)  # 将响应内容的二进制数据写入文件def get_page():while not q.empty():  # 当队列q不为空时循环执行以下操作url = q.get()  # 从队列q中获取一个元素,赋值给变量urlresp = requests.get(url)  # 发送GET请求到指定的URLe = etree.HTML(resp.text)  # 将响应内容解析为可进行XPath查询的ElementTree对象,赋值给变量esrc_list = e.xpath('//div[@class="tagbqppdiv"]/a/img/@data-original')  # 使用XPath定位找到所有满足条件的img标签的data-original属性值,返回一个列表name_list = e.xpath('//div[@class="tagbqppdiv"]/a/img/@title')  # 使用XPath定位找到所有满足条件的img标签的title属性值,返回一个列表for src, name in zip(src_list, name_list):  # 使用zip函数将src_list和name_list中的元素逐个配对end = src.split('.')[-1]  # 将src按照'.'进行分割,并取最后一个元素作为文件扩展名,赋值给变量endnew_name = f'doutu/{name}.{end}'.replace('?', '')  # 根据获取到的文件名、扩展名以及固定的目录路径,拼接成新的文件路径字符串,并移除文件名中的问号字符(如果有的话)print(f'正在下载{new_name}')  # 打印提示信息,显示当前正在下载的文件名download_image(src, new_name)  # 调用download_image函数,下载并保存图片if __name__ == "__main__":q = Queue()  # 创建一个线程安全的队列对象for i in range(1, 10):q.put(f'https://www.fabiaoqing.com/biaoqing/lists/page/{i}.html')  # 将拼接好的URL放入队列q中,用于存储要下载的网页URLfor j in range(3):  # 循环3次t = Thread(target=get_page)  # 创建一个线程,目标函数是get_page函数t.start()  # 启动线程,开始执行get_page函数

运行效果

在这里插入图片描述

结束语

多线程爬虫是一种高效的爬取网页内容的方式,在对大量图片进行下载时尤为有效。本文提供了一个简单的实例,展示了如何使用Python的requests、lxml和threading库编写多线程爬虫程序。
通过前言和代码实例,读者可以学习到如何导入必要的模块和库、定义下载图片函数、创建线程以及使用队列进行任务分配。
希望本文能够对读者理解和使用多线程爬虫程序提供一些帮助。


http://www.mrgr.cn/p/17742828

相关文章

python爬虫基础

文章目录 前言爬虫简介urllib库的使用如何获取网页的源码一个类型六个方法一个类型六个方法1、read()方法2、readline()方法3、readlines()方法4、getcode()5、geturl()6、getheaders() urllib下载下载网页下载图片下载视频 请求对象的定制 未完待续 前言 爬虫爬的好牢饭吃的早…

关于K8s的Pod的详解(一)

关于K8s的Pod的详解&#xff08;一&#xff09; Pod和API server的通信加快Pod启动更改Pod的资源Pod 的持久卷的单个访问模式Pod 拓扑分布约束Pod 拓扑分布中的最小域数 Pod 作为k8s创建&#xff0c;调度&#xff0c;管理的基本单位。由上级的Controller对Node上安装的Kubelet发…

云安全攻防(二)之 云原生安全

云原生安全 什么是云原生安全&#xff1f;云原生安全包含两层含义&#xff1a;面向云原生环境的安全和具有云原生特征的安全 面向云原生环境的安全 面向云原生环境的安全的目标是防护云原生环境中的基础设施、编排系统和微服务系统的安全。这类安全机制不一定会具有云原生的…

基于SaaS模式的Java基层卫生健康云HIS系统源码【运维管理+运营管理+综合监管】

云HIS综合管理平台 一、模板管理 模板分为两种&#xff1a;病历模板和报表模板。模板管理是运营管理的核心组成部分&#xff0c;是基层卫生健康云中各医疗机构定制电子病历和报表的地方&#xff0c;各医疗机构可根据自身特点特色定制电子病历和报表&#xff0c;制作的电子病历…

Web-1-网站工作流程介绍

我们学习web开发&#xff0c;首先要知道什么是Web&#xff1f; Web: 全球广域网&#xff0c;也称为万维网(www World Wide Web)&#xff0c;能够通过浏览器访问的网站 比如我展示的这京东&#xff0c;淘宝唯品会都叫做网站&#xff0c;那么现在大家想一下&#xff0c;你还知道什…

论文笔记:Adjusting for Autocorrelated Errors in Neural Networks for Time Series

2021 NIPS 原来的时间序列预测任务是根据预测论文提出用一阶自回归误差预测 一阶差分&#xff0c;类似于ResNet的残差思路&#xff1f;记为pred&#xff0c;最终的预测结果

解决PicGo上传图片失败错误信息和上传图片失败包404错误以及Typora怎么一键导入本地图片到PicGo

&#x1f600;前言 解决PicGo上传图片失败错误信息和上传图片失败包404错误以及Typora怎么一键导入本地图片到PicGo &#x1f3e0;个人主页&#xff1a;尘觉主页 &#x1f9d1;个人简介&#xff1a;大家好&#xff0c;我是尘觉&#xff0c;希望我的文章可以帮助到大家&#x…

beego通过gorm访问mysql数据库

一、下载golang 二、解压下载包到C盘 三、配置golang系统环境变量 四、进入新建的工作目录C:\project下载并安装beego 五、将新生成的bee.exe所在的路径c:\project\bin加入到系统变量path里面 六、下载并安装mysql 例如在上图中&#xff0c; 选“No thanks,just start my down…

【unity之IMGUI实践】单例模式管理数据存储【二】

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 秩沅 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a;uni…

自动化运维工具—Ansible概述

Ansible是什么&#xff1f; Ansible是一个基于Python开发的配置管理和应用部署工具&#xff0c;现在也在自动化管理领域大放异彩。它融合了众多老牌运维工具的优点&#xff0c;Pubbet和Saltstack能实现的功能&#xff0c;Ansible基本上都可以实现。 Ansible能批量配置、部署、…

无涯教程-jQuery - Dropable移动函数

Drop-able 功能可与JqueryUI中的交互一起使用。此功能可在任何DOM元素上启用可放置功能。 Drop able - 语法 $( "#droppable" ).droppable(); Drop able - 示例 以下是一个简单的示例&#xff0c;显示了drop-able的用法- <html><head><title>…

爬虫小白-如何调试列表页链接与详情链接不一样并三种方式js逆向解决AES-ECB

目录 一、网站分析二、定位监听三、熟悉AES-ECB四、调试分析五、node运行js六、Python执行js 一、网站分析 三年前的案例&#xff0c;我的原始文章网站 &#xff0c;如图我们直接点击标题进入到详情页&#xff0c;链接会发生跳转&#xff0c;且与我们在详情看到的链接&#xf…

左神算法之中级提升班(8)

目录 【案例1】 【题目描述】 【思路解析】 【代码实现】 【案例2】 【题目描述】 【思路解析】 【代码实现】 【案例3】 【题目描述】 【思路解析】 【案例4】 【题目描述】 【思路解析】 【代码实现】 【案例5】 【题目描述】 【子序列概念】 【思路解析1 经典…

[NLP]LLaMA与LLamMA2解读

摘要 Meta最近提出了LLaMA(开放和高效的基础语言模型)模型参数包括从7B到65B等多个版本。最值得注意的是&#xff0c;LLaMA-13B的性能优于GPT-3&#xff0c;而体积却小了10倍以上&#xff0c;LLaMA-65B与Chinchilla-70B和PaLM-540B具有竞争性。 一、引言 一般而言&#xff0…

020 - STM32学习笔记 - Fatfs文件系统(二) - 移植与测试

020 - STM32学习笔记 - Fatfs文件系统&#xff08;二&#xff09; - 移植与测试 上节学习了FatFs文件系统的相关知识&#xff0c;这节内容继续学习在STM32上如何移植FatFs文件系统&#xff0c;并且实现文件的创建、读、写与删除等功能。各位看官觉得还行的话点点赞&#xff0c…

Python时间处理:探索time模块

日常工作中&#xff0c;经常涉及到一些时间的转换操作&#xff0c;比如某些业务针对时间的操作要转成不同的时区&#xff0c;有的要转换格式入库&#xff0c;有的需要跟时间对比等等&#xff0c;接下来我们一起来看一下python里面是怎么去处理时间的。 time模块简单介绍 Python…

几百本常用计算机开发语言电子书链接

GitHub - XiangLinPro/IT_book: 本项目收藏这些年来看过或者听过的一些不错的常用的上千本书籍&#xff0c;没准你想找的书就在这里呢&#xff0c;包含了互联网行业大多数书籍和面试经验题目等等。有人工智能系列&#xff08;常用深度学习框架TensorFlow、pytorch、keras。NLP、…

[STL]详解list模拟实现

[STL]list模拟实现 文章目录 [STL]list模拟实现1. 整体结构总览2. 成员变量解析3. 默认成员函数构造函数1迭代器区间构造函数拷贝构造函数赋值运算符重载析构函数 4. 迭代器及相关函数迭代器整体结构总览迭代器的模拟实现begin函数和end函数begin函数和end函数const版本 5. 数据…

心法利器[93] | 谈校招:技术面

心法利器 本栏目主要和大家一起讨论近期自己学习的心得和体会&#xff0c;与大家一起成长。具体介绍&#xff1a;仓颉专项&#xff1a;飞机大炮我都会&#xff0c;利器心法我还有。 2022年新一版的文章合集已经发布&#xff0c;累计已经60w字了&#xff0c;获取方式看这里&…