心得:当家里人问起,怎么还不回去老家,我真的不甘心就这样回去,在这个年纪里,已经没有了任何退路。
什么时候要使用多线程:
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秒
文件: