Python使用asyncio+aiohttp异步爬取猫眼电影专业版
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异步爬取猫眼电影专业版相关推荐
- python战反爬虫:爬取猫眼电影数据 (一)(Requests, BeautifulSoup, MySQLdb,re等库)
姓名:隋顺意 博客:Sui_da_xia 微信名:世界上的霸主 本篇文章未涉及猫眼反爬,主要介绍爬取无反爬内容,战反爬内容请去 python战反爬虫:爬取猫眼电影数据 (二)(Requests, Be ...
- python战反爬虫:爬取猫眼电影数据 (二)(Requests, BeautifulSoup, MySQLdb,re等库)
姓名:隋顺意 博客:Sui_da_xia 微信名:世界上的霸主 本文主要介绍破解反爬,可以先去上一篇观看爬取无反爬内容 python战反爬虫:爬取猫眼电影数据 (一)(Requests, Beauti ...
- python战反爬虫:爬取猫眼电影数据 (一)
非常荣幸邀请到 赛迪人工智能大赛(简称AI世青赛)全球总决赛银奖的获得者 隋顺意 小朋友为本公众号投稿,隋小朋友虽然小小年纪,但编程能力已经比大多数大学生强非常多了,欢迎大家关注,捧场. 姓名:隋顺意 ...
- 爬取猫眼电影专业版实时数据排行榜
这是一个爬取猫眼电影专业版实时排行榜的代码. #猫眼电影实时爬取 #2017/8/1 import os import requests import json import time import ...
- Python爬虫实战Pro | (1) 爬取猫眼电影Top100榜单
在本篇博客中,我们将使用requests+正则表达式来爬取猫眼电影官网的TOP100电影榜单,获取每部电影的序号,片名,主演,上映日期,评分和封面等内容. 之前在Python爬虫实战(1)中我们曾爬取 ...
- 猫眼电影票房爬取到MySQL中_爬虫之爬取猫眼电影专业版实时数据排行榜
猫眼电影专业版实时数据排行榜是个持续更新的用ajax写成的网站,一般而言,爬取它比较麻烦,需要使用ajax/js进行爬取,python中的requests库可以获取网站的ajax,再通过json库解析 ...
- 利用正则表达式爬取猫眼电影TOP100信息
本文利用requests库和正则表达式爬取了猫眼电影TOP100电影信息,并将电影封面和标题.主演等文字信息保存在了本地.本文完整代码链接:https://github.com/iapcoder/Ma ...
- 【爬虫】学习:aiohttp异步爬取
GitHub 参考:<python3网络爬虫开发实战第二版>--6.3 aiohttp异步爬取 官方文档:aiohttp(客户端)--用于 asyncio 和 Python 的异步 HTT ...
- python爬虫实战之异步爬取数据
python爬虫实战之异步爬取数据 文章目录 前言 一.需求 二.使用步骤 1.思路 2.引入库 3.代码如下 总结 前言 python中异步编程的主要三种方法:回调函数.生成器函数.线程大法. 以进 ...
最新文章
- java jni调用dll文件_Java通过jni调用动态链接库
- ??征集Sql Server2005设置Windows集成认证资料
- Redis持久化实践及数据恢复
- 《Windows via C/C++》学习笔记 —— Windows 线程池
- 一个自己写的有关数据库的treeview.
- KVM脚本批量添加删除虚拟机
- 模型监控psi_PSI和CSI:前2个模型监控指标
- P5502 [JSOI2015]最大公约数(gcd性质/min性质/分治)
- leetcode 304. 二维区域和检索 - 矩阵不可变(前缀和)
- 可视化卷积神经网络的过滤器
- 音视频转换器哪个好?嗨格式视频转换器来了
- 公民住宅权不可侵犯!为阻强拆致人重伤,属正当防卫
- Android应用 开机自启动
- java pow_Java pow()方法
- ModuleNotFoundError: No module named ‘tensorflow‘
- C# 通过RS-232 读取 34401A万用表电压
- 如何在linux执行PHP文件
- BadgeView使用介绍
- 怎样在视频画面指定位置编辑马赛克
- 武大计算机保研北大,17名北大毕业生保研到武大?网友说亏大了,其实这些学生赚大了!...