Python异步爬虫实例代码分析
发表于:2025-11-08 作者:千家信息网编辑
千家信息网最后更新 2025年11月08日,这篇文章主要介绍"Python异步爬虫实例代码分析"的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇"Python异步爬虫实例代码分析"文章能帮助大家解决问题。一、
千家信息网最后更新 2025年11月08日Python异步爬虫实例代码分析
这篇文章主要介绍"Python异步爬虫实例代码分析"的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇"Python异步爬虫实例代码分析"文章能帮助大家解决问题。
一、背景
默认情况下,用get请求时,会出现阻塞,需要很多时间来等待,对于有很多请求url时,速度就很慢。因为需要一个url请求的完成,才能让下一个url继续访问。一种很自然的想法就是用异步机制来提高爬虫速度。通过构建线程池或者进程池完成异步爬虫,即使用多线程或者多进程来处理多个请求(在别的进程或者线程阻塞时)。
import time #串形 def getPage(url): print("开始爬取网站",url) time.sleep(2)#阻塞 print("爬取完成!!!",url) urls = ['url1','url2','url3','url4','url5'] beginTime = time.time()#开始计时 for url in urls: getPage(url) endTime= time.time()#结束计时print("完成时间%d"%(endTime - beginTime))下面通过模拟爬取网站来完成对多线程,多进程,协程的理解。
二、多线程实现
import time #使用线程池对象from multiprocessing.dummy import Pool def getPage(url): print("开始爬取网站",url) time.sleep(2)#阻塞 print("爬取完成!!!",url) urls = ['url1','url2','url3','url4','url5'] beginTime = time.time()#开始计时 #准备开启5个线程,并示例化对象pool = Pool(5)pool.map(getPage, urls)#urls是可迭代对象,里面每个参数都会给getPage方法处理 endTime= time.time()#结束计时print("完成时间%d"%(endTime - beginTime))完成时间只需要2s!!!!!!!!
线程池使用原则:适合处理耗时并且阻塞的操作
三、协程实现
#%%import time #使用协程import asyncio async def getPage(url): #定义了一个协程对象,python中函数也是对象 print("开始爬取网站",url) time.sleep(2)#阻塞 print("爬取完成!!!",url) #async修饰的函数返回的对象 c = getPage(11) #创建事件对象loop_event = asyncio.get_event_loop()#注册并启动looPloop_event.run_until_complete(c) #task对象使用,封装协程对象c'''loop_event = asyncio.get_event_loop()task = loop_event.create_task(c)loop_event.run_until_complete(task)''' #Future对象使用,封装协程对象c 用法和task差不多'''loop_event = asyncio.get_event_loop()task = asyncio.ensure_future(c)loop_event.run_until_complete(task)''' #绑定回调使用 async def getPage2(url): #定义了一个协程对象,python中函数也是对象 print("开始爬取网站",url) time.sleep(2)#阻塞 print("爬取完成!!!",url) return url #async修饰的函数返回的对象 c2 = getPage2(2) def callback_func(task): print(task.result()) #task.result()返回任务对象中封装的协程对象对应函数的返回值 #绑定回调loop_event = asyncio.get_event_loop()task = asyncio.ensure_future(c2) task.add_done_callback(callback_func) #真正绑定,loop_event.run_until_complete(task)四、多任务协程实现
import time #使用多任务协程import asyncio urls = ['url1','url2','url3','url4','url5'] async def getPage(url): #定义了一个协程对象,python中函数也是对象 print("开始爬取网站",url) #在异步协程中如果出现同步模块相关的代码,那么无法实现异步 #time.sleep(2)#阻塞 await asyncio.sleep(2)#遇到阻塞操作必须手动挂起 print("爬取完成!!!",url) return url beginTime = time.time() #任务列表,有多个任务tasks = [] for url in urls: c = getPage(url) task = asyncio.ensure_future(c)#创建任务对象 tasks.append(task)loop = asyncio.get_event_loop()loop.run_until_complete(asyncio.wait(tasks))#不能直接放task,需要封装进入asyncio,wait()方法中 endTime = time.time() print("完成时间%d"%(endTime - beginTime))此时不能用time.sleep(2),用了还是10秒
对于真正爬取过程中,如在getPage()方法中真正爬取数据时,即requests.get(url) ,它是基于同步方式实现。应该使用异步网络请求模块aiohttp
参考下面代码:
async def getPage(url): #定义了一个协程对象,python中函数也是对象 print("开始爬取网站",url) #在异步协程中如果出现同步模块相关的代码,那么无法实现异步 #requests.get(url)#阻塞 async with aiohttp.ClintSession() as session: async with await session.get(url) as response: #手动挂起 page_text = await response.text() #.text()返回字符串,read()返回二进制数据,注意不是content print("爬取完成!!!",url) return page_text关于"Python异步爬虫实例代码分析"的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识,可以关注行业资讯频道,小编每天都会为大家更新不同的知识点。
对象
阻塞
线程
函数
网站
代码
任务
爬虫
时间
方法
进程
封装
实例
分析
模块
知识
同步
处理
多个
手动
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
查询有关数据库的全部图书信息
我的世界宝可梦重铸版服务器和更多福利推荐
东莞聊天软件开发电话
数据库原理中科大出版社
软件开发 angel
盘点对服务器有用的指令
网络安全基金还能买吗
sql数据库2005
如何建立云端数据库系统
将网络安全放在重要位置
互联网怎么访问电脑数据库
服务器安全狗 下载
亚马逊数据库自动生成软件
声音文字图形这些都是数据库吗
怀旧服同区不同服务器能卖吗
画简单的网络安全手抄报
数据库仪器价格
老男孩网络安全第七期
开票系统数据库更改
应用软件开发工具基本功能
黄山市网络安全法培训会
软件开发公司李俊辰
数据库的fill
云顶之弈澳服服务器名称
科技互联网达人
狗爹的服务器默认谁的
美队tv软件服务器错误
网络安全教育大会发言稿
软件开发企业实战项目
网络安全作文年级