当前位置: 首页 > 科技观察

使用aiohttp制作异步爬虫

时间:2023-03-12 22:09:22 科技观察

简介asyncio可以实现单线程并发IO操作,是Python中常用的异步处理模块。asyncio模块的介绍会在后续的文章中介绍。本文将介绍一个基于asyncio的HTTP框架——aiohttp,它可以帮助我们异步实现HTTP请求,从而大大提高我们程序的效率。本文将介绍aiohttp在爬虫中的一个简单应用。在最初的项目中,我们使用Python的爬虫框架scrapy来爬取当当网的图书畅销书排行榜的图书信息。在这篇文章中,作者将通过两种方式制作爬虫,对比同步爬虫和异步爬虫(使用aiohttp实现)的效率,并展示aiohttp在爬虫中的优势。同步爬虫首先我们看一下爬虫的一般实现方式,即同步方式。完整的Python代码如下:'''同步爬取当当网畅销书图书信息的方式'''importtimeimportrequestsimportpandasaspfrombs4importBeautifulSoup#table表用于存储图书信息table=[]#处理网页defdownload(url):html=requests.get(url).text#使用BeautifulSoup将获取的文本解析成HTMLsoup=BeautifulSoup(html,"lxml")#获取网页中的畅销商品图书信息book_list=soup.find('ul',class_="bang_listclearfixbang_list_mode")('li')forbookinbook_list:info=book.find_all('div')#获取每本畅销书的排名、名称、评论数、作者、出版商rank=info[0].text[0:-1]name=info[2].textcomments=info[3].text.split('article')[0]author=info[4].textdate_and_publisher=info[5].text.split()publisher=date_and_publisher[1]iflen(date_and_publisher)>=2else''#将以上每本畅销书信息添加到表格中table.append([rank,name,comments,author,publisher])#所有网页urls=['http://吧ng.dangdang.com/books/bestsellers/01.00.00.00.00.00-recent7-0-0-1-%d'%iforiinrange(1,26)]#爬虫消耗时间统计print('#'*50)t1=time.time()#开始时间forurlinurls:download(url)#在pandas中将表转换为DataFrame并保存为CSV格式的文件df=pd.DataFrame(表,列=['排名','姓名','评论','作者','发布者'])df.to_csv('E://douban/dangdang.csv',index=False)t2=time.time()#结束时间print('使用通用方法,总耗时:%s'%(t2-t1))print('#'*50)输出结果如下:#########################################################耗时:23.522345542907715#################################################程序跑了23.5秒,爬取了500本书的信息,效率还是可以的我们进入目录查看文件,如下:异步爬虫接下来我们看一下用aiohttp做的异步爬虫的效率。完整源码如下:'''当当网畅销书图书信息的异步??爬取方式'''importtimeimportaiohttpimportasyncioimportpandasasdfrombs4importBeautifulSoup#table表格用于存储图书信息table=[]#获取网页(文本信息)asyncdeffetch(session,url):asyncwithsession.get(url)asresponse:returnawaitresponse.text(encoding='gb18030')#分析网页asyncdefparser(html):#使用BeautifulSoup将得到的文本解析成HTMLsoup=BeautifulSoup(html,"lxml")#Get网页中的畅销书信息book_list=soup.find('ul',class_="bang_listclearfixbang_list_mode")('li')forbookinbook_list:info=book.find_all('div')#获取排名,名称,评论数,每本畅销书的作者、出版商rank=info[0].text[0:-1]name=info[2]。textcomments=info[3].text.split('article')[0]author=info[4].textdate_and_publisher=info[5].text.split()publisher=date_and_publisher[1]iflen(date_and_publisher)>=2else''#将每个畅销书的上述信息添加到表格中table.append([rank,name,comments,author,publisher])#处理网页asyncdefdownload(url):asyncwithaiohttp.ClientSession()assession:html=awaitfetch(session,url)awaitparser(html)#所有网页urls=['http://bang.dangdang.com/books/bestsellers/01.00.00.00.00.00-recent7-0-0-1-%d'%iforiinrange(1,26)]#抓取时间统计print('#'*50)t1=time.time()#开始时间#使用asyncio模块进行异步IO处理loop=asyncio.get_event_loop()tasks=[asyncio.ensure_future(download(url))forurllinurls]tasks=asyncio.gather(*tasks)loop.run_until_complete(tasks)#将表转换成pandas中的DataFrame并保存为CSV格式的文件df=pd.DataFrame(table,columns=['rank','name','comments','author','publisher'])df.to_csv('E://douban/dangdang.csv',index=False)t2=time.time()#结束时间打印('使用aiohttp,总耗时:%s'%(t2-t1))print('#'*50)我们可以看到这个爬虫的思路和处理方式和原来的通用方法爬虫基本一样,只是在处理HTTP的时候使用了aiohttp模块requests和解析网页时的函数变成协程,然后使用aysncio进行并发处理,会undo潜移默化地提高了爬虫的效率。其运行结果如下:#####################################################使用aiohttp,总耗时:2.405137538909912####################################################2.4秒,太厉害了!!!我们看一下文件内容:总结综上所述,我们可以看出使用同步方式和异步方式制作的爬虫效率有很大的不同。所以,在实际制作爬虫的过程中,我们也可能会考虑异步爬虫,更多的使用异步方式。aysncio、aiohttp等模块。另外,aiohttp只支持Python3.5.3以后的版本。当然,本文只是一个异步爬虫的例子,并没有具体讲述异步背后的故事,而异步的思想在我们的现实生活和网站制作中有着广泛的应用。本文到此结束,欢迎大家交流~