异步爬虫之多线程、多进程

高性能异步爬虫
目的:在爬虫中使用异步实现高性能的数据爬取操作。
异步爬虫的方式:
多线程,多进程(不建议) :
好处:可以为相关阻塞的操作单独开启线程或者进程,阻塞操作就可以异步执行。
弊端:无法无限制的开启多线程或者多进程。
线程池、进程池:(适当的使用)
好处:我们可以降低系统对进程或者线程创建和销毁的频率,从而很好的降低系统的开销。
弊端:池中线程或进程的数量是有上限。
实例:爬取梨视频中的视频
 1 import re,os
 2 from multiprocessing.dummy import Pool
 3 headers = {
 4     "User-Agent": 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36'
 5 }
 6 
 7 def load_video(dic):
 8     print(dic["name"],"开始下载")
 9     data = requests.get(url=dic["url"],headers=headers).content
10     with open("./梨视频/"+dic["name"],"wb") as f:
11         f.write(data)
12     print(dic['name'],"下载完成!")
13 
14 if __name__ == '__main__':
15     if not os.path.exists("./梨视频"):
16         os.mkdir("./梨视频")
17     url = "https://www.pearvideo.com/category_5"
18     page_text = requests.get(url=url,headers=headers).text
19     tree = etree.HTML(page_text)
20     li_list = tree.xpath('//*[@id="listvideoListUl"]/li')[:-1]
21     video_list = []
22     for li in li_list:
23         href = 'https://www.pearvideo.com/'+li.xpath('./div/a/@href')[0]
24         name = li.xpath('./div/a/div[2]/text()')[0] + ".mp4"
25         p_text = requests.get(url=href,headers=headers).text
26         ex = 'srcUrl="(.*?)",vdoUrl=srcUrl'
27         video = re.findall(ex,p_text)[0]
28         dic = {
29             "name":name,
30             "url":video,
31         }
32         video_list.append(dic)
33     pool = Pool(3)
34     pool.map(load_video,video_list)
进程池的应用-爬取下载梨视频的部分视频
单线程+异步协程(推荐) :
event_ Loop:
事件循环,相当于一个无限循环,我们可以把一些函数注册到这个事件循环上,当满足某些条件的时候,函数就会被循环执行。
coroutine:
协程对象,我们可以将协程对象注册到事件循环中,它会被事件循环调用。
我们可以使用async关键字来定义一个方法,这个方法在调用时不会立即被执行,而是返一个协程对象。
task:
任务,它是对协程对象的进一步封装, 包含了任务的各个状态。
future:
代表将来执行或还没有执行的任务,实际上和task 没有本质区别。
async:
定义一个协程.
await:
用来挂起阻塞方法的执行。
posted @ 2020-08-27 21:32  My帝王源  阅读(107)  评论(0)    收藏  举报