import asyncio
import time
import tracebackfrom aiohttp_requests import requests  # 对aiohttp的封装版
import aiofiles  # 异步文件操作库
import random
import os
from pathlib2 import Path
from PIL import Image
import io
import re# 同步
def fun():print(1)time.sleep(10)print(2)# 异步
# 这是一个协程函数,它属于异步代码,里面的asyncio.sleep是协程函数,也属于异步代码。
async def fun1():print(1)await asyncio.sleep(10)  # 调用协程函数的时候要在前面加awaitprint(2)# aiohttp是一个异步网络请求库,而aiofiles是一个异步文件操作库。
# (aiofiles是基于线程池实现的,并不是真正的原生异步,但问题不大,不影响使用)
home_url = "http://desk.zol.com.cn"
headers1 = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36"
}async def get_home_url(url, headers):# 请求首页url,提取分类urlresponse = await requests.get(url, headers=headers)# html_str = response.content.decode("gbk")html_str = await response.text()p1 = r'<dt>壁纸分类:</dt>.*</a>.*<dl class="filter-item clearfix">'kind1 = re.compile(p1, re.DOTALL)  # re.S(简写) == re.DOTALL 表示正则中的.会匹配换行符dd_str = kind1.findall(html_str)p2 = r'a href="(.*?)"'kind2 = re.compile(p2)url_str = kind2.findall(dd_str[0])p3 = r'target="_blank">(.*?)<'kind3 = re.compile(p3, )url_name = kind3.findall(dd_str[0])label_url_list = []for i in range(len(url_str)):item_list = []url = home_url + url_str[i]label_name = url_name[i]item_list.append(label_name)item_list.append(url)print(item_list)label_url_list.append((item_list))return label_url_listasync def get_label_url(url, headers):# 请求分类页面,提取下一页url和当前页面图片包url地址列表response = await requests.get(url, headers=headers)html_str = await response.text()# 提取当前页面包含的图片url###########################################################################################p1 = r'<ul class="pic-list2  clearfix">.*ins></li>     </ul>'kind1 = re.compile(p1, re.DOTALL)exist_img_str = kind1.findall(html_str)p2 = r'a class="pic" href="(.*?)"'kind2 = re.compile(p2)url_str = kind2.findall(exist_img_str[0])############################################img_url_list = []for imgstr in url_str:img_url = home_url + imgstrimg_url_list.append(img_url)# 提取下一页url地址try:page_str = r'a id="pageNext" href="(.*?)"'kind_page = re.compile(page_str, re.DOTALL)jump_page = kind_page.findall(html_str)nextpage_url = home_url + jump_page[0]except:nextpage_url = Noneprint("下一页", nextpage_url)return img_url_list, nextpage_urlasync def get_img_url(url, headers):# 提取图片地址列表response = await requests.get(url, headers=headers)html_str = await response.text()p1 = r'id="showImg".*</li></ul>'kind1 = re.compile(p1, re.DOTALL)img_url_str = kind1.findall(html_str)p2 = r'a href="(.*?)"'kind2 = re.compile(p2)url_str = kind2.findall(img_url_str[0])imglist = []for i in url_str:imgurl = home_url + iimglist.append(imgurl)return imglistasync def get_imgurl_imgname(url, headers):# 提取下载地址和图片名称response = await requests.get(url, headers=headers)html_str = await response.text()# 提取图片名称try:p1 = r'id="titleName".*html">(.*?)</a>'kind1 = re.compile(p1)imgname = kind1.findall(html_str)[0]except:imgname = "随机名" + str(random.randint(1, 9)) + "x"# 提取图片下载地址try:p2 = r'id="tagfbl".*class="laiyuan"'kind2 = re.compile(p2, re.DOTALL)imgurlstrlist = kind2.findall(html_str)p3 = r'href="(.*?)"'kind3 = re.compile(p3)imgurlstr = kind3.findall(imgurlstrlist[0])img_download_url = home_url + imgurlstr[0]##############################################res = await requests.get(img_download_url, headers=headers)html = await res.text()rules = r'img src="(.*?)">'kind_rules = re.compile(rules)img_down_url = kind_rules.findall(html)[0]except:img_down_url = Nonereturn imgname, img_down_urldef if_type_name(name, types_url_list):# 判断要下载的分类,如果存在,就返回分类url地址,如果没有,提示分类不存在# name:输入的分类名称# types_url_list:所有分类的名称和url地址列表for types in types_url_list:if name in types[0]:print("你输入的是[%s]类,已经找到[%s]类" % (name, types[0]))print(types)print("马上开始下载[%s]类图片" % name)return types[1]else:print("未找到[%s]类" % name)def mkdir(path):# 判断路径是否存在,存在则返回路径;不存在就创建路径is_exist = os.path.exists(path)if not is_exist:os.makedirs(path)print(path + "\t目录创建成功")return pathelse:print(path + "\t目录已存在")return pathasync def img_width_height(url, headers):# 提取图片的长宽信息try:response = await requests.get(url, headers=headers)f = await response.read()imgs = io.BytesIO(f)img_file = Image.open(imgs)img_w_h = img_file.sizeimg_w = img_w_h[0]img_h = img_w_h[1]except:img_w = 0img_h = 0return img_w, img_hasync def save_img(img_name, img_download_url, path):random_word = chr(random.randint(97, 122))filenametype = os.path.basename(img_download_url)[-3:]response = await requests.get(img_download_url)imgname = img_name + random_word + "." + filenametypeimgname = imgname.replace("?", "").replace("/", "").replace("\\", "").replace(":", "").replace("*", "")imgname = imgname.replace('"', "").replace("<", "").replace(">", "").replace("|", "").replace(" ", "")imgname = imgname.replace("\n", "")if len(imgname) > 255:imgname = imgname[-251:]# with open(f"./{path}/{imgname}".strip(), "wb") as f:#     f.write(response.content)#     print("[%s]保存成功......" % imgname)async with aiofiles.open(f"./{path}/{imgname}".strip(), "wb") as f:await f.write(await response.read())print("[%s]保存成功......" % imgname)async def save(imgurl, num, path):try:imgname, img_download_url = await get_imgurl_imgname(imgurl, headers1)num += 1imgname = imgname + str(num)img_w, img_h = await img_width_height(img_download_url, headers1)if img_w >= 1440 or img_h >= 900:try:await save_img(imgname, img_download_url, path)print("第[%s]张图片下载完成......" % imgname)except:traceback.print_exc()print("[%s]下载失败......" % imgname)else:print("[%s]像素过低,取消下载......" % imgname)except:print("[%s]请求失败......" % imgurl)async def run():# 1.请求首页获取图片分类label_url_list = await get_home_url(home_url, headers1)# 2.选择需要下载的分类print("*" * 80)print("*" * 80)for label_str in label_url_list:print(label_str[0], end="\t")print("")print("*" * 80)print("*" * 80)print("以上是可以选择下载的分类!")kind_name = input("请输入要下载的分类:")type_url = if_type_name(kind_name, label_url_list)print(type_url)# 根据选择的分类开始下载图片# 创建目录path = mkdir(f"./zol图库/{kind_name}")x = 0while True:img_url_list, nextpage_url = await get_label_url(type_url, headers1)for img_url in img_url_list:try:imglist = await get_img_url(img_url, headers1)num = 0tasks = []for imgurl in imglist:num += 1tasks.append(save(imgurl, num, path))await asyncio.gather(*tasks)except:print("[%s]请求失败......" % img_url)continueif len(nextpage_url) > 0:type_url = nextpage_urlelse:print("[%s]图片下载完成,下载结束......" % kind_name)break# 提示:aiohttp-requests默认是创建并使用了session的,
# 对于一些需要不保留Cookie进行请求的场景需要自己实例化一个Requests类,并指定cookie_jar为aiohttp.DummyCookieJar。
if __name__ == '__main__':# loop = asyncio.get_event_loop()# loop.run_until_complete(run())asyncio.run(run())  # python3.7之后的写法

aiohttp+aiofiles异步爬虫光速下载图片相关推荐

  1. 图片url解析正确,但爬虫无法下载图片

    图片url解析正确,但爬虫无法下载图片 爬虫错误debug 解注释DOWNLOADER_MIDDLEWARES HTTP status code is not handled or not allow ...

  2. python爬虫批量下载图片

    使用python的urllib库和正则表达式爬取 学习地址(自行base64解密):aHR0cDovL3BpYy5uZXRiaWFuLmNvbQ== 网站图片,支持批量下载. (本文仅供学习交流,请勿 ...

  3. python 百度贴吧爬虫(下载图片)

    业余时用python写的百度贴吧爬虫程序,算是对学习python程序得一个练习. 本程序可以针对给定的贴吧链接,把帖子楼主的发言或者图片爬取出来,目前主要功能为下载所有楼主发的图片.爬取楼主发言的功能 ...

  4. 利用aiohttp实现异步爬虫

      asyncio可以实现单线程并发IO操作,是Python中常用的异步处理模块.关于asyncio模块的介绍,笔者会在后续的文章中加以介绍,本文将会讲述一个基于asyncio实现的HTTP框架--a ...

  5. 爬虫——scrapy下载图片

    使用scrapy下载图片只需要几部,因为系统自带得有(☄⊙ω⊙)☄ [toc] 第一步,还是定义items title,url 第二步,定义spider 爬取的内容然后装入items中 上一篇我们说了 ...

  6. node.js爬虫之下载图片,批量下载图片,控制下载图片并行上限

    首先介绍一下爬虫所需要的的包 require("request"); –get post请求页面 require("cheerio") –解析文本对象为DOM对 ...

  7. Python入门之爬虫--自动下载图片

    这个互联网上的数据90%的访问都是爬虫来完成的,爬虫由于检索速度快,定向性高,效率高而受到许多公司和个人的喜爱,如果我们想把一个网站上的图片全部下载下来,可以会花费我们很多时间,如果用爬虫来做的话,我 ...

  8. python爬虫(自动下载图片)

    爬虫第一步下载第三方工具(requests包): win+R 输入cmd点击确定或回车 输入以下命令下载requests包: requests包是python爬虫常用的包 他的下载方式是 pip in ...

  9. python 爬虫批量下载图片

    今天加班啊,苦啊!! 无聊,用python写了一个抓图片的爬虫,感觉很不错啊,哈哈 先贴上代码:(python 版本:2.7.9) __author__ = 'bloodchilde'import u ...

  10. node.js爬虫批量下载图片

    有些网页做过处理,直接重定向了,这里爬虫只不做处理的一些网页 效果图 代码 // const http = require('http'); //如果是http协议用这个 const http = r ...

最新文章

  1. 动态添加的路由 直接访问_VUE 动态路由(二)
  2. 编译安装samba-4.85
  3. /usr/bin/ld: cannot find -lltdl collect2: ld returned 1 exit status make: *** [sapi/cgi/php-cgi] Err
  4. zookeeper的设计猜想-leader选举
  5. 产品经验谈:产品经理需要熟知几种常用思维模型
  6. sparksql保存数据常见操作
  7. 装箱问题(信息学奥赛一本通-T1295)
  8. The Dataflow Model: A Practical Approach to Balancing
  9. Qt 5.9.1 连 MYSQL 5.7数据库
  10. BigDecimal.divide方法
  11. JavaSE基础——数组概述和定义格式说明
  12. 用“看板图”实现敏捷项目的可视化
  13. wifislax14.0final reaver穷举PIN教程 wap,wps破解教程
  14. c语言软件下载与配置
  15. 计算机怎么删除表格,怎么快速删除电脑word文档中不想要的表格
  16. 王慧文清华产品课(六)
  17. elementUI表格合并行数据
  18. 可以联机的计算机游戏,多人玩的游戏_可以多人联机玩的游戏 乐游网
  19. Python下载网易云音乐(云音乐飙升榜)
  20. Three.js学习笔记---我和小伙伴都惊呆了

热门文章

  1. 位掩码(BitMask)——介绍与使用
  2. sd卡 linux分区教程,《电脑端SD卡分区 小白教程 支持ext swap 分区无需linux环境、》.docx...
  3. 全球及中国手机塔防游戏行业研究及十四五规划分析报告(2022)
  4. 团队沟通:为何如此重要以及如何改
  5. CSS单位:em、rem、%、vh、vw、vmin、vmax
  6. RHEL7平台下电信拨号上网配置
  7. html5制作旋转正方体,如何制作一个旋转的正方体
  8. 从一个方向看一个正方体_从一个方向观察一个正方体,最多可以看到几个面
  9. 生物信息-McScan(Python-jcvi)共线性画图
  10. 女生学前端适合么?新人应该怎么学习?