Advertisement

一起学 Python 爬虫 — 08

阅读量:

共同学习Python网络爬虫技术 — 19年轻人中加入学习自动化的脚步

今天我又回来啦

  • 聊一聊
    • 首先
    • 一心多用
      • async 后面跟方法

刚刚在评论区看到有人已经收获了200个赞哦!于是乎从今天起我就开启了自己的创作之旅。说实话一开始也有点犯难不知道从何下手。到底是继续深入讲解下去还是先搜集一些实际案例来辅助教学呢?毕竟很多专业知识都需要循序渐进地学习才能真正掌握嘛。万一有些地方一时半会儿无法完全消化进去难免会有重复的内容出现这种感觉就像是在浅尝辄止地应付任务呢!实在有点心事上加心事啊!如果你有任何宝贵的建议或者想法不妨在评论区留言分享一下!

在这里插入图片描述

聊一聊

还记得我们学习爬虫最初的目的吗?
有些人是为了获取金钱 reward, 有些人是为了积累丰富驾驶经验, 还有些人是为了通过赚取更多钱来实现财务自由。那么在这几天里爬取的数据中, 是否包含与金钱相关的相关信息呢?
举个例子:
我们从网络上提取了大量耳机数据, 包括好评率、购买频率以及盈利能力较高的产品信息, 这样我们就可以自行采购并销售这些耳机;或者将这些数据出售给需要它们的企业家客户。
再比如, 如果你想成为标题党 King, 那你需要先积累一定的流量支持!你知道大家最喜欢什么样的内容吗?你又如何知道大家喜欢什么?还记得吗?百度就是一个大型的网络爬虫工具, 只要从百度获取相关数据后进行分析就能掌握用户的兴趣偏好!
那么为什么说在这个时代'数据就是金钱'?请通过以下事例理解这一观点:
当我们搜索视频时,默认是以哪些关键词为中心?
通常情况下都不会搜索'女优'这类特定内容的相关关键词吧。
再比如说最近火爆全网的马保国老师的视频, 很多b站up主正是通过蹭这个热度来获利的!那么当我们搜索相关视频时,默认是以哪些关键词为中心?是围绕马保国老师展开的还是直接以'马保国'这个核心词来进行搜索呢?显然答案是后者!因此利用爬虫技术可以帮助我们快速定位到那些可能爆红的内容!
通常我们会说: 给人机会别人不会白给, 如果你连热点领域的关注点都不清楚就别想成功……如果你连某个领域是否值得挖掘还不清楚的话, 那真是太可惜了!因为一旦抓住了一个能引发广泛讨论的话题并迅速输出优质内容, 就可能一炮而红成为时代的弄潮儿!
那么问题来了: 如何高效地收集这些关键数据?

首先

首先,今天小泽不想跟大家分享如何收集数据,而是准备与大家分享的是关于高效的数据收集方法。这时可能会有朋友问起,我们不会任何数据采集方法,那如何高效地进行数据采集呢?那么问题来了:在场的朋友们中有很多人可能还是处男状态,但这些人是否会影响我们的高效输出呢?听起来都挺快的样子。开个玩笑讲真,Python代码执行的方式确实有些直接,它会依次运行每一条指令,所以我们可以举个栗子:比如我们可以编写一个简单的循环程序来处理一批数据.

复制代码
    import time
    def english():
    print('小明正在学英语...')
    time.sleep(2)
    print('小明已经学了两秒英语...')
    
    def math():
    print('小明正在学数学...')
    time.sleep(2)
    print('小明已经学了两秒数学...')
    
    def zhexue():
    print('小明正在学哲学...')
    time.sleep(4)
    print('小明已经学了四秒哲学...')
    
    if __name__ == '__main__':
    	pass

小泽先生总共列出了三种学习方法,这相当于一个人必须完成的任务清单。越来越多的家长倾向于为孩子安排一系列课外学习活动,在这种情况下,默认的孩子需要完成英语、数学以及哲学等多门课程的学习计划。然而按照部就班地完成所有课程后天色已晚 ,想要再多拓展课程却因为时间不足而难以实现。这时许多人开始思考:是否有一种方式能够让孩子们同时掌握多种学科知识呢?

一心多用

这里我们改善一下代码:

复制代码
    import time
    
    def english():
    print('小明正在学英语...')
    time.sleep(2)
    print('小明已经学了两秒英语...')
    
    def math():
    print('小明正在学数学...')
    time.sleep(2)
    print('小明已经学了两秒数学...')
    
    def zhexue():
    print('小明正在学哲学...')
    time.sleep(4)
    print('小明已经学了四秒哲学...')
    
    if __name__ == '__main__':
    start = time.time()
    english()
    math()
    zhexue()
    end = time.time()
    print('小明学完所有课程啦!总用时:'+str(end-start)+'秒!')

上述代码大家应该都能看懂吧,都是基础哦!!
运行结果如下:

在这里插入图片描述

可以看出小明同学耗时仅需8秒钟就完成了全部课程学习。
为了培养像唐三那样的孩子则需要引导学生做到一心多用。
有没有什么方法能够同时实现这些目标呢?
答案毫无疑问是肯定的。
那就是asyncio模块啦!记住它可是异步编程的核心概念哦!

在这里插入图片描述

async是异步的意思,io可以理解为等待的意思,asyncio=async+io
可以理解为等待的时候异步!
什么意思呢,比如说你在接水,但是接水需要10秒钟,你在这10秒钟就原地站着,这叫不异步,怎么做到异步呢?
你一边接水一边手舞足蹈,这叫异步,同样的10秒,你干了两件事,别人只干了一件,这叫优秀。
接着,你一边接水一边手舞足蹈并且把水打翻了,好家伙你直接干了三件事!
接着你可以还要干很多事,把水擦干净,因为有好多水,流了出来,流了一床的那种,没错,我家饮水机是放在床上的。

在这里插入图片描述
  • async表示异步的概念。
  • io意味着程序在执行过程中需要等待处理。
  • asyncio=async+io 即当程序在执行时会暂停以便处理其他任务。

在编程中,“async”表示执行过程中的非阻塞特性,“io”代表在执行过程中需要等待资源的获取。将“asyncio”定义为“async”与“`io``的结合体,则意味着在资源未准备好时会暂时停止当前操作,在资源准备好后会立即切换到下一个任务继续执行。

async代表异步操作, io代表等待操作, asyncio由async与io组合而成, 在等待时实现了异步操作!

请各位自行下载模块,请您切记采用快捷的下载方法,在之前的博客中已经对此进行了详细说明。看到这里了,请别忘了点个赞哦!麻烦各位小可爱们点击一下吧~

既然有了可以让小明能够同时进行多个学习任务的模块后

async 后面跟方法

比如说…

复制代码
    import asyncio
    import time
    
    async def english():
    print('小明正在学英语...')
    time.sleep(2)
    print('小明已经学了两秒英语...')
    
    async def math():
    print('小明正在学数学...')
    time.sleep(2)
    print('小明已经学了两秒数学...')
    
    async def zhexue():
    print('小明正在学哲学...')
    time.sleep(4)
    print('小明已经学了四秒哲学...')

采用异步方法后(也就是在代码中添加async关键字),系统的运行效率有了显著提升。
异步方法的应用类似于岳掌门的"辟邪剑法"——通过独特的方式突破常规限制。
回顾岳掌门的成功案例,请问他是如何实现这种高效操作的呢?
为了实现目标而不牺牲自身利益,在处理事务时需要具备阴阳平衡的能力。
所以不要忘了还有io机制的存在——特别是在处理异步操作时需要注意这一点。
因此,在处理异步操作时需要特别注意的是io机制的应用。
这意味着当执行某些必须等待的操作(如发起请求、获取响应数据、持久化存储等)时,
需要在代码中添加相应的await关键字以避免阻塞问题。
那么既然我们使用async来优化性能,
在等待操作的时候是不是也应该使用await呢?

awa

看我操作:

复制代码
    import asyncio
    import time
    
    async def english():
    print('小明正在学英语...')
    await time.sleep(2)
    print('小明已经学了两秒英语...')
    
    async def math():
    print('小明正在学数学...')
    await time.sleep(2)
    print('小明已经学了两秒数学...')
    
    async def zhexue():
    print('小明正在学哲学...')
    await time.sleep(4)
    print('小明已经学了四秒哲学...')

真让人头疼啊!这一堆awa实在是让人抓狂!

该 await 被用来 waiting 待完成的任务。
该 await 被用来 waiting 待完成的任务。
该 await 被用来 waiting 待完成的任务。

但是time.sleep()是个女孩,她不想跟await这个角色玩耍,那该怎么办呢? 阴阳人自己玩自己啦,所以我们直接采用了阴阳人里面自带的sleep功能。

复制代码
    import asyncio
    import time
    
    async def english():
    print('小明正在学英语...')
    await asyncio.sleep(2)
    print('小明已经学了两秒英语...')
    
    async def math():
    print('小明正在学数学...')
    await asyncio.sleep(2)
    print('小明已经学了两秒数学...')
    
    async def zhexue():
    print('小明正在学哲学...')
    await asyncio.sleep(4)
    print('小明已经学了四秒哲学...')

虽然是阴阳人,也是不可以小瞧的啊,不掏出点大宝贝,你都看不起我!

在await之后执行的异步操作均需预先做好准备

awa

一切准备就绪,我们去执行代码:

复制代码
    if __name__ == '__main__':
    start = time.time()
    english()
    math()
    zhexue()
    end = time.time()
    print('小明学完所有课程啦!总用时:'+str(end-start)+'秒!')
在这里插入图片描述

好家伙,0.1秒就学完了,这是学了个p…

那这是为什么呢?我们翻译一下报错的部分:

在这里插入图片描述

这不是在问什么吗?
关于对象分配回溯的获取情况,请问各位是否都有对应的对吧?
是不是需要将所有人的对象全部收回呢?
然后就属于我了。
大概意思是说吧?大家都没拿到自己的对吧?也就是说大家都写的根本没意义嘛!也就是说根本没有调用操作啊!都被小泽给抢断了嘛!
可是!

在这里插入图片描述

如果没有调用对象,则这些又是什么?
怎么啦?这么回事吗?
我们知道阴阳人有独特的处理方式;如果按照常人的思路处理问题,则难以奏效。
那么,请问:阴阳人的开启方式究竟是什么?
先来分析吧!
我们是不是已经有了三个学会辟邪剑法的方法?这些方法是否支持异步运行?命令执行是否需要await?
awa
我们需要确认:是否已经为这三个方法增加了await关键字?
我们原本设想的是:直接调用这三个函数让它们同时运行对吧!
但是现实却并非如此。
为什么会这样呢……
突然间想到了一个问题:大多数模块在使用的时候都需要进行初始化操作对吧!而我们目前只利用了asyncio模块中的两个功能(async和io),这显然是不够的。
功能不足! asyncio模块应该拥有独立的空间才对啊!否则像掌门岳这样的存在即便能力强也不可能横扫群雄!所以我们必须想办法给阴阳人单独划分一片天地:
也就是说,在为阴阳人建一个属于自己的地盘之前,请确保我们的 asyncio模块拥有独立的空间。

复制代码
    # 建立一个阴阳人地盘
    loop = asyncio.get_event_loop()

这样我们便确定了属于自己的领土。接着再问问大家是否都熟悉网页游戏的基本玩法?特别是那些拥有众多悬赏任务的游戏——只要完成一条就会被系统自动移除;如果不及时处理这些任务……直到有人来处理它为止。同样的道理,在异步处理中我们也采用类似的策略——建立一个专门的任务库来存储这些任务信息。

复制代码
    # 建立任务库
    renwu = [
        english(),math(),zhexue()
    ]

然后问题来了,这个库放在哪里?
阴阳人的地盘,阴阳人说了算:

复制代码
    # 提交任务库
    loop.run_until_complete(asyncio.wait(renwu))

不需要你去追问原因和细节……规则是由别人制定的规定……打杂的工作由我来做……只是一线普通员工而已

复制代码
    import asyncio
    import time
    
    async def english():
    print('小明正在学英语...')
    await asyncio.sleep(2)
    print('小明已经学了两秒英语...')
    
    async def math():
    print('小明正在学数学...')
    await asyncio.sleep(2)
    print('小明已经学了两秒数学...')
    
    async def zhexue():
    print('小明正在学哲学...')
    await asyncio.sleep(4)
    print('小明已经学了四秒哲学...')
    
    if __name__ == '__main__':
    	# 开始计时
    start = time.time()
    # 建立任务库
    renwu = [
        english(),math(),zhexue()
    ]
    # 初始化地盘
    loop = asyncio.get_event_loop()
    # 放置任务
    loop.run_until_complete(asyncio.wait(renwu))
    	# 结束计时
    end = time.time()
    print('小明学完所有课程啦!总用时:'+str(end-start)+'秒!')

话不多说,先运行一下吧!

在这里插入图片描述

妈妈再也不用担心我的学习了!!!

在这里插入图片描述

总体思路是,在一个任务组中每个任务都有明确的标签区分已完成或未完成的任务。一旦完成就将被移除不再处理而未完成的任务则会持续循环执行直到全部完毕。每当遇到await指令系统便会转向查看其他相关任务依然能够理解整个流程的操作逻辑。现在注意到这里有几个值得注意的地方:

全部评论 (0)

还没有任何评论哟~