当前位置: 首页 > 后端技术 > Python

为什么Python要使用异步爬取?

时间:2023-03-26 17:34:41 Python

有时候,我们使用爬虫来下载图片、视频等,下载这些文件是一个耗时的操作。如果使用以前的同步方式下载。那效率会特别慢。这时候我们可以考虑使用多线程来下载这类文件。多线程就是同时完成多个任务,通过提高资源使用效率来提高系统的效率。当需要同时完成多个任务时,就会实现线程。最简单的比喻就是多线程就像火车的每一节车厢,一个进程就是一列火车。车厢不可能离开火车。同样,一列火车可以有多个车厢。多线程的出现就是为了提高效率。同时,它的出现也带来了一些问题。通常,需要爬虫的场景需要并发或并行,这离不开进程、线程或协程。接下来我们爬取1000篇文章,看看异步爬虫和同步爬虫的差距。异步虫代码:importasyncioimportjsonimportaiohttpfromtypingimportList,OptionalfromdatetimeimportdatetimeclassSpider:def__init__(self,urls:List[str],headers:Optional[dict]=None,cookie:Optional[str]=None):self.urls=urlsself.headers=headersself.cookies=Noneifcookieelse{'cookie':cookie}self.loop=asyncio.get_event_loop()self.result=list()defexcute(self):self.loop。run_until_complete(self.spiders())self.loop.close()withopen('main.json','w')asf:json.dump(self.result,f)asyncdefspiders(self):semaphore=asyncio.Semaphore(250)spider=[self.run(url,semaphore)forurlinself.urls]awaitasyncio.wait(spider)asyncdefrun(self,url,semaphore):与信号量异步:与aiohttp异步。ClientSession(loop=self.loop,headers=self.headers,cookies=self.cookies)assession:asyncwithsession.get(url)asresponse:text=awaitresponse.text()self.result.append(json.加载(文本))如果__name__==“__main__”:网址=[]foriinrange(1,1001):urls.append(f'http://httpbin.org/anything?page={i}')s=Spider(urls)start=datetime.now()s.excute()end=datetime.now()print("multithreading")print((end-start).total_seconds(),"seconds")同步爬虫代码:importjsonimportrequestsfromdatetimeimportdatetimeif__name__=="__main__":start=datetime.now()result=[]foriinrange(1,1001):url=f'http://httpbin.org/anything?page={i}'result.append(requests.get(url.json())withopen('test.json','w')asf:json.dump(result,f)end=datetime.now()print("synchronous")print((end-start).total_seconds(),"seconds")从结果来看,在爬取1000个链接的场景下,异步爬虫的效率是同步爬虫的30倍以上##异步#26.43秒##同步#621.35秒相对资源consumption是小了,但是效率提升那么大,所以以后的爬虫,推荐大家使用multi-threading,多进程等提高工作效率。以上就是今天和大家分享的内容。获取源码请回复“多线程对比”。有兴趣的朋友可以尝试对比一下多线程和多处理的效率,看看多处理和多线程的区别。更多精彩教程,请关注公众号SpiderBy,回复“ip”,即可获得*10000个ip+测试。