Python 异步爬虫 aiohttp 示例
时间:2021-08-11
本文章向大家介绍Python 异步爬虫 aiohttp 示例,主要包括Python 异步爬虫 aiohttp 示例使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
1、写在前面
之前一篇随笔记录了异步的个人理解 https://www.cnblogs.com/rainbow-tan/p/15081118.html
之前随笔异步都是以asyncio.sleep()来进行异步操作的演示,下面代码具体演示了一次异步爬虫
2、使用的异步爬虫库为 aiohttp
演示功能:
爬取 https://wall.alphacoders.com/ 中的小图片,进行批量下载,进行下载用时的对比
(1)先用一般的requests库进行爬虫演示,查看运行的时间
import os import time import requests from bs4 import BeautifulSoup def get_html(url): ret = requests.get(url) return ret if __name__ == '__main__': index = 0 start = time.time() response = get_html('https://wall.alphacoders.com/') soup = BeautifulSoup(response.text, 'lxml') boxgrids = soup.find_all(class_='boxgrid') for boxgrid in boxgrids: img = boxgrid.find('a').find('picture').find('img') link = img.attrs['src'] content = get_html(link).content picture_type = str(link).split('.')[-1] index += 1 path = os.path.abspath('imgs') if not os.path.exists(path): os.makedirs(path) with open('{}/{}.{}'.format(path, index, picture_type), 'wb') as f: f.write(content) end = time.time() print(f'下载完成{index}个图片,用时:{end - start}秒')
运行
用时14秒,下载30个图片
(2)使用异步库aiohttp下载
import asyncio import os import time import aiohttp from aiohttp import TCPConnector from bs4 import BeautifulSoup async def get_html(url): async with aiohttp.ClientSession( connector=TCPConnector(verify_ssl=False)) as session: async with session.get(url) as resp: text = await resp.text() soup = BeautifulSoup(text, 'lxml') boxgrids = soup.find_all(class_='boxgrid') links = [] for boxgrid in boxgrids: img = boxgrid.find('a').find('picture').find('img') link = img.attrs['src'] links.append(link) return links async def write_file(url, index): async with aiohttp.ClientSession( connector=TCPConnector(verify_ssl=False)) as session: async with session.get(url) as resp: text = await resp.read() path = os.path.abspath('images') if not os.path.exists(path): os.makedirs(path) with open(f'{path}/{index}.{str(url).split(".")[-1]}', 'wb') as f: f.write(text) if __name__ == '__main__': index = 0 start = time.time() loop = asyncio.get_event_loop() task = loop.create_task(get_html('https://wall.alphacoders.com/')) links = loop.run_until_complete(task) tasks = [] for link in links: tasks.append(write_file(link, index)) index += 1 loop.run_until_complete(asyncio.gather(*tasks)) end = time.time() print(f'下载完成{index}个图片,用时:{end - start}秒')
运行
下载30个图片,用时4秒
学习链接 :
https://www.jianshu.com/p/20ca9daba85f
https://docs.aiohttp.org/en/stable/client_quickstart.html
https://juejin.cn/post/6857140761926828039 (这个未参考,但是看起来也很牛,收藏一下)
原文地址:https://www.cnblogs.com/rainbow-tan/p/15130054.html
- Redis知识点速查
- 上传伪技术~很多人都以为判断了后缀,判断了ContentType,判断了头文件就真的安全了。是吗?
- SpringBoot的微信点餐系统后台开发要点
- 【LeetCode 463】 关关的刷题日记29 Island Perimeter
- 搭建移动端的跨平台开发环境
- 30分钟全面解析-SQL事务+隔离级别+阻塞+死锁
- 【最新TensorFlow1.4.0教程03】利用Eager Execution构建和训练卷积神经网络(CNN)
- 360护心镜脚本分析及N种绕过方式
- 清北集训Day6T1(生成函数)
- 变种XSS:持久控制
- 洛谷P1291 [SHOI2002]百事世界杯之旅(期望DP)
- 新型XSS总结两则
- 设计一个有getMin功能的栈
- BZOJ4832: [Lydsy1704月赛]抵制克苏恩(期望DP)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- JavaScript 技术篇-js代码获取当前操作系统信息、浏览器版本信息实例演示,windows NT版本对照表
- Oracle 数据库impdp导入数据库版本和dmp数据库文件版本不匹配问题解决方法,ORA-39142版本号不兼容、ORA-39000转储文件说明错误解决方法
- 实践总结:基于Kbone使用React同构开发小程序
- BAT 批处理命令 - 实现输出当前文件夹下的所有文件夹名的功能实例演示
- Python+Selenium 自动化-指定chrome驱动运行selenium实例演示,运行指定位置下的浏览器驱动
- Linux 命令查找指定文件夹下符合查询条件的文件和文件夹实例演示
- 用Python实现一个最新QQ办公版(TIM)的登录界面
- Oracle 数据库直接执行本地sql文件、sql脚本实例演示
- Oracle 数据库利用回收站恢复删除的表实例演示
- Linux 命令利用scp实现从服务器共享地址上传下载文件、文件夹实例演示,scp命令的参数详解
- Oracle 数据库利用sql语句判断某个表是否是临时表实例演示,达梦数据库查询出所有临时表
- JavaScript 技术篇-一段js代码展示可以随鼠标移动变换样式的卡通人物,动态女生眼睛跟着鼠转动
- PyQt5 图形界面-用Qt Designer来设计UI界面,并转化为python代码运行
- Python 技术篇-python生成html源码功能实现演示,html代码自动生成技巧。列表生成式的灵活应用。
- Python 技术篇-pyHook键盘鼠标监听事件,监测鼠标键盘按键。超简单,几行代码搞定。