当前位置: 首页 > news >正文

Python爬虫:单线程、多线程、多进程

在这里插入图片描述

前言

在使用爬虫爬取数据的时候,当需要爬取的数据量比较大,且急需很快获取到数据的时候,可以考虑将单线程的爬虫写成多线程的爬虫。下面来学习一些它的基础知识和代码编写方法。

一、进程和线程

进程可以理解为是正在运行的程序的实例。进程是拥有资源的独立单位,而线程不是独立的单位。由于每一次调度进程的开销比较大,为此才引入的线程。一个进程可以拥有多个线程,一个进程中可以同时存在多个线程,这些线程共享该进程的资源,线程的切换消耗是很小的。因此在操作系统中引入进程的目的是更好地使多道程序并发执行,提高资源利用率和系统吞吐量;而引入线程的目的则是减小程序在并发执行时所付出的时空开销,提高操作系统的并发性能。
下面用简单的例子进行描述,打开本地计算机的”任务管理器”如图1所示,这些正在运行的程序叫作进程。如果将一个进程比喻成一个工作,指定10个人来做这份工作,这10个人就是10个线程。因此,在一定的范围内,多线程效率比单线程效率更高。
在这里插入图片描述
图1.任务管理器

二、Python中的多线程与单线程

在我们平时学习的过程中,使用的主要是单线程爬虫。一般来说,如果爬取的资源不是特别大,使用单线程即可。在Python中,默认情况下是单线程的,简单理解为:代码是按顺序依次运行的,比如先运行第一行代码,再运行第二行,依次类推。在前面章节所学习知识中,都是以单线程的形式实践的。
举个例子,批量下载某网站的图片,由于下载图片是一个耗时的操作,如果依然采用单线程的方式下载,那么效率就会特别低,意味着需要消耗更多的时间等待下载。为了节约时间,这时候我们就可以考虑使用多线程的方式来下载图片。
threading模块是Python中专门用来做多线程编程的模块,它对thread进行了封装,使用更加方便。例如需要对写代码和玩游戏两个事件使用多线程进行,案例代码如下。

import threading
import time
# 定义第一个
def coding():for x in range(3):print('%s正在写代码\n' % x)time.sleep(1)
# 定义第二个
def playing():for x in range(3):print('%s正在玩游戏\n' % x)time.sleep(1)
# 如果使用多线程执行
def multi_thread():start = time.time()#  Thread创建第一个线程,target参数为函数命t1 = threading.Thread(target=coding)t1.start()  # 启动线程# 创建第二个线程t2 = threading.Thread(target=playing)t2.start()# join是确保thread子线程执行完毕后才能执行下一个线程t1.join()t2.join()end = time.time()running_time = end - start  print('总共运行时间 : %.5f 秒' % running_time)
# 执行
if __name__ == '__main__':multi_thread()  # 执行单线程

运行结果如图2所示:
图2.多线程运行结果
图2.多线程运行结果
那么执行单线程会消耗多少时间,案例代码如下所示。

import time
# 定义第一个
def coding():for x in range(3):print('%s正在写代码\n' % x)time.sleep(1)
# 定义第二个
def playing():start = time.time()for x in range(3):print('%s正在玩游戏\n' % x)time.sleep(1)end = time.time()running_time = end - startprint('总共运行时间 : %.5f 秒' % running_time)
def single_thread():coding()playing()
# 执行
if __name__ == '__main__':single_thread()  # 执行单线程

运行结果如图3所示:
在这里插入图片描述
图3.单线程运行结果
经过以上多线程和单线程的运行结果,可以看出多线程中写代码和玩游戏是一起执行的,单线程中则是先写代码再玩游戏。从时间上来说,可能只有细微的差距,当执行工作量很大的时候,便会发现多线程消耗的时间会更少,从这个案例中我们也可以知道,当所需要执行的任务并不多的时候,只需要编写单线程即可。

三、单线程改为多线程

以某直播的图片爬取为例,案例代码如下:

import requests
from lxml import etree
import time
import osdirpath = '图片/'
if not os.path.exists(dirpath):os.mkdir(dirpath)  # 创建文件夹header = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.162 Safari/537.36'
}
def get_photo():url = 'https://www.huya.com/g/4079/'  # 目标网站response = requests.get(url=url, headers=header)  # 发送请求data = etree.HTML(response.text)  # 转化为html格式return datadef jiexi():data = get_photo()image_url = data.xpath('//a//img//@data-original')image_name = data.xpath('//a//img[@class="pic"]//@alt')for ur, name in zip(image_url, image_name):url = ur.replace('?imageview/4/0/w/338/h/190/blur/1', '')title = name + '.jpg'response = requests.get(url=url, headers=header)  # 在此发送新的请求with open(dirpath + title, 'wb') as f:f.write(response.content)print("下载成功" + name)time.sleep(2)if __name__ == '__main__':jiexi()

如果需要修改为多线程爬虫,只需要修改主函数即可,例如创建4个线程进行爬取,案例代码如下所示:

if __name__ == "__main__":threads = []start = time.time()# 创建四个进程for i in range(1, 5):thread = threading.Thread(target=jiexi(), args=(i,))threads.append(thread)thread.start()for thread in threads:thread.join()end = time.time()running_time = end - startprint('总共消耗时间 : %.5f 秒' % running_time)print("全部完成!")  # 主程序

四、图书推荐

在这里插入图片描述

本书介绍了Python3网络爬虫的常见技术。首先介绍了网页的基础知识,然后介绍了urllib、Requests请求库以及XPath、Beautiful Soup等解析库,接着介绍了selenium对动态网站的爬取和Scrapy爬虫框架,最后介绍了Linux基础,便于读者自主部署编写好的爬虫脚本。
本书主要面向对网络爬虫感兴趣的初学者。
在这里插入图片描述

相关文章:

Python爬虫:单线程、多线程、多进程

前言 在使用爬虫爬取数据的时候,当需要爬取的数据量比较大,且急需很快获取到数据的时候,可以考虑将单线程的爬虫写成多线程的爬虫。下面来学习一些它的基础知识和代码编写方法。 一、进程和线程 进程可以理解为是正在运行的程序的实例。进…...

超强的Everything,吊打系统自带文件搜索功能!

目录 一、软件简介 二、软件下载 三、软件说明 一、软件简介 Everything是一款由David OReilly开发的电脑搜索软件,它可以帮助用户快速找到电脑上的文件和文件夹。与其他搜索工具不同的是,Everything使用了一种非常快速和高效的搜索算法&#xff0c…...

flink配置参数

flink-conf.yaml 基础配置 # jobManager 的IP地址jobmanager.rpc.address: localhost# JobManager 的端口号jobmanager.rpc.port: 6123# JobManager JVM heap 内存大小jobmanager.heap.size: 1024m# TaskManager JVM heap 内存大小taskmanager.heap.size: 1024m# 每个 TaskMan…...

学习Vue:安装Vue.js和设置开发环境

当您决定进入现代前端开发的世界,Vue.js 无疑是一个令人激动的选择。它以其简洁、灵活和高效的特点在开发者社区中备受赞誉。本文将为您详细介绍如何安装 Vue.js 并设置开发环境,让您能够迅速开始编写 Vue 应用程序。 步骤1:安装 Node.js 和 …...

代理技术在网络安全、爬虫和数据隐私中的多重应用

1. Socks5代理:灵活的数据中转 Socks5代理协议在网络通信中起着关键作用。与其他代理技术不同,Socks5代理不仅支持TCP连接,还能够处理UDP流量,使其在需要实时数据传输的场景中表现尤为出色。通过将请求和响应中转到代理服务器&am…...

Python 3 使用Hadoop 3之MapReduce总结

MapReduce 运行原理 MapReduce简介 MapReduce是一种分布式计算模型,由Google提出,主要用于搜索领域,解决海量数据的计算问题。 MapReduce分成两个部分:Map(映射)和Reduce(归纳)。…...

KU Leuven TU Berlin 推出“RobBERT”,一款荷兰索塔 BERT

荷兰语是大约24万人的第一语言,也是近5万人的第二语言,是继英语和德语之后第三大日耳曼语言。来自比利时鲁汶大学和柏林工业大学的一组研究人员最近推出了基于荷兰RoBERTa的语言模型RobBERT。 谷歌的BERT(来自Transformers的B idirectional …...

Postern中配置和使用Socks5代理指南

在Postern中配置和使用Socks5代理,可以为你的爬虫项目提供更灵活、更可靠的网络连接。本文将向你分享如何在Postern中配置和使用Socks5代理的方法,解决可能遇到的问题 配置和使用Socks5代理的步骤: 1.了解Socks代理:了解Socks5代…...

android 窗口级模糊实现方式

在Android上实现窗口级模糊效果有多种方法,下面列出了其中两种常用的实现方式: RenderScript模糊效果: 使用ScriptIntrinsicBlur类在RenderScript中实现模糊效果。创建一个RenderScript实例并将要模糊的图像传递给它。创建一个ScriptIntrinsi…...

面试热题(数组中的第K个最大元素)

给定整数数组 nums 和整数 k,请返回数组中第 k 个最大的元素。 请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。 输入: [3,2,1,5,6,4] 和 k 2 输出: 5提到数组中最大元素,我们往往想到就是先给数组…...

HTTP2协议介绍

前言 HTTP是现代互联网通信的基础协议之一,早在1991年,HTTP/0.9版本就诞生了,之后又陆续发布了HTTP/1.0和HTTP/1.1,为互联网应用提供了更高效和可靠的通信方式。 随着时间的推移,互联网的规模和复杂性不断扩大&#x…...

矩阵的转置

题目: 给你一个二维整数数组 matrix, 返回 matrix 的 转置矩阵 。 示例 1: 输入:matrix [[1,2,3],[4,5,6],[7,8,9]] 输出:[[1,4,7],[2,5,8],[3,6,9]]class Solution(object):def transpose(self, matrix):"&q…...

web集群学习:nginx+keepalived实现负载均衡高可用性

目录 项目架构 一,环境介绍 二,项目部署 在Web服务器上配置Web测试页面 nginx负载均衡配置 配置Nginx_Master 通过vrrp_script实现对集群资源的监控(1>通过killall命令探测服务运行状态) 通过vrrp_script实现对集群资源…...

MFC第二十九天 CView类的分支(以及其派生类的功能)、MFC六大关键技术

文章目录 CView类的分支CEditViewCHtmlViewMainFrm.h CMainFrame 类的接口CMainView .h CListCtrl与CListView的创建原理 CTreeViewCTreeCtrl类简介CTreeCtrl类的原理以及常用功能 MFC六大关键技术视图和带分割栏的框架开发与消息路由CLeftView.cppCRightView.hCRightView.cppC…...

SpringBoot复习:(37)自定义ErrorController

所有接口统一返回的数据格式 package cn.edu.tju.domain;public class MyResponse {private int code;private String message;private String exception;private String stack;public int getCode() {return code;}public void setCode(int code) {this.code code;}public S…...

Linux学习之防火墙概述

防火墙分类: 软件防火墙:常用于数据包的过滤,比如限制某些ip或者端口,进行某些数据的转发或者传送 硬件防火墙:防御地域攻击 软件防火墙的分类: 包过滤防火墙:控制比较宽泛,防御效果…...

JS_围绕圆形滑动

需求&#xff1a;滑动手势最大不能超过一个半径为50的圆形&#xff0c;超出围绕圆形边线滑动 这里只提供一个思路&#xff0c;下面代码可以运行&#xff0c;但是要使用需要改成自己的参数 <div style"width: 100%;height: 100vh;display: flex;justify-content: cente…...

Ubuntu上安装RabbitMQ

在Ubuntu上安装RabbitMQ并设置管理员用户为"admin"&#xff0c;密码为"123456"&#xff0c;并开启开机自启 更新系统软件包列表。在终端中执行以下命令&#xff1a; sudo apt update安装RabbitMQ服务器软件包。运行以下命令&#xff1a; sudo apt insta…...

统计学和机器学习之间的联系和区别

一、说明 老实说&#xff0c;我厌倦了几乎每天都在社交媒体和我的大学里听到这场辩论。通常&#xff0c;这伴随着一些模糊的陈述来解释这个问题。双方都为此感到内疚。我希望在本文结束时&#xff0c;您将对这些有些模糊的术语有更明智的立场。 二、论点 与普遍的看法相反&…...

linux中profile.d和profile的区别

profile.d在profile中加载 profile文件 PATH"/bin:/sbin:/usr/bin:/usr/sbin:/opt/bin:/opt/scripts:/soc/bin:/soc/scripts" LD_LIBRARY_PATH"/usr/local/lib:/usr/lib:/opt/lib:/soc/lib" export SSL_LDPATH/usr/local/lib/ export ZLIB_LDPATH/usr/lo…...

OpenVAS实战:如何用自定义扫描配置揪出隐藏漏洞(GVM高级技巧)

OpenVAS实战&#xff1a;如何用自定义扫描配置揪出隐藏漏洞&#xff08;GVM高级技巧&#xff09; 在网络安全领域&#xff0c;漏洞扫描工具的价值不仅在于发现已知问题&#xff0c;更在于如何通过精细配置挖掘那些容易被忽略的安全隐患。OpenVAS作为开源的漏洞评估系统&#xf…...

实测GLM-TTS:方言克隆效果惊艳,情感表达自然流畅

实测GLM-TTS&#xff1a;方言克隆效果惊艳&#xff0c;情感表达自然流畅 1. 语音克隆技术的新突破 近年来&#xff0c;语音合成技术取得了显著进展&#xff0c;但传统方案在方言支持和情感表达方面仍存在明显短板。GLM-TTS作为智谱AI开源的文本转语音模型&#xff0c;通过创新…...

5个OpenClaw实用技巧:千问3.5-9B高效使用秘籍

5个OpenClaw实用技巧&#xff1a;千问3.5-9B高效使用秘籍 1. 为什么需要优化OpenClaw与千问3.5-9B的配合效率 第一次用OpenClaw对接千问3.5-9B模型时&#xff0c;我遇到了典型的"高成本低效率"问题。一个简单的文件整理任务&#xff0c;模型反复询问操作细节&#…...

瀚高数据库安全版v4.5.9在Docker里跑起来后,别忘了做这7件小事

瀚高数据库安全版容器化部署后的7个关键运维动作 当你成功在Docker中运行瀚高数据库安全版v4.5.9后&#xff0c;真正的挑战才刚刚开始。许多开发者误以为容器启动就意味着工作结束&#xff0c;实际上&#xff0c;这只是数据库生命周期管理的起点。本文将带你深入探索那些容易被…...

Windows Server 2025 Hyper-V GPU虚拟化实战:从分区到实时迁移

1. Windows Server 2025 Hyper-V GPU虚拟化核心升级 如果你还在用传统方式给虚拟机独占分配GPU资源&#xff0c;那真的out了。Windows Server 2025带来的Hyper-V GPU虚拟化技术彻底改变了游戏规则。我最近在实验室环境实测发现&#xff0c;新版本通过**GPU分区&#xff08;GPU-…...

别再死磕理论书了!给工程新人的ANSYS Fluent CFD仿真保姆级入门路线图

工程实战派&#xff1a;ANSYS Fluent高效入门的三维突破法 刚接手第一个仿真项目时&#xff0c;我对着满屏的流体方程和复杂的软件界面手足无措。直到导师扔来一个简单的管道流动案例&#xff1a;"先别管那些公式&#xff0c;把这个压降曲线跑出来再说。"三小时后&am…...

埃因霍温理工大学:冷冻编码器也能完美分割图像?

这项由埃因霍温理工大学领导的研究发表于2026年3月的arXiv预印本论文库&#xff0c;论文编号为arXiv:2603.25398v1。对于想要深入了解这项技术突破的读者&#xff0c;可以通过该编号查询到完整的技术论文。当前的人工智能就像一位技艺高超的多面手&#xff0c;能够处理各种复杂…...

GrafikLogger:Arduino嵌入式数据可视化轻量日志绘图框架

1. GrafikLogger 库概述&#xff1a;面向嵌入式数据可视化的一体化日志与绘图框架GrafikLogger 是一个专为 Arduino 平台设计的轻量级、协议驱动型数据采集与可视化中间件。它并非传统意义上的纯本地日志库&#xff0c;而是一个端-云协同架构中的关键嵌入式代理组件——其核心价…...

【2026年最新600套毕设项目分享】springboot旅游出行指南系统(14321)

有需要的同学&#xff0c;源代码和配套文档领取&#xff0c;加文章最下方的名片哦 一、项目演示 项目演示视频 二、资料介绍 完整源代码&#xff08;前后端源代码SQL脚本&#xff09;配套文档&#xff08;LWPPT开题报告/任务书&#xff09;远程调试控屏包运行一键启动项目&…...

现代化前端架构设计的10个黄金原则:从Este项目学习最佳实践

现代化前端架构设计的10个黄金原则&#xff1a;从Este项目学习最佳实践 【免费下载链接】este This repo is suspended. 项目地址: https://gitcode.com/gh_mirrors/es/este 在当今快速发展的前端开发领域&#xff0c;构建可维护、可扩展且高效的应用程序架构至关重要。…...