网络爬虫:简单获取数据

如何在网络上获得自己想要的数据呢,大家首先就会想到网络爬虫。python编写的获取网络数据程序是大家最为熟知的爬虫,今天就来给大家介绍一下如何使用python中的asyncio、aiohttp库来获取数据。

网络爬虫:简单获取数据

Python 3.4以后引入asyncio库,同时对于异步IO也做了支持。那aiohttp又是什么呢?aiohttp是在asyncio基础上封装的http框架。下面是一段使用asyncio、aiohttp实现获取数据的程序:

网络爬虫:简单获取数据

使用上面的程序可以拿到我们必须打开浏览器才能看到的数据,下面是获取自己的html信息日志

网络爬虫:简单获取数据

问题

上面的程序只是简单地循环了10次,看起来是没有问题的。那如果我循环1000次呢?我们来试试,结果确报出了如下错误。

网络爬虫:简单获取数据

ValueError: too many file descriptors in select() 这个错误主要是因为windows、linux系统对于文件句柄有限制。windows下面默认打开文件句柄或socket是512, 而linux是1024。

解决

asyncio提供了Semaphore可以限制文件句柄同时打开的数目。因为有了限制,所以不会超过系统的最大值,因此也就不会再报错了。程序如下:

网络爬虫:简单获取数据

输出日志:

网络爬虫:简单获取数据

从日志我们可以看出Semaphore很好地限制了一次请求的数目。如果一次请求的数目超过了这个阈值,则就会就入等待直到上次请求全部完成。我在上面的请求中加了3秒的耗时,此时看到一次只是2个请求在处理,上面的2个请求完成了之后,后面才会继续。

文章仅供大家参考学习,如果有什么问题大家可以一起交流。但是希望把技术用在正途上~


分享到:


相關文章: