废话 不多说,直接上代码,不懂得看注释

先安装  pip install aiohttp

 "异步抓取花瓣网图片"

 # pip install aiohttp
import requests
import aiohttp
import asyncio
import time
import os headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.90 Safari/537.36',
"X-Request": "JSON",
"Accept": "application/json",
"X-Requested-With": "XMLHttpRequest"
} def get_image_urls():
"""获取图片链接"""
print('开始获取图片链接,请耐心等待......')
image_id = 2551285279
for page in range(1,26):
url = "https://huaban.com/boards/41743806/?jzwfs8ej&max="+ str(image_id) +"&limit=20&wfl=1"
response = requests.get(url,headers=headers).json()
pins = response['board']['pins']
end_pins_id = pins[-1]['pin_id']
for i in pins:
key = i['file']['key']
urls.append('http://hbimg.huabanimg.com/'+key)
image_id = end_pins_id # 下一页url中需要的参数 #特殊的函數:该函数调用后,函数内部的程序语句不会被执行,但是该函数调用会返回一个协程对象
async def get_audio_data(url):
#使用aiohttp进行请求发送
#实例化了一个发送网络请求的对象
async with aiohttp.ClientSession() as s:
#该函数内部的异步操作必须使用await进行修饰
async with await s.get(url=url,headers=headers) as response:
audio_data = await response.read() #read()返回的是二进制形式的响应数据
return {'data':audio_data,'url':url} #任务对象的回调函数,进行数据的持久化存储
def saveData(task):
dic_obj = task.result()
name = dic_obj['url'].split('/')[-1]
data = dic_obj['data']
image_dir = 'images'
if not os.path.exists(image_dir):
os.mkdir(image_dir)
with open(os.path.join(image_dir,name) + '.jpg','wb') as fp:
fp.write(data)
print(name+'下载完毕!') if __name__ == '__main__':
start_time = time.clock()
urls = []
tasks = []
get_image_urls()
for url in urls:
#调用该特殊函数,让其返回一个协程对象
c = get_audio_data(url)
#将协程对象封装到任务对象中
task = asyncio.ensure_future(c)
# 给任务对象绑定回调函数
task.add_done_callback(saveData)
#将任务对象添加到列表中
tasks.append(task)
#创建一个事件循环对象
loop = asyncio.get_event_loop()
#将任务对象列表注册到事件循环对象中,并且开启事件循环
loop.run_until_complete(asyncio.wait(tasks))
end_time = time.clock()
print('抓取{}张图片,共计用时{}秒'.format(len(tasks),end_time-start_time))

注:window最大线程数 512,所以任务数不要超过这个值,否则 抛出异常

最新文章

  1. Storm 中什么是-acker,acker工作流程介绍
  2. java位操作总结
  3. mongo日志切割脚本
  4. 33 网络相关函数(一)——live555源码阅读(四)网络
  5. HTTP Cookie/Session
  6. C# 多线程传参
  7. android学习--TabHost选项卡组件
  8. Java坑一
  9. poj1584 A Round Peg in a Ground Hole 判断多边形凹凸,点到线的距离【基础计算几何】
  10. linux上静态库链接的有关问题
  11. 在web项目启动时,使用监听器来执行某个方法
  12. 内核,配置WinDbg,调试操作系统(双机调试)
  13. UVA10382-Watering Grass-贪心 NYOJ6-喷水装置(一)-贪心
  14. 有一个排序二叉树,数据类型是int型,如何找出中间大的元素。
  15. sqlmap注入入门
  16. mysql索引优化-order/group
  17. linux常用命令以及快捷键
  18. PowerDesigner 同名问题解决 Entity Attribute name uniqueness
  19. UMI标签学习【转载】
  20. Alpha阶段第2周/共2周 Scrum立会报告+燃尽图 04

热门文章

  1. DVWA--File Inclusion
  2. [CSP-S模拟测试]:五子棋(模拟)
  3. 7. 进行图片的数据补全和增强(随机亮度,随机饱和度,随机翻转) Image.open(进行图片的读入) 2.ImageEnhance.Brightness(亮度变化) 3.ImageEnhance.Contrast(饱和度变化) 4.enhance_image.transpose(图片随机翻转) 5.enhance_image.save(进行图片保存)
  4. Android 编程下Touch 事件的分发和消费机制和OnTouchListener,OnClickListener和OnLongClickListener的关系
  5. C++多重继承实践
  6. MobileNetV2: Inverted Residuals and Linear Bottlenecks
  7. LeetCode 409——最长回文串
  8. BeanDefinition 实例化过程
  9. sklearn.feature_extraction.DictVectorizer
  10. Ajax中Put和Delete请求传递参数无效的解决方法(Restful风格)