# 如何提升requests模块爬取数据的效率?- 多进程或多线程(不建议)  太耗费资源- 线程池或进程池(适当使用) - 单线程 + 异步协程(推荐)
# 线程池使用案例
# 梨视频 下载作业
import random
from lxml import etree
from multiprocessing.dummy import Pool  # 线程
import requests
import reurl = 'https://www.pearvideo.com/category_3'
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.81 Safari/537.36'}
page_text = requests.get(url=url, headers=headers).texttree = etree.HTML(page_text)
all_video = tree.xpath('//ul[@id="listvideoListUl"]/li/div/a/@href')
mp4_list = []
for video in all_video:video_url = 'https://www.pearvideo.com/%s' % videopage_video = requests.get(url=video_url, headers=headers).texttree = etree.HTML(page_video)name1 = tree.xpath('//*[@id="detailsbd"]/div[1]/div[2]/div/div[1]/h1/text()')[0]mp4_url = re.findall('srcUrl="(.*?)",vdoUrl', page_video, re.S)[0]mp4_list.append(mp4_url)pool = Pool(4)  # 将耗时严重的任务异步处理,实例化一个线程池对象# 视频二进制流获取
def mp4_request(url):return requests.get(url=url, headers=headers).content# 数据持久化存储
def mp4_save(mp4_data):name = str(random.randint(0,9999))+'.mp4' # 随机生成namewith open("./%s.mp4" % name, 'wb') as f:f.write(mp4_data)print(name, ',download ok')mp4_data_list = pool.map(mp4_request, mp4_list) # 获取二进制流
pool.map(mp4_save, mp4_data_list)  # data持久化存储print('Task is OK!') # 任务结束的提醒pool.close() #关闭线程池

# 下面是 带真实名字的版本
from lxml import etree
from multiprocessing.dummy import Pool
import requests
import reurl = 'https://www.pearvideo.com/category_3'
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.81 Safari/537.36'}
page_text = requests.get(url=url, headers=headers).texttree = etree.HTML(page_text)
all_video = tree.xpath('//ul[@id="listvideoListUl"]/li/div/a/@href')
mp4_list = []
for video in all_video:video_url = 'https://www.pearvideo.com/%s' % videopage_video = requests.get(url=video_url, headers=headers).texttree = etree.HTML(page_video)name = tree.xpath('//*[@id="detailsbd"]/div[1]/div[2]/div/div[1]/h1/text()')[0]mp4_url = re.findall('srcUrl="(.*?)",vdoUrl', page_video, re.S)[0]mp4_list.append({name:mp4_url})mp4_list = mp4_list[2:]
print(mp4_list)
pool = Pool(4)  # 将耗时的任务异步处理,实例化一个线程池对象# 视频二进制流获取
def mp4_request(url):return {list(url.keys())[0]:requests.get(url=list(url.values())[0], headers=headers).content}# 数据持久化存储
def mp4_save(mp4_data):with open("./%s.mp4" % list(mp4_data.keys())[0], 'wb') as f:f.write(list(mp4_data.values())[0])print(list(mp4_data.keys())[0], ',download ok')mp4_data_list = pool.map(mp4_request, mp4_list) # 获取二进制流
pool.map(mp4_save, mp4_data_list)  # data持久化存储print('Task is OK!')

# --  下面内容都是异步的内容  -- 
# 基本使用
# 异步轮询的执行
import asyncio
async def hello(name):print('hello to:',name)
c = hello('zc')#调用 返回协程对象<coroutine协程 object hello at 0x0000000005EDDE08>
# 创建一个事件循环对象
loop = asyncio.get_event_loop()
# 将协程对象注册到事件循环中,然后启动事件循环对象
loop.run_until_complete(c)  # 输出hello to: zc

# task 的使用   单任务协程
import asyncio
async def hello(name):print('hello to:',name)
c = hello('zc')
# 创建一个事件循环对象
loop = asyncio.get_event_loop()
# 就协程进行进一步封装,封装到了task对象中
task = loop.create_task(c)
print(task)
loop.run_until_complete(task)
print(task)

# future 的使用
import asyncio
async def hello(name):print('hello to:',name)
c = hello('zc')
loop = asyncio.get_event_loop()
task = asyncio.ensure_future(c)
print(task)
loop.run_until_complete(task)
print(task)

# furure 绑定回调import asyncio
def callback(task):  # 回调函数print('I am callback', task.result())async def hello(name):print('hello to:', name)return namec = hello('zc')
loop = asyncio.get_event_loop()  # 创建loop实例
task = asyncio.ensure_future(c)  #
print(task)
task.add_done_callback(callback) # 添加要执行的回调函数
loop.run_until_complete(task)    # 当任务设定完成开始执行
print(task)

# 爬虫中应用多任务异步操作
# 支持异步的网络请求的模块  pip install aiohttp
import asyncio
import aiohttp
import timeasync def get_page(url):async with aiohttp.ClientSession() as session:async with await session.get(url=url) as response:page_text = await response.text()  # read() 二进制形式的响应数据,json()  print('响应数据:',page_text)       # print('ok %s'%url)
start = time.time()
urls = ['http://127.0.0.1:5000/bobo','http://127.0.0.1:5000/jay','http://127.0.0.1:5000/tom',
]
tasks = []  #任务列表 放置多个任务对象
loop = asyncio.get_event_loop()
for url in urls: c = get_page(url)task = asyncio.ensure_future(c)tasks.append(task)
# 将多个任务对象对应的列表注册到事件循环中
loop.run_until_complete(asyncio.wait(tasks))
print('总耗时',time.time()-start)
# --  下面是输出结果 --
# downloading http://127.0.0.1:5000/bobo
# downloading http://127.0.0.1:5000/jay
# downloading http://127.0.0.1:5000/tom
# 下载 ok http://127.0.0.1:5000/bobo
# 下载 ok http://127.0.0.1:5000/jay
# 下载 ok http://127.0.0.1:5000/tom
# 总耗时 2.0021142959594727
# 基于python的flask框架实现的简单的Web服务器,代码:
from flask import Flask
import timeapp = Flask(__name__)@app.route('/bobo')
def index_bobo():time.sleep(2)return 'Hello bobo'@app.route('/jay')
def index_jay():time.sleep(2)return 'Hello jay'@app.route('/tom')
def index_tom():time.sleep(2)return 'Hello tom'if __name__ == '__main__':app.run(threaded=True)

# 真实网站请求的 高性能异步IO
import asyncio
import aiohttp
import timeasync def get_page(url):async with aiohttp.ClientSession() as session:async with await session.get(url=url) as response:page_text = await response.text()  # read() 二进制形式的响应数据,json()# print('响应数据:',page_text)print('ok %s'%url)
start = time.time()
urls = ['https://baidu.com','https://y.qq.com','https://www.taobao.com',
]
tasks = []  #任务列表 放置多个任务对象
loop = asyncio.get_event_loop()
for url in urls:c = get_page(url)task = asyncio.ensure_future(c)tasks.append(task)
# 将多个任务对象对应的列表注册到事件循环中
loop.run_until_complete(asyncio.wait(tasks))
print('总耗时',time.time()-start)

0 and False  => 0
0 or False    => False

转载于:https://www.cnblogs.com/zhangchen-sx/p/10818591.html

5 爬虫 异步协程 梨视频相关推荐

  1. python爬虫02-提升爬取效率、多线程,多线程传参,多进程,线程及线程池概念,协程,多任务异步协程,异步请求aiohttp模块,视频站工作原理

    1.提升爬取效率 使用多线程,多进程,携程,异步 2.多线程 进程是资源单位,每个进程,都会有一个默认的主线程 线程是执行单位 执行多线程需要导包: from threading import Thr ...

  2. python获取get请求的耗时时间_突破python爬取极限,超牛逼的异步协程爬虫

    异步协程 1. event_loop 2. coroutine 中文翻译叫协程,在 Python 中昌指代为协程对象类型,可以将协程对象注册到时间循环中被调用.使用 async 关键字来定义的方法在调 ...

  3. 小爬爬4.协程基本用法多任务异步协程爬虫示例(大数据量)

    1.测试学习 (2)单线程: from time import sleep import time def request(url):print('正在请求:',url)sleep(2)print(' ...

  4. 超牛逼的异步协程爬虫

    写在前面: 本来这篇文章只是用来记录一下学习异步协程爬虫的笔记,感谢CSDN的大力支持,引来了很多关注和浏览,也有很多大佬的批评指针. 事先声明:本文只是学习使用,在爬虫的实战应用中还要添加诸多限制, ...

  5. 爬虫的单线程+多任务异步协程:asyncio 3.6

    单线程+多任务异步协程:asyncio 3.6 事件循环 无限循环的对象.事件循环中最终需要将一些 特殊的函数(被async关键字修饰的函数) 注册在该对象中. 协程 本质上是一个对象.可以把协程对象 ...

  6. python爬虫 asyncio aiohttp aiofiles 单线程多任务异步协程爬取图片

    python爬虫 asyncio aiohttp aiofiles 多任务异步协程爬取图片 main.py """=== coding: UTF8 ==="&q ...

  7. python爬虫 单线程的多任务异步协程

    在input().sleep(2).request.get()等时,都会导致线程阻塞,协程可以解决IO等操作时的阻塞现象,提高CPU利用效率. 1.单线程的多任务异步协程 main.py " ...

  8. 爬虫第四章 单线程+多任务异步协程

    单线程+多任务异步协程: asyncio 事件循环 loop: 无限循环的对象,事件循环中最终需要将一些特殊的函数注册到该事件循环中特殊的函数: 被ansyc关键字修饰的函数协程: 本质上是一个对象, ...

  9. python 异步协程爬虫-半次元图片

    python 异步协程爬虫-半次元图片 1. 页面分析 2.代码大体构思 3.源码分析 3.1 完成效果 4.异步协程的优势 5.难点分析 6.可扩展性 欢迎私信或评论区交流 爬取网址 : https ...

最新文章

  1. 关于Jvm知识看这一篇就够了
  2. 配置VMware ESXi 5事件发送到SYSLOG服务器
  3. linux进程隐藏 hook readdir函数 挂载覆盖/proc/pid 目录
  4. java (10) 集合类
  5. wchar_t*,wchar_t,wchat_t数组,char,char*,char数组,std::string,std::wstring,CString 以及system(command)...
  6. 练习5 键盘输入一个年份 判断年份 是否为闰年
  7. thinkphp6企业项目实战_[MarsZ]ThinkPHP项目实战总结
  8. ds哈希查找—二次探测再散列_大白话之哈希表和哈希算法
  9. 离线使用iPhone SDK文档的方法
  10. JavaScript数组对象简介及其常用方法介绍
  11. 此页的状态信息无效,可能已损坏。”的解决办法
  12. (qsf文件 、 tcl文件 和 csv(txt)文件的区别) FPGA管脚分配文件保存、导入导出方法...
  13. android.support.v7.app.actionbaractivity 报错
  14. 15-Mixly模拟输出 | Mixly技巧系列
  15. java毕业答辩演讲稿,2019毕业答辩演讲稿大全
  16. 编译原理 CS-143(更新至week4)
  17. JS中promise是什么?
  18. 2017南京大学计算机考研复试分,2018.的南大复试考生,:2017南京大学中国古代史考研复试经...
  19. 冒泡排序基本思想及其复杂度分析
  20. 如何理解那些令人困惑的Windows 7文件/共享权限

热门文章

  1. Java:使用Java编写一个随机点名器
  2. LeetCode 714 买卖股票的最佳时机含手续费
  3. Unity HDRP Volume框架 — Lighting(光照)
  4. 海南省计算机作品大赛,海南省教育研究培训院:关于举办第二十届海南省中小学电脑制作活动的通知...
  5. 【knex】 knex.js中 orderBy多个字段排序
  6. 软件设计师(八)汇总-选择题
  7. 怎样提高英语思维能力?
  8. 小米8 android9手势,数码教程资讯:小米9怎么开启全面屏手势
  9. Ubuntu 14.04 LTS 安装配置搜狗拼音输入法
  10. AI辅助检测脑动脉瘤,灵敏度达97.5%,华为云联合成果登上国际顶级期刊