asyncio是从pytohn3.4开始添加到标准库中的一个强大的异步并发库,可以很好地解决python中高并发的问题,入门学习可以参考官方文档

并发访问能极大的提高爬虫的性能,但是requests访问网页是阻塞的,无法并发,所以我们需要一个更牛逼的库 aiohttp ,它的用法与requests相似,可以看成是异步版的requests,下面通过实战爬取猫眼电影专业版来熟悉它们的使用:

1. 分析

分析网页源代码发现猫眼专业版是一个动态网页,其中的数据都是后台传送的,打开F12调试工具,再刷新网页选择XHR后发现第一条就是后台发来的电影数据,由此得到接口 https://box.maoyan.com/promovie/api/box/second.json?beginDate=日期

2. 异步爬取

创建20个任务来并发爬取20天的电影信息并写入csv文件,同时计算一下耗费的时间:

import asyncio
from aiohttp import ClientSession
import time
import csvheaders = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) ''AppleWebKit/537.36 (KHTML, like Gecko) ''Chrome/67.0.3396.99 Safari/537.36'}# 协程函数,完成一个无阻塞的任务
async def get_one_page(url):try:async with ClientSession() as session:async with session.get(url, headers=headers) as r:# 返回解析为字典的电影数据return await r.json()except Exception as e:print('请求异常: ' + str(e))return {}# 解析函数,提取每一条内容并写入csv文件
def parse_one_page(movie_dict, writer):try:movie_list = movie_dict['data']['list']for movie in movie_list:movie_name = movie['movieName']release = movie['releaseInfo']sum_box = movie['sumBoxInfo']box_info = movie['boxInfo']box_rate = movie['boxRate']show_info = movie['showInfo']show_rate = movie['showRate']avg_show_view = movie['avgShowView']avg_seat_view = movie['avgSeatView']writer.writerow([movie_name, release, sum_box, box_info, box_rate,show_info, show_rate, avg_show_view, avg_seat_view])return '写入成功'except Exception as e:return '解析异常: ' + str(e)# 并发爬取
async def main():# 待访问的20个URL链接urls = ['https://box.maoyan.com/promovie/api/box/second.json?beginDate=201904{}{}'.format(i, j) for i in range(1, 3) for j in range(10)]# 任务列表tasks = [get_one_page(url) for url in urls]# 并发执行并保存每一个任务的返回结果results = await asyncio.gather(*tasks)# 处理每一个结果with open('out/pro_info.csv', 'w') as f:writer = csv.writer(f)for result in results:print(parse_one_page(result, writer))if __name__ == "__main__":start = time.time()asyncio.run(main())# python3.7之前的写法# loop = asyncio.get_event_loop()# loop.run_until_complete(main())# loop.close()print(time.time()-start)


用时0.15秒!

3. 对比同步爬取

import requests
import csv
import timeheaders = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) ''AppleWebKit/537.36 (KHTML, like Gecko) ''Chrome/67.0.3396.99 Safari/537.36'}def get_one_page(url):try:r = requests.get(url, headers=headers)r.raise_for_status()r.encoding = r.apparent_encodingreturn r.json()except Exception as e:print('请求异常: ' + e)return {}def parse_one_page(movie_dict, writer):try:movie_list = movie_dict['data']['list']for movie in movie_list:movie_name = movie['movieName']release = movie['releaseInfo']sum_box = movie['sumBoxInfo']box_info = movie['boxInfo']box_rate = movie['boxRate']show_info = movie['showInfo']show_rate = movie['showRate']avg_show_view = movie['avgShowView']avg_seat_view = movie['avgSeatView']writer.writerow([movie_name, release, sum_box, box_info, box_rate,show_info, show_rate, avg_show_view, avg_seat_view])print('写入成功')except Exception as e:print('解析异常: ' + e)def main():# 待访问的20个URL链接urls = ['https://box.maoyan.com/promovie/api/box/second.json?beginDate=201903{}{}'.format(i, j) for i in range(1, 3) for j in  range(10)]with open('out/pro_info.csv', 'w') as f:writer = csv.writer(f)for url in urls:# 逐一处理movie_dict = get_one_page(url)parse_one_page(movie_dict, writer)if __name__ == '__main__':a = time.time()main()print(time.time() - a)

可以看到使用asyncio+aiohttp的异步爬取方式要比简单的requests同步爬取快上不少,尤其是爬取大量网页的时候,这种差距会非常明显。

Python使用asyncio+aiohttp异步爬取猫眼电影专业版相关推荐

  1. python战反爬虫:爬取猫眼电影数据 (一)(Requests, BeautifulSoup, MySQLdb,re等库)

    姓名:隋顺意 博客:Sui_da_xia 微信名:世界上的霸主 本篇文章未涉及猫眼反爬,主要介绍爬取无反爬内容,战反爬内容请去 python战反爬虫:爬取猫眼电影数据 (二)(Requests, Be ...

  2. python战反爬虫:爬取猫眼电影数据 (二)(Requests, BeautifulSoup, MySQLdb,re等库)

    姓名:隋顺意 博客:Sui_da_xia 微信名:世界上的霸主 本文主要介绍破解反爬,可以先去上一篇观看爬取无反爬内容 python战反爬虫:爬取猫眼电影数据 (一)(Requests, Beauti ...

  3. python战反爬虫:爬取猫眼电影数据 (一)

    非常荣幸邀请到 赛迪人工智能大赛(简称AI世青赛)全球总决赛银奖的获得者 隋顺意 小朋友为本公众号投稿,隋小朋友虽然小小年纪,但编程能力已经比大多数大学生强非常多了,欢迎大家关注,捧场. 姓名:隋顺意 ...

  4. 爬取猫眼电影专业版实时数据排行榜

    这是一个爬取猫眼电影专业版实时排行榜的代码. #猫眼电影实时爬取 #2017/8/1 import os import requests import json import time import ...

  5. Python爬虫实战Pro | (1) 爬取猫眼电影Top100榜单

    在本篇博客中,我们将使用requests+正则表达式来爬取猫眼电影官网的TOP100电影榜单,获取每部电影的序号,片名,主演,上映日期,评分和封面等内容. 之前在Python爬虫实战(1)中我们曾爬取 ...

  6. 猫眼电影票房爬取到MySQL中_爬虫之爬取猫眼电影专业版实时数据排行榜

    猫眼电影专业版实时数据排行榜是个持续更新的用ajax写成的网站,一般而言,爬取它比较麻烦,需要使用ajax/js进行爬取,python中的requests库可以获取网站的ajax,再通过json库解析 ...

  7. 利用正则表达式爬取猫眼电影TOP100信息

    本文利用requests库和正则表达式爬取了猫眼电影TOP100电影信息,并将电影封面和标题.主演等文字信息保存在了本地.本文完整代码链接:https://github.com/iapcoder/Ma ...

  8. 【爬虫】学习:aiohttp异步爬取

    GitHub 参考:<python3网络爬虫开发实战第二版>--6.3 aiohttp异步爬取 官方文档:aiohttp(客户端)--用于 asyncio 和 Python 的异步 HTT ...

  9. python爬虫实战之异步爬取数据

    python爬虫实战之异步爬取数据 文章目录 前言 一.需求 二.使用步骤 1.思路 2.引入库 3.代码如下 总结 前言 python中异步编程的主要三种方法:回调函数.生成器函数.线程大法. 以进 ...

最新文章

  1. java jni调用dll文件_Java通过jni调用动态链接库
  2. ??征集Sql Server2005设置Windows集成认证资料
  3. Redis持久化实践及数据恢复
  4. 《Windows via C/C++》学习笔记 —— Windows 线程池
  5. 一个自己写的有关数据库的treeview.
  6. KVM脚本批量添加删除虚拟机
  7. 模型监控psi_PSI和CSI:前2个模型监控指标
  8. P5502 [JSOI2015]最大公约数(gcd性质/min性质/分治)
  9. leetcode 304. 二维区域和检索 - 矩阵不可变(前缀和)
  10. 可视化卷积神经网络的过滤器
  11. 音视频转换器哪个好?嗨格式视频转换器来了
  12. 公民住宅权不可侵犯!为阻强拆致人重伤,属正当防卫
  13. Android应用 开机自启动
  14. java pow_Java pow()方法
  15. ModuleNotFoundError: No module named ‘tensorflow‘
  16. C# 通过RS-232 读取 34401A万用表电压
  17. 如何在linux执行PHP文件
  18. BadgeView使用介绍
  19. 怎样在视频画面指定位置编辑马赛克
  20. 武大计算机保研北大,17名北大毕业生保研到武大?网友说亏大了,其实这些学生赚大了!...

热门文章

  1. 综合评价与决策方法01——理想解法
  2. php算html语言吗,为何说PHP 是一种 HTML 内嵌式的语言
  3. Juphoon RCS年度成绩单,请查收!
  4. python编程练习:提取Visual MODFLOW水均衡数据(.ZOT)文件至表格
  5. 冲正交易是属于TCC模式么
  6. ojbk的sas proc 过程之freq
  7. 专业程序设计part2
  8. 知识普及篇——动手做foc无刷电机电子调速器
  9. 《机器学习》慕课版课后习题-第5章
  10. 实现类似IE的松散耦合(Loosely-Coupled )效果——Window Tabifier