推荐源哥和川川的新书:《Pyhton网络爬虫从入门到实战》

雨点打透心脏的1/2处 2024-04-24 20:41 77阅读 0赞

❤️作者主页:小虚竹

❤️作者简介:大家好,我是小虚竹。2022年度博客之星评选TOP 10?,Java领域优质创作者?,CSDN博客专家?,华为云享专家?,掘金年度人气作者?,阿里云专家博主?,51CTO专家博主?

❤️技术活,该赏

❤️点赞 ? 收藏 ⭐再看,养成习惯

老规矩,文末有送书的规则~~

文章目录

  • 零:前言
  • 一、进程和线程
  • 二、Python中的多线程与单线程
  • 三、单线程改为多线程
  • 四、图书推荐
  • 五、粉丝福利
    • 福利0
    • 福利1

零:前言

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

一、进程和线程

进程可以理解为是正在运行的程序的实例。进程是拥有资源的独立单位,而线程不是独立的单位。由于每一次调度进程的开销比较大,为此才引入的线程。一个进程可以拥有多个线程,一个进程中可以同时存在多个线程,这些线程共享该进程的资源,线程的切换消耗是很小的。因此在操作系统中引入进程的目的是更好地使多道程序并发执行,提高资源利用率和系统吞吐量;而引入线程的目的则是减小程序在并发执行时所付出的时空开销,提高操作系统的并发性能。

下面用简单的例子进行描述,打开本地计算机的”任务管理器”如图1所示,这些正在运行的程序叫作进程。如果将一个进程比喻成一个工作,指定10个人来做这份工作,这10个人就是10个线程。因此,在一定的范围内,多线程效率比单线程效率更高。

在这里插入图片描述

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

在我们平时学习的过程中,使用的主要是单线程爬虫。一般来说,如果爬取的资源不是特别大,使用单线程即可。在Python中,默认情况下是单线程的,简单理解为:代码是按顺序依次运行的,比如先运行第一行代码,再运行第二行,依次类推。在前面章节所学习知识中,都是以单线程的形式实践的。

举个例子,批量下载某网站的图片,由于下载图片是一个耗时的操作,如果依然采用单线程的方式下载,那么效率就会特别低,意味着需要消耗更多的时间等待下载。为了节约时间,这时候我们就可以考虑使用多线程的方式来下载图片。

threading模块是Python中专门用来做多线程编程的模块,它对thread进行了封装,使用更加方便。例如需要对写代码和玩游戏两个事件使用多线程进行,案例代码如下。

  1. import threading
  2. import time
  3. # 定义第一个
  4. def coding():
  5. for x in range(3):
  6. print('%s正在写代码\n' % x)
  7. time.sleep(1)
  8. # 定义第二个
  9. def playing():
  10. for x in range(3):
  11. print('%s正在玩游戏\n' % x)
  12. time.sleep(1)
  13. # 如果使用多线程执行
  14. def multi_thread():
  15. start = time.time()
  16. # Thread创建第一个线程,target参数为函数命
  17. t1 = threading.Thread(target=coding)
  18. t1.start() # 启动线程
  19. # 创建第二个线程
  20. t2 = threading.Thread(target=playing)
  21. t2.start()
  22. # join是确保thread子线程执行完毕后才能执行下一个线程
  23. t1.join()
  24. t2.join()
  25. end = time.time()
  26. running_time = end - start
  27. print('总共运行时间 : %.5f 秒' % running_time)
  28. # 执行
  29. if __name__ == '__main__':
  30. multi_thread() # 执行单线程

运行结果如图所示。

在这里插入图片描述

那么执行单线程会消耗多少时间,案例代码如下所示。

  1. import time
  2. # 定义第一个
  3. def coding():
  4. for x in range(3):
  5. print('%s正在写代码\n' % x)
  6. time.sleep(1)
  7. # 定义第二个
  8. def playing():
  9. start = time.time()
  10. for x in range(3):
  11. print('%s正在玩游戏\n' % x)
  12. time.sleep(1)
  13. end = time.time()
  14. running_time = end - start
  15. print('总共运行时间 : %.5f 秒' % running_time)
  16. def single_thread():
  17. coding()
  18. playing()
  19. # 执行
  20. if __name__ == '__main__':
  21. single_thread() # 执行单线程

运行结果如图3所示。

在这里插入图片描述

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

三、单线程改为多线程

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

  1. import requests
  2. from lxml import etree
  3. import time
  4. import os
  5. dirpath = '图片/'
  6. if not os.path.exists(dirpath):
  7. os.mkdir(dirpath) # 创建文件夹
  8. header = {
  9. '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'
  10. }
  11. def get_photo():
  12. url = 'https://www.huya.com/g/4079/' # 目标网站
  13. response = requests.get(url=url, headers=header) # 发送请求
  14. data = etree.HTML(response.text) # 转化为html格式
  15. return data
  16. def jiexi():
  17. data = get_photo()
  18. image_url = data.xpath('//a//img//@data-original')
  19. image_name = data.xpath('//a//img[@class="pic"]//@alt')
  20. for ur, name in zip(image_url, image_name):
  21. url = ur.replace('?imageview/4/0/w/338/h/190/blur/1', '')
  22. title = name + '.jpg'
  23. response = requests.get(url=url, headers=header) # 在此发送新的请求
  24. with open(dirpath + title, 'wb') as f:
  25. f.write(response.content)
  26. print("下载成功" + name)
  27. time.sleep(2)
  28. if __name__ == '__main__':
  29. jiexi()

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

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

四、图书推荐

在这里插入图片描述

本书介绍了Python3网络爬虫的常见技术。首先介绍了网页的基础知识,然后介绍了urllib、Requests请求库以及XPath、Beautiful Soup等解析库,接着介绍了selenium对动态网站的爬取和Scrapy爬虫框架,最后介绍了Linux基础,便于读者自主部署编写好的爬虫脚本。

本书主要面向对网络爬虫感兴趣的初学者。

大咖推荐
在这里插入图片描述

作者介绍

在这里插入图片描述

内容结构及配套资源

在这里插入图片描述

五、粉丝福利

回馈粉丝们的支持,送《Pyhton网络爬虫从入门到实战》实体书给3位粉丝。一起学习!

福利0

虚竹哥直接送1本好书,参与好评送书~

参与好评送书:随机抽取1位幸运读者,送一本《Pyhton网络爬虫从入门到实战》实体书

统计截止时间:2023/09/19 19:00:00

请中奖的读者统计截止时间过后7天内私信虚竹哥收货地址,过期奖励作废哈!

福利1

来虚竹哥公众号的同标题文章,参与好评送书~~(新号,参与人不多,中奖概率很高)
公众号 :传送门–》
公众号 :传送门–》
公众号 :传送门–》
参与好评送书:随机抽取2位幸运读者,各送一本《Pyhton网络爬虫从入门到实战》实体书

统计截止时间:2023/09/19 19:00:00
请中奖的读者统计截止时间过后7天内私信虚竹哥收货地址,过期奖励作废哈!

我是宠粉的虚竹哥,请继续支持我,哈哈哈~

发表评论

表情:
评论列表 (有 0 条评论,77人围观)

还没有评论,来说两句吧...

相关阅读

    相关 【云旅游】西之行

    这算是一次说走就走的旅行,没有太多的计划,就大概看了下路线和钱包,考虑跟团还是定制游。一顿对比后,最终还是选择定制游,没人拼车,最终谈下包车6天4500元,从成都出发往西走,最