Python爬虫之线程池的使用方法

  介绍

这篇文章主要介绍了Python爬虫之线程池的使用方法,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获、下面让小编带着大家一起了解一下。

一、前言

学到现在,我们可以说已经学习了爬虫的基础知识,如果没有那些奇奇怪怪的反爬虫机制,基本上只要有时间分析,一般的数据都是可以爬取的,那么到了这个时候我们需要考虑的就是爬取的效率了,关于提高爬虫效率,也就是实现异步爬虫,我们可以考虑以下两种方式:一是线程池的使用(也就是实现单进程下的多线程),一是协程的使用(如果没有记错,我所使用的协程模块是从python3.4以后引入的,我写博客时使用的Python版本是3.9)。

今天我们先来讲讲线程池。

二,同步代码演示

我们先用普通的同步的形式写一段代码

import 时间      def  func (url):   ,,,print(“正在下载:“,,url)   ,,,time . sleep (2)   ,,,print(“下载完成:“,,url)      if  __name__ ==, & # 39; __main__ # 39;:   ,,,start =, time.time(), #,开始时间      ,,,url_list =, (   ,,,,,,,“a",,“b",,“c"   ,,,)      ,,,for  url 拷贝url_list:   ,,,,,,,func (url)      ,,,最终获得=,time.time(), #,结束时间      ,,,print(最终获得成功,开始)

对于代码运行的结果我们心里都有数,但还是让我们来看一下吧

 Python爬虫之线程池的使用方法

不出所料。运行时间果然是六秒

三、异步,线程池代码

那么如果我们使用线程池运行上述代码又会怎样呢?

import 时间   得到multiprocessing  import 池      def  func (url):   ,,,print(“正在下载:“,,url)   ,,,time . sleep (2)   ,,,print(“下载完成:“,,url)      if  __name__ ==, & # 39; __main__ # 39;:   ,,,start =, time.time(), #,开始时间      ,,,url_list =, (   ,,,,,,,“a",,“b",,“c"   ,,,)      ,,,pool =,池(len (url_list)), #,实例化一个线程池对象,并且设定线程池的上限数量为列表长度。不设置上限也可以。      ,,,pool.map (func, url_list)      ,,,最终获得=,time.time(), #,结束时间      ,,,print(最终获得成功,开始)

下面就是见证奇迹的时候了,让我们运行程序

 Python爬虫之线程池的使用方法

我们发现这次我们的运行时间只用2 ~ 3秒,其实我们可以将线程池简单的理解为将多个任务同时进行。

注意:

1。我使用的是pycharm,如果使用的是VS或者说是python自带的空闲,在运行时我们只能看到最后时间的输出。

2。我们输出结果可能并不是按abc的顺序输出的。

四,同步爬虫爬取图片

因为我们的重点是线程池的爬取效率提高,我们就简单的爬取一页的图片。

import 请求   import 时间   import 操作系统   得到lxml  import  etree      def  save_photo (url、,标题):   ,,,#,UA伪装   ,,,header =, {   ,,,,,,,“User-Agent":,“Mozilla/5.0, (Windows  NT  10.0;, Win64;, x64), AppleWebKit/537.36, (KHTML, like 壁虎),Chrome/90.0.4430.93  Safari/537.36“   ,,,}      ,,,#,发送请求   ,,,photo =, requests.get (url=url,,头=头).content      ,,,#,创建路径,避免重复下载   ,,,if  not  os.path.exists (“C: \ \ \ \华硕\ \用户桌面\ \ CSDN \ \高性能异步爬虫\ \线程池\ \同步爬虫爬取4 k美女图片\ \“,+,title  +,“.jpg"):   ,,,,,,,with 开放(“C: \ \ \ \华硕\ \用户桌面\ \ CSDN \ \高性能异步爬虫\ \线程池\ \同步爬虫爬取4 k美女图片\ \“,+,title  +,“.jpg",,“wb"), as 外交政策:   ,,,,,,,,,,,印刷(标题,“开始下载! ! !“)   ,,,,,,,,,,,fp.write(图)   ,,,,,,,,,,,印刷(标题,“下载完成! ! !“)      if  __name__ ==, & # 39; __main__ # 39;:   ,,,start =, time.time ()      ,,,#,创建文件夹   ,,,if  not  os.path.exists (“C: \ \ \ \华硕\ \用户桌面\ \ CSDN \ \高性能异步爬虫\ \线程池\ \同步爬虫爬取4 k美女图片“):   ,,,,,,,os.mkdir (“C: \ \ \ \华硕\ \用户桌面\ \ CSDN \ \高性能异步爬虫\ \线程池\ \同步爬虫爬取4 k美女图片“)      ,,,#,UA伪装   ,,,header =, {   ,,,,,,,“User-Agent":,“Mozilla/5.0, (Windows  NT  10.0;, Win64;, x64), AppleWebKit/537.36, (KHTML, like 壁虎),Chrome/90.0.4430.93  Safari/537.36“   ,,,}      ,,,#,指定url   ,,,url =,“https://pic.netbian.com/4kmeinv/"      ,,,#,发送请求,获取源码   ,,,page =, requests.get (=url  url, headers =,头)。text      null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null

Python爬虫之线程池的使用方法