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

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

时间:2023-10-18 16:04:46浏览次数:52  
标签:src name get Python list url 小白必 import 多线程

在这里插入图片描述

前言

本文主要介绍了使用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中获取一个元素,赋值给变量url
        resp = requests.get(url)  # 发送GET请求到指定的URL
        e = etree.HTML(resp.text)  # 将响应内容解析为可进行XPath查询的ElementTree对象,赋值给变量e
        src_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按照'.'进行分割,并取最后一个元素作为文件扩展名,赋值给变量end
            new_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中,用于存储要下载的网页URL

    for j in range(3):  # 循环3次
        t = Thread(target=get_page)  # 创建一个线程,目标函数是get_page函数
        t.start()  # 启动线程,开始执行get_page函数

结束语

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

标签:src,name,get,Python,list,url,小白必,import,多线程
From: https://blog.51cto.com/u_14522592/7918917

相关文章

  • 【python】Python tkinter库实现重量单位转换器的GUI程序
    前言这段代码是一个简单的重量单位转换器的GUI程序,使用了Python的tkinter库来创建图形界面。该程序可以将输入的重量从千克转换为克、磅和盎司,并通过三个文本框分别显示转换后的结果。学到什么?使用tkinter库创建一个GUI窗口。tkinter是Python标准库中的一个模块,用于......
  • 【Python】Python 实现猜单词游戏——挑战你的智力和运气!
    前言大家好!欢迎来到我们精心准备的文字游戏世界。今天,我将向大家介绍一款有趣而又考验智力的游戏——猜单词游戏。在游戏中,你将面临一个神秘的单词,你需要凭借自己的智慧和运气来猜测这个单词是什么。每猜错一次,你将失去一条生命线,当生命线用尽时,你将面临失败。但只要你成功猜对了......
  • 多线程编程同步:读写锁
    读写锁的定义互斥锁锁住后,保证仅有一个线程处理数据(多线程共享的)。要是数据的读取比写入更频繁,且读取操作不涉及共享变量的修改,应允许多个线程读取操作对共享变量的读取。直接使用互斥锁效率太低,若使用读写锁,可以大大提高效率。读写锁的分配规则:1)只要没有线程持有某个特定的读......
  • ERROR: The Python ssl extension was not compiled. Missing the OpenSSL lib?
    CentOS7pyenv安装Python3.10.13报错yuminstall-yopenssl-developenssl11-developenssl11-libCPPFLAGS="-I/usr/include/openssl11"LDFLAGS="-L/usr/lib64/openssl11-lssl-lcrypto"pyenvinstall-v3.10.13[root@Chatglm2-6B~]#pyenvversi......
  • Python Traceback:异常信息定位
    一、traceback模块简介traceback模块是Python标准库中的一个模块,提供了一些函数和类,用于获取和处理异常的跟踪信息。它可以帮助我们定位异常信息所在的代码位置,从而更好地调试和修复程序。 二、获取异常跟踪信息1.traceback.format_exc()函数在异常处理中,我们经常需要获取......
  • [914] In Python's datetime library, you can format dates using the strftime() me
    InPython'sdatetimelibrary,youcanformatdatesusingthestrftime()method.Thismethodallowsyoutocreateaformattedstringrepresentationofadatetimeobject,specifyingtheformatyouwant.Here'showyoucanformatadateusingstrft......
  • dhcpd.leases的Python解析程序
    #!/usr/local/bin/python3importdatetime,bisectdefparse_timestamp(raw_str):tokens=raw_str.split()iflen(tokens)==1:iftokens[0].lower()=='never':return'never';......
  • Python3,3分钟,带你了解PyTorch,原来科学计算库也不是很难嘛。
    1、引言小屌丝:鱼哥,最近忙啥嘞?小鱼:啥也没干。小屌丝:确定没干??小鱼:…这话到你嘴里,咋就变为了。小屌丝:也没有啊,我就是确认下,你干没干。小鱼:…能干啥,你想干啥?小屌丝:我想请教你个问题。小鱼:正儿八经的问题,是不?小屌丝:你就看我今天这身穿的,还能不正经?小鱼:穿新鞋走老路小屌丝:此话咋......
  • Python3, 33行代码搞了一个聊天机器人, 这下再也不怕没人说话了。
    Python制作聊天机器人1、引言2、实战2.1准备2.2介绍2.2.1NLTK2.2.2ChatterBot2.3安装2.4示例2.4.1创建聊天机器人2.4.2与用户交互3、总结1、引言小屌丝:鱼哥,看这段代码fromchatterbotimportChatBot#创建聊天机器人chatbot=ChatBot('MyBot')#加载语料库with......
  • Python3,6行代码,搞定网络测速神器,我直接卸载某60测速器。
    6行代码搞定网络测速器1、引言2、代码实战2.1介绍2.1.1定义2.1.2常用方法2.1.3功能2.2安装2.3示例2.3.1测试上传下载速度2.3.2测试延迟2.3.3自定义服务器测试2.3.4多连接测试2.3.5实战3、总结1、引言小屌丝:鱼哥,你知道speedtest这个库吗?小鱼:嗯,知道一点点,咋了?小屌丝:那......