文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

使用Python怎么实现异步爬虫的原理是什么

2023-06-15 01:01

关注

这篇文章给大家介绍使用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))

使用Python怎么实现异步爬虫的原理是什么

下面通过模拟爬取网站来完成对多线程,多进程,协程的理解。

二、多线程实现

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))

使用Python怎么实现异步爬虫的原理是什么

完成时间只需要2s!!!!!!!!

线程池使用原则:适合处理耗时并且阻塞的操作

三、协程实现

单线程+异步协程!!!!!!!!!!强烈推荐,目前流行的方式。

相关概念:

使用Python怎么实现异步爬虫的原理是什么

#%%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)

输出:

使用Python怎么实现异步爬虫的原理是什么

四、多任务协程实现

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))

使用Python怎么实现异步爬虫的原理是什么

此时不能用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怎么实现异步爬虫的原理是什么

python可以做什么

Python是一种编程语言,内置了许多有效的工具,Python几乎无所不能,该语言通俗易懂、容易入门、功能强大,在许多领域中都有广泛的应用,例如最热门的大数据分析,人工智能,Web开发等。

关于使用Python怎么实现异步爬虫的原理是什么就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯