第三十二篇 异步爬虫,线程池爬取视频

心得:当家里人问起,怎么还不回去老家,我真的不甘心就这样回去,在这个年纪里,已经没有了任何退路。

什么时候要使用多线程:

cpu密集型:( 比如一个 while( true ){ i++;} )
IO密集型:(比如一个从磁盘拷贝数据到另一个磁盘的拷贝进程)

1)计算密集型任务。此时要尽量使用多线程,可以提高任务执行效率,例如加密解密,数据压缩解压缩(视频、音频、普通数据)

2)IO密集型,若没超过磁盘负载,则还可以继续增加线程,同时执行效率得到提高,若超过了,则执行效率会急剧下降;

当我们在下载视频时,我们电脑属于多核,并且写入文件和获取数据都属于阻塞任务,我们需要使用多线程来并行下载,大大提高效率。

异步爬虫方式:
1.多线程,多进程
好处:可以为相关的阻塞操作单独开辟线程或者进程,阻塞操作就可以异步执行
弊端:无法限制的开辟线程数或者进程数
2.线程池
好处:可以降低系统对进程或者线程创建和销毁的一个频率,从而降低系统的开销
弊端:线程池或者进程池使用有上限

使用方法:
1.导入模块:
from multiprocessing.dummy import Pool
2.实例化线程池:
poo=Pool(4)
需要几个线程,数量输入几个,线程数量和CPU核数有关系,但是也指不清楚,曾经做多核并行运算的时候,建议是说开线程数为核数的两倍最好,其实,只要这些线程不频繁切换和竞争资源的话,多开点也不是不可以的!最优性能还是得慢慢调试。
3.方法调用

pool.map(func,args_list)  #map方法的两个参数,函数名和函数参数列表
pool.close()  #使用完之后关闭线程池
pool.join() #阻塞主线程

爬取视频网站原代码

import requests
from lxml import etree
import re
import os
import time
from multiprocessing.dummy import Pool

path="./多线程,多进程/li_video/"  #设置路径
if not os.path.exists(path):
    os.mkdir(path)

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"
    }

def download_video(dic):  #抓取视频的函数,传入参数为字典,得先获取字典内的键值
    video_url=dic['url']
    video_path=dic['path']
    video_name=dic['name']
    down_time=time.time()
    video_data=requests.get(url=video_url,headers=headers).content
    with open(video_path,"wb") as f:
        f.write(video_data)
    print(video_name+" 下载完成,用时: %.2f秒"%(time.time()-down_time))

def find_url(url):     #遍历抓取视频url的函数
    res=requests.get(url=url,headers=headers).text
    tree=etree.HTML(res)
    name=tree.xpath('//div[@class="popularem-ath"]/a/h2/text()')
    detail_url=tree.xpath('//li[@class="popularem clearfix"]/div[@class="popularem-ath"]/a/@href')
    video_lis=[]
    for n,d in zip(name,detail_url):
        video_name=n+".mp4"
        video_path=path+video_name
        detail_url="https://www.pearvideo.com/"+d
        res_detail=requests.get(url=detail_url,headers=headers).text
        video_url=re.findall(r'srcUrl="(.*?)",vdoUrl=',res_detail)[0]
        dic={                   #将参数存储在字典中
            "path":video_path,
            "url":video_url,
            "name":video_name
        }
        video_lis.append(dic)
    pool=Pool(len(video_lis)) #实例话线程池
    pool.map(download_video,video_lis)
    pool.close()
    pool.join()

    
start_time=time.time()
find_url("https://www.pearvideo.com/popular_31")
end_time=time.time()
print("一共用时 %.2f秒"%(end_time-start_time))

结果:

林肯总裁不惧车市寒冬,看好飞行家.mp4 下载完成,用时: 125.72秒
从机油看爱车健康,保养还能这么玩.mp4 下载完成,用时: 133.64秒
车市不好,供应商如何调整自己?.mp4 下载完成,用时: 159.86秒
GTR的变装秀 你觉得哪台最酷?.mp4 下载完成,用时: 162.82秒
小姐姐要买车,销售竟然想出了这招.mp4 下载完成,用时: 191.06秒
为还房贷,神龙员工兼职开快车?.mp4 下载完成,用时: 196.80秒
Jeep装上电动机?猜猜油耗多少?.mp4 下载完成,用时: 205.21秒
实拍改装领克03:竟和法拉利撞脸?.mp4 下载完成,用时: 213.08秒
在机场举办汽车发布会,他是飞行家.mp4 下载完成,用时: 215.01秒
环法上海站,我坐它体验了一圈赛道.mp4 下载完成,用时: 218.19秒
一共用时 222.90

文件:
在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值