Python异步实战:异步爬取网站之简单使用教程

一、使用异步的注意事项

异步代码中不能有耗时的 I/O操作,像文件读写、网络请求、数据库读写等操作都需要使用对应的异步库来代替。

异步代码要尽可能短小,短小的意思就是功能要尽可能细分,前面讲过异步在任务量较少的时候性能并不能达到最优,我们可以通过合理地拆分代码来增加任务量,从而达到提高性能的目的。

想要学习爬虫的可以私信回复【02】即可获取Python爬虫教程一套

二、使用异步需要了解的两个重要的类

AbstractEventLoop,我们可以把它简称为 EventLoop类或者事件循环。

事件循环是整个异步的基础,所有的异步操作都在事件循环里完成。

这里我们需要了解并学会使用它的如下几个方法:

run_until_complete(Future) 该方法接受一个或多个 Future对象作为参数,然后运行这些对象直到全部完成并返回它们的结果

run_forever() 让事件循环一直运行下去,直到 stop() 方法被调用,当 stop() 方法被调用时,会继续执行完正在执行的任务,但是这些任务的回调和未被执行的任务将不再执行。

create_task()、create_future() 光看名字可能大家会误以为这两个方法的功能是创建一个 Task类或者 Future类并将其返回,事实上这两个方法的功能确实包括这个,但是除此之外它们还会将创建的对象添加到事件循环中去。

2.Future,Future对象类似于 JavaScript里的 Promise对象,简单来说就是该对象承诺未来的某个时候会返回一个结果,但是具体的时间是不确定的。

所以我们一般在回调函数里使用 Feture对象,因为这时候 Feture对象一定有返回结果。

add_done_callback(func) 这个方法为 Future对象添加一个回调函数,该函数接收一个 Future对象作为第一个参数,在函数里我们可以通过这个对象来取得其执行结果。

3.使用过 asyncio库的朋友可能会疑惑为什么没有 Task类,这是因为 Task 类是 Future 类的子类,我们可以将它们视作具有相同功能的两个类

三、使用异步的基本方法

首先,对于少量的请求(几百)我们不推荐使用异步,一般是成千上万的请求我们才使用异步,比如说爬取全站。

在同步代码中我们爬取的一般步骤是:

请求页面---->解析页面---->获取结果---->保存结果

异步中也是类似的顺序,不过我们需要使用回调来确保它们按顺序执行

像下面这样:

请求页面---->回调:解析页面---->获取结果---->保存页面(异步)

比如我们要获取简书用户的关注列表,我们的代码顺序应该是:

请求页面---->回调:处理页面---->获取结果并打印

代码如下:

在段代码中我们通过 entry_point 函数来将所有的请求添加到事件循环中

并且为每个请求添加了一个回调函数来获取关注者的信息

示意图如下:

关注公众号,“Python语言”,回复“python”即可获取python学习视频

为大家提供与Python相关的最新技术和资讯。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180829A1PY2200?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券