Python中利用aiohttp制作异步爬虫及简单应用


Posted in Python onNovember 29, 2018

摘要: 简介 asyncio可以实现单线程并发IO操作,是Python中常用的异步处理模块。关于asyncio模块的介绍,笔者会在后续的文章中加以介绍,本文将会讲述一个基于asyncio实现的HTTP框架——aiohttp,它可以帮助我们异步地实现HTTP请求,从而使得我们的程序效率大大提高。

简介

asyncio可以实现单线程并发IO操作,是Python中常用的异步处理模块。关于asyncio模块的介绍,笔者会在后续的文章中加以介绍,本文将会讲述一个基于asyncio实现的HTTP框架——aiohttp,它可以帮助我们异步地实现HTTP请求,从而使得我们的程序效率大大提高。

本文将会介绍aiohttp在爬虫中的一个简单应用。

在原来的项目中,我们是利用Python的爬虫框架scrapy来爬取当当网图书畅销榜的图书信息的。在本文中,笔者将会以两种方式来制作爬虫,比较同步爬虫与异步爬虫(利用aiohttp实现)的效率,展示aiohttp在爬虫方面的优势。

同步爬虫

首先,我们先来看看用一般的方法实现的爬虫,即同步方法,完整的Python代码如下:

'''
同步方式爬取当当畅销书的图书信息
'''
import time
import requests
import pandas as pd
from bs4 import BeautifulSoup
# table表格用于储存书本信息
table = []
# 处理网页
def download(url):
html = requests.get(url).text
# 利用BeautifulSoup将获取到的文本解析成HTML
soup = BeautifulSoup(html, "lxml")
# 获取网页中的畅销书信息
book_list = soup.find('ul', class_="bang_list clearfix bang_list_mode")('li')
for book in book_list:
info = book.find_all('div')
# 获取每本畅销书的排名,名称,评论数,作者,出版社
rank = info[0].text[0:-1]
name = info[2].text
comments = info[3].text.split('条')[0]
author = info[4].text
date_and_publisher = info[5].text.split()
publisher = date_and_publisher[1] if len(date_and_publisher) >= 2 else ''
# 将每本畅销书的上述信息加入到table中
table.append([rank, name, comments, author, publisher])
# 全部网页
urls = ['http://bang.dangdang.com/books/bestsellers/01.00.00.00.00.00-recent7-0-0-1-%d' % i for i in range(1, 26)]
# 统计该爬虫的消耗时间
print('#' * 50)
t1 = time.time() # 开始时间
for url in urls:
download(url)
# 将table转化为pandas中的DataFrame并保存为CSV格式的文件
df = pd.DataFrame(table, columns=['rank', 'name', 'comments', 'author', 'publisher'])
df.to_csv('E://douban/dangdang.csv', index=False)
t2 = time.time() # 结束时间
print('使用一般方法,总共耗时:%s' % (t2 - t1))
print('#' * 50)

输出结果如下:

##################################################
使用一般方法,总共耗时:23.522345542907715
##################################################

程序运行了23.5秒,爬取了500本书的信息,效率还是可以的。我们前往目录中查看文件,如下:

Python中利用aiohttp制作异步爬虫及简单应用

异步爬虫

接下来我们看看用aiohttp制作的异步爬虫的效率,完整的源代码如下:

'''
异步方式爬取当当畅销书的图书信息
'''
import time
import aiohttp
import asyncio
import pandas as pd
from bs4 import BeautifulSoup
# table表格用于储存书本信息
table = []
# 获取网页(文本信息)
async def fetch(session, url):
async with session.get(url) as response:
return await response.text(encoding='gb18030')
# 解析网页
async def parser(html):
# 利用BeautifulSoup将获取到的文本解析成HTML
soup = BeautifulSoup(html, "lxml")
# 获取网页中的畅销书信息
book_list = soup.find('ul', class_="bang_list clearfix bang_list_mode")('li')
for book in book_list:
info = book.find_all('div')
# 获取每本畅销书的排名,名称,评论数,作者,出版社
rank = info[0].text[0:-1]
name = info[2].text
comments = info[3].text.split('条')[0]
author = info[4].text
date_and_publisher = info[5].text.split()
publisher = date_and_publisher[1] if len(date_and_publisher) >=2 else ''
# 将每本畅销书的上述信息加入到table中
table.append([rank,name,comments,author,publisher])
# 处理网页
async def download(url):
async with aiohttp.ClientSession() as session:
html = await fetch(session, url)
await parser(html)
# 全部网页
urls = ['http://bang.dangdang.com/books/bestsellers/01.00.00.00.00.00-recent7-0-0-1-%d'%i for i in range(1,26)]
# 统计该爬虫的消耗时间
print('#' * 50)
t1 = time.time() # 开始时间
# 利用asyncio模块进行异步IO处理
loop = asyncio.get_event_loop()
tasks = [asyncio.ensure_future(download(url)) for url in urls]
tasks = asyncio.gather(*tasks)
loop.run_until_complete(tasks)
# 将table转化为pandas中的DataFrame并保存为CSV格式的文件
df = pd.DataFrame(table, columns=['rank','name','comments','author','publisher'])
df.to_csv('E://douban/dangdang.csv',index=False)
t2 = time.time() # 结束时间
print('使用aiohttp,总共耗时:%s' % (t2 - t1))
print('#' * 50)

我们可以看到,这个爬虫与原先的一般方法的爬虫的思路和处理方法基本一致,只是在处理HTTP请求时使用了aiohttp模块以及在解析网页时函数变成了协程(coroutine),再利用aysncio进行并发处理,这样无疑能够提升爬虫的效率。它的运行结果如下:

##################################################
使用aiohttp,总共耗时:2.405137538909912
##################################################

2.4秒,如此神奇!!!再来看看文件的内容:

Python中利用aiohttp制作异步爬虫及简单应用

总结

综上可以看出,利用同步方法和异步方法制作的爬虫的效率相差很大,因此,我们在实际制作爬虫的过程中,也不妨可以考虑异步爬虫,多多利用异步模块,如aysncio, aiohttp。另外,aiohttp只支持3.5.3以后的Python版本。

Python 相关文章推荐
python在Windows8下获取本机ip地址的方法
Mar 14 Python
用C++封装MySQL的API的教程
May 06 Python
Python字典,函数,全局变量代码解析
Dec 18 Python
python爬虫爬取淘宝商品信息(selenum+phontomjs)
Feb 24 Python
Python开发之Nginx+uWSGI+virtualenv多项目部署教程
May 13 Python
简单了解python gevent 协程使用及作用
Jul 22 Python
python获取全国城市pm2.5、臭氧等空气质量过程解析
Oct 12 Python
解决python图像处理图像赋值后变为白色的问题
Jun 04 Python
python 获取字典特定值对应的键的实现
Sep 29 Python
scrapy实践之翻页爬取的实现
Jan 05 Python
python 窃取摄像头照片的实现示例
Jan 08 Python
Django 如何实现文件上传下载
Apr 08 Python
Python中logging.NullHandler 的使用教程
Nov 29 #Python
Mac下Anaconda的安装和使用教程
Nov 29 #Python
windows7 32、64位下python爬虫框架scrapy环境的搭建方法
Nov 29 #Python
解决pycharm py文件运行后停止按钮变成了灰色的问题
Nov 29 #Python
pycharm debug功能实现跳到循环末尾的方法
Nov 29 #Python
在PyCharm下打包*.py程序成.exe的方法
Nov 29 #Python
selenium设置proxy、headers的方法(phantomjs、Chrome、Firefox)
Nov 29 #Python
You might like
PHP 裁剪图片成固定大小代码方法
2009/09/09 PHP
屏蔽机器人从你的网站搜取email地址的php代码
2012/11/14 PHP
使用php伪造referer的方法 利用referer防止图片盗链
2014/01/20 PHP
PHP实现简单实用的验证码类
2015/07/29 PHP
用js实现层随着内容大小动态渐变改变 推荐
2009/12/19 Javascript
jQuery+css实现图片滚动效果(附源码)
2013/03/18 Javascript
Jquery响应回车键直接提交表单操作代码
2014/07/25 Javascript
jQuery表单域属性过滤器用法分析
2015/02/10 Javascript
SWFObject基本用法实例分析
2015/07/20 Javascript
jquery实现弹出层登录和全屏层注册特效
2015/08/28 Javascript
微信小程序 for 循环详解
2016/10/09 Javascript
基于LayUI分页和LayUI laypage分页的使用示例
2017/08/02 Javascript
vue.js删除列表中的一行
2018/06/30 Javascript
实例详解BootStrap的动态模态框及静态模态框
2018/08/13 Javascript
vue-cli3跨域配置的简单方法
2019/09/06 Javascript
layui button 按钮弹出提示窗口,确定才进行的方法
2019/09/06 Javascript
Angular单元测试之事件触发的实现
2020/01/20 Javascript
[00:32]2018DOTA2亚洲邀请赛iG出场
2018/04/03 DOTA
Python中title()方法的使用简介
2015/05/20 Python
Python中unittest模块做UT(单元测试)使用实例
2015/06/12 Python
import的本质解析
2017/10/30 Python
浅析python中numpy包中的argsort函数的使用
2018/08/30 Python
transform python环境快速配置方法
2018/09/27 Python
python利用dlib获取人脸的68个landmark
2019/11/27 Python
Python遍历字典方式就实例详解
2019/12/28 Python
Python logging日志库空间不足问题解决
2020/09/14 Python
Python实现七个基本算法的实例代码
2020/10/08 Python
美国卡车、吉普车和SUV零件网站:4 Wheel Parts
2016/11/24 全球购物
Belstaff英国官方在线商店:Belstaff.co.uk
2021/02/09 全球购物
给老师的检讨书
2014/02/11 职场文书
工艺工程师岗位职责
2014/03/04 职场文书
高一学生期末评语
2014/04/25 职场文书
优秀少先队辅导员先进事迹材料
2014/05/18 职场文书
演讲比赛策划方案
2014/06/11 职场文书
合作经营协议书范本
2014/09/16 职场文书
Pytorch中的学习率衰减及其用法详解
2021/06/05 Python