aiohttp异步爬虫难吗?
难!当然难!首先你找教程就是个问题!面向萌新的更是少的可怜,零零散散,大部分教程都是中级及以上的程度!问题是…………入门篇呢?怎么入门?
还好!这篇文章就是专门解决这个问题的!((≧∇≦)/)
准备工作:
Python版本3.5及以上!有安装 aiohttp asyncio BeautifulSoup 等库!
这些是准备工作!没有工具怎么撸代码对吧!
还有至少有Python基础!会requests!才能学习喔⊙ω⊙!
异步使用中要注意的地方:
1.异步很快!所以想要为所欲为!电脑一定要好,否则会出现遗失数据的情况(我的辣鸡老电脑43分钟爬了55000张图片,结果程序跑完了只有最多20000张图能看,其他的数据因为电脑太老了来不及写入结果被冲掉了…………所以,要有承受失去一部分数据的心理准备,或者限速!(高级套,土豪套可以无视此限制!)
2. aiohttp相当于12缸发动机的跑车!所以链接数量只有百来条的同学!请老老实实用requests吧!百来条链接用aiohttp速度会和requests差不多!原因很简单,数量少压根跑不起来!这是大杀器,拿来杀鸡不理想!
3. 记住上面两点!完毕…………!
(怕你们吃亏,提前说出来!)
教程正式开始:
1.天才第一步,导入Python库!
time是时间模块用来计时的不是本篇必要的库!
aiohttp 我们异步爬虫的主角,还有它老爸—— asyncio !
我们的解析库BeautifulSoup 爬虫必备!
注意!
建议你安装使用 lxml 来解析,而不是BeautifulSoup 自带的 html.parser !
如果说aiohttp是请求库中的12V跑车,那么lxml就是解析的12V跑车,两强联手,所向披靡!
2.构建要爬取的链接:
这个应该是基础了,各有各的方法和方式就不多解释了!
3.异步第一步 async def
async=标记为协程,协程就是异步的关键!def 大家都很熟悉了,定义的意思,不做详细解释了!
连在一起
就是以协程的形式定义一个函数 或者 说文化点就是 定义一个协程形式的函数 简化点 定义协程函数!三种骚话版本应该能看懂了吧!get()是我定义的函数名!这个按自己喜好来!记得加上 async def 就好,
headers是请求头,基础知识不做详解!
4.异步第二步 session
这一步和 async def 差不多是固定套路,我们的异步请求全是靠aiohttp里面的ClientSession 来执行的,因为是个关键的东西,所以是固定化的!
async with aiohttp.ClientSession() as session:
as 后面的名字可以改动,前半身是固定的,记下来就好!了解了解有什么用就OK了,库的开发者已经帮助我们铺垫好了,按套路走就好!
注意:
async with aiohttp.ClientSession() as session:
这一句
只需要写一次!
只需要写一次!
只需要写一次!
重要的逼,装三遍!
5.发送请求
async with session.get(url,headers = headers) as resp:
这一句就是请求部分了,session是我定义的名字,你们换成自己的!url是链接,headers是请求头,除了get外,其他的和requests差不多也能 post 等同于requests.get(url,headers=headers)
仅仅是把requests.get请求置换成了async with session.get()了而已,然后依次解析!写法和requests差不多吧!
我放图你们自己琢磨!我过一下重要部分就好!
注意,之所以上下错开是我调了编译器的设置,不然代码截图不完全,你们还是按Python正常的写法,缩进书写!
6.重点部分来了!
第一句和最后一句跳过,是统计程序运行时间的代码!可有可无!
loop = asyncio.get_event_loop()
又一句固定化代码!照抄就好,作用是开启循环模式,因为异步就是信息循环的过程,这一句相当于给汽车打火!
tasks =[get(i)for i in a]
还记得a列表吗?就是我们拼接或者循环得到的所有主要链接!通过迭代的方式赋值给我定义的协程函数get(),注意,[ ] 这个无论如何都是要的,没他没法跑起来,估计是内部有函数需要用[ ]判断链接是否发送过吧!和a列表原理应该差不多,不过它是内置在里面的而已!注意一下就好!
loop.run_until_complete(asyncio.wait(tasks))
这一句,差不多也算固定化代码,里面的tasks变量名可以改成你自己的,这一句的作用就是启动循环跑起来的意思,相当于踩汽车油门,愉快开跑的意思!
我们来梳理一下!
1.构建链接
2.定义一个协程函数体(此时的async仅仅起到了标明只是一个协程定义函数的作用,后面的才是发挥作用的代码,形象的比喻,就是,只是一个协程的文件夹,代码在里面!)
3.async with aiohttp.ClientSession() as session:
以协程的形式使用请求功能的主要函数,没他不能get请求,固定套路,缺一不可!
4.async with session.get(url,headers = headers) as resp:
get请求的方式,用于异步请求,出自aiohttp.ClientSession()
(跳过部分:这一段是请求和解析的部分,因人而异,所以跳过,会requests和BeautifulSoup都懂!)
5.loop = asyncio.get_event_loop()
开启消息循环,固定套路,缺一不可!
6.tasks =[get(i)for i in a]
这个迭代真的不用讲吧!基础知识!
7.loop.run_until_complete(asyncio.wait(tasks))
这一句,启动所有代码!
汽车人!出发!
异步爬虫讲解完毕!其他的解析js啊!反爬虫啊!什么的就自己去掌握了,知识是说不完的!下面是不错的教程用于参考!
aiohttp还能用于异步服务器端喔!这些百度的到!反正是个很强大的库!
1.异步起源知识
2.异步简易使用
3.异步讲解
4.异步使用2
5.不错的异步文章
是不是灰常简单!除了代码变动了一下其他简直和requests一模一样的写法有木有!就这样就能轻松实现异步操作!这一点非常的Python!一句话————牛逼!墙都不服,就服你!
简书处女作——完成!