使用aiohttp 抓取起点小说网

主要是为了学习异步协程抓取库,包括asyncio, aiohttp,等库的用法,顺便学习。感受一下并发的速度。
所以代码也不是很难,都是直接找到小说目录接口,找到目录之后抓取正本小说。

基础概念:

event_loop 事件循环:理解为一个循环的池,里面存放一些async关键词定义的协程函数,只有放到循环池里才能执行

coroutine 协程:协程对象,指一个使用async关键字定义的函数,它的调用不会立即执行函数,而是会返回一个协程对象。协程对象需要注册到事件循环,由事件循环调用。

task 任务:一个协程对象就是一个原生可以挂起的函数,任务则是对协程进一步封装,其中包含任务的各种状态。

future:代表将来执行或没有执行的任务的结果。它和task上没有本质的区别

async/await 关键字:python3.5 用于定义协程的关键字,async定义一个协程,await用于挂起阻塞的异步调用接口

协程的启动:(多协程并发)

loop = asyncio.get_event_loop()
loop.run_until_complete(asyncio.gather(*tasks))
loop.run_until_complete(asyncio.wait(*tasks))

gather和wait的区别在于,gather根据任务列表的顺序依次输出而wait则是乱序的。

停止协程任务

实现结束task有两种方式:关闭单个task、关闭loop,涉及主要函数:

asyncio.Task.all_tasks()获取事件循环任务列表

KeyboardInterrupt捕获停止异常(Ctrl+C)

loop.stop()停止任务循环

task.cancel()取消单个任务

loop.run_forever()

loop.close()关闭事件循环,不然会重启

重启

关于对异步生成器进行切片

使用异步并发的时候,很容易任务task中的数量过多,
当并发超多2000的时候就会报错

ValueError: too many file descriptors in select()

报错的原因字面上看是 Python 调取的 select 对打开的文件有最大数量的限制,这个其实是操作系统的限制,linux打开文件的最大数默认是1024,windows默认是509,超过了这个值,程序就开始报错
这里我们有三种方法解决这个问题:

1.限制并发数量。(一次不要塞那么多任务,或者限制最大并发数量)

2.使用回调的方式。

3.修改操作系统打开文件数的最大限制,在系统里有个配置文件可以修改默认值,具体步骤不再说明了。

限制并发数量

不修改系统默认配置的话,个人推荐限制并发数的方法,设置并发数为500,处理速度更快。

#coding:utf-8
import time,asyncio,aiohttpurl = 'https://www.baidu.com/'
async def hello(url,semaphore):async with semaphore:async with aiohttp.ClientSession() as session:async with session.get(url) as response:return await response.read()async def run():semaphore = asyncio.Semaphore(500) # 限制并发量为500to_get = [hello(url.format(),semaphore) for _ in range(1000)] #总共1000任务await asyncio.wait(to_get)if __name__ == '__main__':
#    now=lambda :time.time()loop = asyncio.get_event_loop()loop.run_until_complete(run())loop.close()

对异步生成器进行切片

    async def branch(self, coros, limit=10):'''使用aiostream模块对异步生成器做一个切片操作。这里并发量为10.:param coros: 异步生成器:param limit: 并发次数:return:'''index = 0while True:xs = stream.preserve(coros)ys = xs[index:index + limit]t = await stream.list(ys)if not t:breakawait asyncio.ensure_future(asyncio.gather(*t))index += limit + 1

具体使用

抓取起点小说网:
这里就是写点碰到的错误吧

第一个错误



推荐陈佬的博客:https://www.cnblogs.com/c-x-a/p/10208179.html

这个问题具体的解决就是去掉for前面的async

第二个错误



应该是超时了。设置的超时为5秒。
解决就是异常,超过5秒就跳过。

最后一个错误

这个错误我手写。使用协程并发的时候,使用gather它的顺序是正常的,但是写入的文件里是乱序的。
按理说写入也是顺序的,所以这个错误现在还有点没太明白。希望大家能指点一下。
最后通过使用队列+协程。将每次抓取的内容保存到字典中。
最后对字典进行处理。这样抓取的数据就是有顺序的。

关于在协程中使用队列:

https://www.cnblogs.com/c-x-a/p/10668977.html

微信公众号,欢迎扫码关注:

使用aiohttp 抓取起点小说网相关推荐

  1. 爬虫项目实战二:爬取起点小说网

    爬取起点小说网 目标 项目准备 网站分析 反爬分析 代码实现 效果显示 目标 爬取一本仙侠类的小说下载并保存为txt文件到本地.本例为"大周仙吏". 项目准备 软件:Pycharm ...

  2. java小说目录提取_完整Java爬取起点小说网小说目录以及对应链接

    完整Java爬取起点小说网小说目录以及对应链接 完整Java爬取起点小说网小说目录以及对应链接 (第一次使用markdown写,其中的排版很不好,望大家理解) ?? 因为最近有一个比赛的事情,故前期看 ...

  3. 【Python从零到壹】使用XPath解析数据爬取起点小说网数据

    我们已经可以从网上爬取数据了,现在我们来看看如何对数据解析 文章目录 1. xpath 的介绍 优点: 安装lxml库 XML的树形结构: 选取节点的表达式举例: 2. 爬取起点小说网 在浏览器中获取 ...

  4. Python爬虫期末作业 | 爬取起点小说网作者和书名,并以Excel形式存储

    使用Python爬虫技术爬取起点小说网作者及书名,并且以xlsx形式保存 前言 随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容. 一. ...

  5. Java抓取起点小说输出到本地文件夹和数据库

    Java抓取起点小说输出到本地文件夹和数据库 目录 项目结构 所需插件 项目代码 输出结果 目录 项目结构 第一次写网络爬虫,参考了别人的,也自己理解了用法 所需插件 因为使用了mevan,直接上po ...

  6. 起点小说免费看 Scrapy爬取起点小说网数据导入MongoDB数据

    本文中我们将详细介绍使用Scrapy抓取数据并存入MongoDB数据库,首先给出我们需要抓取得数据: 抓取起点网得全部作品,网址为:https://www.qidian.com/all 关于Scrap ...

  7. scrapy爬取起点小说网

    闲来无事,在学习过程中练习用scrapy爬取起点小说名 工具:python3.6 操作系统:linux 浏览器:谷歌浏览器 创建项目 在黑屏终端创建一个项目:scrapy startproject Q ...

  8. 写了个爬虫,抓取落霞小说网 斗罗大陆2绝世唐门

    在手机上看斗罗大陆2绝世唐门小说,总是被小广告打扰,于是想抓下来慢慢看,于是-- 斗路大陆之绝世唐门是唐家三少前些年写的小说,不知道被什么小链接挑逗,我点开看了一部分,还满吸引人的.看来我也很容易被简 ...

  9. 爬取起点小说网免费小说

    python 3.7 设置了0.5秒存入一个章节 所以有点慢 运行的时候在py文件的同级目录下创建目标的小说文件夹 在文件夹中写入小说章节 headers完全没有引用= =(主要是起点没有怎么反爬取) ...

最新文章

  1. ST CUBEMX 修改MCU型号
  2. vba移动文件_VBA代码解决方案的第68讲内容:利用WSH,复制文件
  3. 开发文件服务器,易语言开发文件服务器
  4. 面经——C/C++常见面试知识点总结附面试真题
  5. Linux系统下,虚拟终端开启256色_虚拟终端类型xterm开启256色
  6. 嵌入式操作系统内核原理和开发
  7. 【Java】StringBuilder类、包装类
  8. java 静态绑定_java的动态绑定和静态绑定
  9. excel 如何根据身份证号自动匹配性别代码
  10. python遍历文件夹内文件并检索文件中的中文内容
  11. 【万字讲解C语言入门小游戏】——三子棋
  12. 计算机CPU像人的大脑,人脑与电脑的相似性与差异性及全球脑
  13. 软件实施工程师需要掌握的技能
  14. 优维EasyOps®全平台又一波新功能上线,操作体验更带劲
  15. MathType完美兼容Word 2019 最详细的安装配置教程转载
  16. 甘肃省天水市谷歌卫星地图下载
  17. 北京大学可视化发展前沿研究生暑期学校第二讲
  18. 嵌入式Linux系统开发入门宝典(第2版)
  19. GreenDao封装使用
  20. 程序员工作两年的经验

热门文章

  1. csdn怎么提问问题?
  2. 中国电子邮件的发展史
  3. github push时提示Username for ‘https://github.com‘ 解决办法
  4. 和熊二一起捣鼓spark系列之闲聊篇
  5. 搞怪独特的520文案表情包分享来啦
  6. 利用Python开发智能阅卷系统, 太有趣了!
  7. Java 线程池 ThreadPoolExecutor 八种拒绝策略浅析
  8. 计算机eq7怎么算标准差,精密坐标测量中小段圆弧的一种评价方法.pdf
  9. 用matlab绘制克莱因瓶,用SolidWorks只需4个特征,便可画成一个漂亮的克莱因瓶子...
  10. AOS美国万代半导体和CQAOS重庆万国半导体两家公司有何关联?