用python来抓取一部小说是如此的简单,

438 阅读2分钟

哈哈哈,今天通过爬取免费小说的demo给大家讲述如何进行python的异步执行,摸鱼的时候顺便做了一下,其实这些小说手机上也能看,主要是为了学习和了解一下python的协成,同步和异步的操作。自己也是看视频学习的,但是由于要爬取的数据网站更新,自己又重新找了一个网页来抓取,过程很坎坷,先看效果图↓↓↓↓↓ 微信图片_20211207104931.png 唉,python新手,每一次的成功都是一次成就!

微信图片_20211207105709.png

首先举个小例子,讲一讲协程。协程就是如果遇到当前函数堵塞了暂时挂起,然后带着别的函数同一时间一起跑,像同步的话就是串行去跑。

import requests
import asyncio
import time

async def func():
    print('aaa')
#携程:当程序遇见阻塞了,可以选择性的切换到其他任务上,
if __name__=='__main__':
    g=func()
    print(g)//<coroutine object func at 0x00000209468AA420>,此时的g是一个对象
    asyncio.run(g)//这样就能执行func的函数

如果想一次性的执行多个协程,需这样

async def func1():
    print('aaa')
async def func2():
    print('bbb')
async def func3():
    print('ccc')
#携程:当程序遇见阻塞了,可以选择性的切换到其他任务上,
if __name__=='__main__':
    f1=func1()
    f2=func2()
    f3=func3()
    task=[f1,f2,f3]
    asyncio.run(asyncio.wait(task))//aaa,bbb,ccc

如果不明显我们可以稍微改动一下

async def func1():
    await asyncio.sleep(2)
    print('aaa')
async def func2():
    await asyncio.sleep(3)
    print('bbb')
async def func3():
    await asyncio.sleep(4)
    print('ccc')
async def main():
    f1=func1()
    f2=func2()
    f3=func3()
    task=[f1,f2,f3]
    await asyncio.wait(task)
#携程:当程序遇见阻塞了,可以选择性的切换到其他任务上,

if __name__=='__main__':
    f1=time.time()
    asyncio.run(main())
    f2=time.time()
    print(f2-f1) 
    
    结果:
    aaa
    bbb
    ccc
    4.002743482589722 我们可以清楚的一共花费了4s,而如果我们同步执行的话要花费2+3+4=9s,是不是这样看异步更省时间呢

接下来讲的就是异步请求网站的方法

requests.get()的异步请求就是aiohttp

下载方法:pip install aiohttp

#图片自己去找,这是我随便选了一个
urls=[
"https://image.baidu.com/search/detail?ct=503316480&z=0&ipn=d&word=%E5%9B%BE%E7%89%87&step_word=&hs=0&pn=3&spn=0&di=45100&pi=0&rn=1&tn=baiduimagedetail&is=0%2C0&istype=2&ie=utf-8&oe=utf-8&in=&cl=2&lm=-1&st=-1&cs=3119542616%2C1165410720&os=2799584461%2C194114839&simid=3476693851%2C221074112&adpicid=0&lpn=0&ln=1738&fr=&fmq=1639647760674_R&fm=detail&ic=0&s=undefined&hd=undefined&latest=undefined&copyright=undefined&se=&sme=&tab=0&width=&height=&face=undefined&ist=&jit=&cg=&bdtype=0&oriquery=&objurl=https%3A%2F%2Fgimg2.baidu.com%2Fimage_search%2Fsrc%3Dhttp%3A%2F%2Fimg.jj20.com%2Fup%2Fallimg%2Ftp09%2F21042G4331941H-0-lp.jpg%26refer%3Dhttp%3A%2F%2Fimg.jj20.com%26app%3D2002%26size%3Df9999%2C10000%26q%3Da80%26n%3D0%26g%3D0n%26fmt%3Djpeg%3Fsec%3D1642239763%26t%3Ddefd536f2facd5ef69a402def9ed4c9f&fromurl=ippr_z2C%24qAzdH3FAzdH3Fooo_z%26e3B33da_z%26e3Bv54AzdH3FprAzdH3Fndl8d0_z%26e3Bip4s&gsm=4&rpstart=0&rpnum=0&islist=&querylist=&nojc=undefined",
]
async def aiodownload(url):
   #发送请求
   name=url.resplit('/',1)[1] #对请求过来的数组以最后一个/之后的内容命名
   async with aiohttp.ClientSession()as session:   #加入with之后会自动close,#request。
       async with session.get(url)as resp: #相当于request.get()解析url并抓取我们需要的内容
           with.open('name',mode='wb') as f:
               f.write(await resp.content.read()) #暂时挂起,请求到照片了就读取录入
print(name,'搞定')   

async def main():
    task=[]
    for url in urls:
        task.append(aiodownload(url))#在函数里循环遍历urls并根据里面的方法,表示task里有很多等待执行的协成方法
if __name__=='__main__':
     asyncio.run(main()) #跑main函数