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("全部完成!")  # 主程序

文末免费送书:Python网络爬虫入门到实战

本书介绍了Python3网络爬虫的常见技术。首先介绍了网页的基础知识,然后介绍了urllib、Requests请求库以及XPath、Beautiful Soup等解析库,接着介绍了selenium对动态网站的爬取和Scrapy爬虫框架,最后介绍了Linux基础,便于读者自主部署编写好的爬虫脚本。本书所有代码和相关素材可以到GitHub下载获取,地址为https://github.com/sfvsfv/Crawer。
本书主要面向对网络爬虫感兴趣的初学者。。
在这里插入图片描述

抽奖方式: 评论区随机抽取3位小伙伴免费送出!
参与方式: 关注博主、点赞、收藏、评论区评论“人生苦短,我用Python!”(切记要点赞+收藏,否则抽奖无效,每个人最多评论三次!)
活动截止时间: 2024-3-04 20:00:00
京东: 购买链接传送门

😄😄😄名单公布方式: 下期活动开始将在评论区和私信一并公布,中奖者请三天内提供信息😄😄😄

本书内容
本书通过简单易懂的案例,讲解Python语言的爬虫技术。全书共分为8章,第1章为网页的内容,第2~7章为爬虫的内容,第8章为Linux基础。
第1章:介绍了HTML和CSS的基础知识,虽然本章并不是直接与爬虫相关,但它是学习爬虫技术的基础。对于已经掌握基本网页基础的读者,可以选择跳过该章。
第2章:正式进入爬虫技术的学习阶段,这一章介绍了最基本的两个请求库(urllib和Requests),有知识点的讲解,也有实战案例的讲解。
第3章:本章对正则表达式做了详细的描述,同时有案例的实践。学完本章就可以掌握最基本的爬虫技术了。
第4章:主要介绍XPath解析库,配有实际的案例进行讲解,以帮助读者加深理解和巩固。
第5章:主要介绍另一个解析库Beautiful Soup,它在提取数据中也很方便,对相关知识点以及实际的案例都有所讲解。XPath和Beautiful Soup可以使信息的提取更加方便、快捷,是爬虫必备利器。
第6章:主要介绍selenium自动化测试。现在越来越多的网站内容是经过 JavaScript 渲染得到的,而原始 HTML 文本可能不包含任何有效内容,使用模块selenium实现模拟浏览器进行数据爬取是非常好的选择。
第7章:在大规模数据的爬取中,不太用得上基础模块,Scrapy 是目前使用最广泛的爬虫框架之一,本章介绍了Scrapy爬虫框架的详细搭建和实践。针对数据存储过程部分使用的MySql数据库,整章有多个实际的案例,以帮助读者加深理解和巩固。
第8章:主要介绍了Linux的基础知识点,以帮助读者能够在服务器部署脚本。
相关资源
本书所有代码和相关素材可以到GitHub下载获取,地址为https://github.com/sfvsfv/Crawer。关于代码的实用性需要声明:所有代码都是笔者在写书阶段编写的,如果有部分爬虫脚本失效,有可能是网站的结构发生了变化。希望读者在阅读本书的过程中,以学习笔者所介绍的方法为主。
Python网络爬虫入门到实战致谢
本书的撰写与出版得益于同行众多同类教程的启发,以及陈姗姗老师和同伴周培源的帮助,在此深表感谢。同时也感谢一路走来支持笔者的读者。由于本人水平有限,书中难免有不妥之处,诚挚期盼专家和广大读者批评指正。

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/2812676.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

SpringMVC 学习(七)之报文信息转换器 HttpMessageConverter

目录 1 HttpMessageConverter 介绍 2 RequestBody 注解 3 ResponseBody 注解 4 RequestEntity 5 ResponseEntity 6 RestController 注解 1 HttpMessageConverter 介绍 HttpMessageConverter 报文信息转换器,将请求报文(如JSON、XML、HTML等&#x…

配置MMDetection的solov2攻略整理

目录 一、MMDetection 特性 常见用法 二、ubuntu20.04配置solov2 三、Windows11配置solov2 一、MMDetection MMDetection是一个用于目标检测的开源框架,由OpenMMLab开发和维护。它提供了丰富的预训练模型和模块,可以用于各种目标检测任务&#xff…

教机械臂搭积木?《多Agent系统引论》第4章 实用推理Agent 小结

4.0 前言 Agent起作用,不仅仅是逻辑推理的一种、一个过程,还有其他过程在起作用。为了建立贴合实际的Agent,我们需要提出一种新的概念的模型。这就是实用推理型Agent。 4.1 推理分两步 这种Agent把推理的过程分为了两步,一步是理…

高纯医用制氧机:医疗领域的重要性与其背后的科技原理

在繁忙的现代医疗环境中,每一个细节都可能关乎生死。高纯医用制氧机,这一看似平常的设备,实则扮演着守护生命的重要角色。那么,它究竟有何魅力,能够在医疗领域占据如此重要的地位?恒业通将为您揭开高纯医用制氧机背后…

写了个动漫搜索引擎小工具

FRE123 - Free Resource for Everyone:老胡信息周刊的衍生项目,核心目的是用技术打破信息差,为每个人提供免费优质资源。 老胡的信息周刊在第三个年头,希望这个系列也能持续更新下去: 网站资源: 01.FRE123|…

VIO第6讲:投影模型与三角化

VIO第6讲:投影模型与三角化 文章目录 VIO第6讲:投影模型与三角化3 三角化3.1 坐标变换与投影模型① 世界系->相机系 X w Y w Z w > > X c Y c Z c X_wY_wZ_w>>X_cY_cZ_c Xw​Yw​Zw​>>Xc​Yc​Zc​② 相机->图像 X c Y c Z c &…

python关于matplotlib的画图工具

#绘制纽约市年均气温 #,months,nyc_temp_2022,months,nyc_temp_2024 from pylab import plot,show #调用画图和显示 nyc_temp_2021 [53.9,56.3,56.4,58.6,57.8,54.9,67.3,56.3,56.7,57.1,67.3,56.3] nyc_temp_2020 [53.9,56.3,56.4,58.6,57.8,54.9,67.3,56.3,56.7,57.1,67.3,56…

jQuery引入及下载方法

jQuery引入及下载方法 目录 jQuery引入及下载方法【方法1】cdn引入【方法2】下载本地文件 【方法1】cdn引入 直接在head引入jq <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Title</title>&…

Go Run - Go 语言中的简洁指令

原文&#xff1a;breadchris - 2024.02.21 也许听起来有些傻&#xff0c;但go run是我最喜欢的 Go 语言特性。想要运行你的代码&#xff1f;只需go run main.go。它是如此简单&#xff0c;我可以告诉母亲这个命令&#xff0c;她会立即理解。就像 Go 语言的大部分功能一样&…

FMM 笔记:st-matching(colab上执行)【官方案例解读】

在colab上运行&#xff0c;所以如何在colab上安装fmm&#xff0c;可见FMM 笔记&#xff1a;在colab上执行FMM-CSDN博客 st-matching见论文笔记&#xff1a;Map-Matching for low-sampling-rate GPS trajectories&#xff08;ST-matching&#xff09;-CSDN博客 0 导入库 from…

K8S部署Java项目(Gitlab CI/CD自动化部署终极版)

天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物。 每个人都有惰性&#xff0c;但不断学习是好好生活的根本&#xff0c;共勉&#xff01; 文章均为学习整理笔记&#xff0c;分享记录为主&#xff0c;如有错误请指正&#xff0c;共同学习进步。…

formality:set_constant应用

我正在「拾陆楼」和朋友们讨论有趣的话题,你⼀起来吧? 拾陆楼知识星球入口 往期文章链接: formality:形式验证流程 scan mode func的功能检查需要把scan mode设置成0。

Block UI——tree(2)编辑树列表

目录 一、概述 二、学习资料 三、学习案例——编辑树列表 3.1 UI界面分析 3.2编辑树列表方法一 3.3编辑树列表方法二 3.4编辑树列表方法二&#xff08;解决以上问题&#xff09; 三、总结 首先要感谢NX二次开发者无私奉献以及默默无闻的帮助和支持&#xff0c;在这里我推…

解决show-overflow-tooltip跨行生效的问题

当内容出现特殊字符&#xff08;空格换行&#xff09;会占据几行的空间后再显示... 解决&#xff1a; 1、自定义组件tooltip.vue <template><div><el-tooltip :disabled"isShowTooltip" class"tooltip" placement"top"><…

Vmware宿主机与虚拟机网络联通配置

Vmware宿主机与虚拟机网络联通配置 1. 查看宿主机配置 2. 网卡是否启动 更改适配器选项&#xff1a; 网卡全部启用 3. 查看虚拟机IP 虚拟机IP需要与宿主机VMnet8保持网段一致&#xff0c;不一致则进行修改

QQ防红跳转短网址生成网站完整源码

使用此源码可以生成QQ自动跳转到浏览器的短链接&#xff0c;无视QQ报毒&#xff0c;任意网址均可生成。 全新界面&#xff0c;网站背景图采用Bing随机壁纸 支持生成多种短链接 兼容电脑和手机页面 生成网址记录功能&#xff0c;域名黑名单功能 网站后台可管理数据 安装说明&am…

Linux 不同架构、不同系统的问题

文章目录 一、麒麟V10&#xff08;kylin&#xff09;操作系统中&#xff0c;sudo执行程序后&#xff0c;其环境变量依然为用户家目录。&#xff08;1&#xff09;背景&#xff08;2&#xff09;原因&#xff08;3&#xff09;解决办法 二、统信&#xff08;UOS&#xff09;操作…

Datawhale-Sora技术原理分享

目录 Sora能力边界探索 Sora模型训练流程 Sora关键技术拆解 物理引擎的数据进行训练 个人思考与总结 参考 https://datawhaler.feishu.cn/file/KntHbV3QGoEPruxEql2c9lrsnOb

Unity Shader - sahder变体剔除

文章目录 吐槽优化方案 - 目前最靠谱的方式shadercsharp 吐槽 我之所以单独写这边文章&#xff0c;是因为之前写的一篇&#xff1a; Unity Shader - Built-in管线下优化变体&#xff0c;编辑后&#xff0c;无法保存&#xff0c;一直提示&#xff1a;操作超时。 等了差不多 3…

BUUCTF crypto做题记录(10)新手向

一、[MRCTF2020]古典密码知多少 这题一看首先能想到猪圈密码&#xff0c;每种颜色都代表一种古典密码。鉴于都是用图形表示&#xff0c;其余两种与猪圈密码类似。BUUCTF-Crypto-猪圈密码及其变种银河密码跳舞的小人_猪圈密码对照表-CSDN博客 在这篇文章中介绍一些与猪圈密码类…