import asyncio
import time
import traceback
from 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) # 调用协程函数的时候要在前面加await
print(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,提取分类url
response = 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_list
async 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 + imgstr
img_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 = None
print("下一页", nextpage_url)
return img_url_list, nextpage_url
async 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 + i
imglist.append(imgurl)
return imglist
async 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 = None
return imgname, img_down_url
def 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 path
else:
print(path + "\t目录已存在")
return path
async 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.size
img_w = img_w_h[0]
img_h = img_w_h[1]
except:
img_w = 0
img_h = 0
return img_w, img_h
async 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 + "." + filenametype
imgname = 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 += 1
imgname = 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 = 0
while 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 = 0
tasks = []
for imgurl in imglist:
num += 1
tasks.append(save(imgurl, num, path))
await asyncio.gather(*tasks)
except:
print("[%s]请求失败......" % img_url)
continue
if len(nextpage_url) > 0:
type_url = nextpage_url
else:
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之后的写法
相关推荐
Python-aiofiles是一个用Python编写用于处理asyncio应用程序中的本地磁盘文件
aiofiles是一个用Python编写,用于处理asyncio应用程序中的本地磁盘文件
python3-python中的多任务处理利器-协程的使用(二),aiohttp与aiofiles模块的使用
python中的多任务处理利器-协程的使用,aiohttp与aiofiles模块的使用。同步,异步,多任务。
Cass三角网法土方计算优化技巧:如何根据地形特点调整边界采样间距
本文深入探讨了Cass软件中三角网法(DTM法)土方计算的优化技巧,核心在于如何根据地形的复杂程度动态调整边界采样间距。针对平坦、复杂及人工构造物等不同地形特征,提供了具体的间距调整策略与精度验证方法,旨在帮助工程师在计算精度与效率间找到最佳平衡,实现精细化土方计算。
『python爬虫』19. aiohttp模块应用之下载图片(保姆级图文)
『python爬虫』19. aiohttp模块应用之爬取图片(保姆级图文)
nmap、X-Scan漏洞扫描和Metasploit中用永恒之蓝漏洞入侵靶机并上传冰河
利用nmap、X-Scan扫描靶机的漏洞,在Metasploit中用扫描出的永恒之蓝漏洞入侵靶机,建立连接后上传冰河木马控制靶机,最后用冰河陷阱清除靶机的冰河木马,记一次完整的入侵控制实验。
风力发电机缺陷检测平台
风力发电机缺陷检测平台相关内容展示
Python中aiohttp和aiofiles模块的安装
Python中aiohttp和aiofiles模块的安装
自监督预训练(三)wav2vec 2.0原理剖析
一、整体流程 二、feature encoder 理解Conv1d nn.Conv1d(in_channels=5, out_channels=20, kernel_size=3, stride=2) 假设输入input=(batch, in_channels, in_len) batch=1 in_channels=5,对应向量大小,比如word embedding in_len=10,对应word的个数 cnn内部kernel=(in_channels, kernel_size)=(5,3),相当
python下载速度太慢,python异步下载图片
大家好,小编来为大家解答以下问题,python下载速度太慢,python异步下载图片,现在让我们一起来看看吧!
在MATLAB和Simulink中设计并仿真一个智能建筑能效优化系统
智能建筑能效优化是现代建筑管理的重要组成部分,旨在通过智能化手段降低能源消耗、减少碳排放并提高居住舒适性。通过Simulink进行智能建筑能效优化仿真,可以验证控制策略的有效性、优化系统设计并降低开发成本。以下是如何在MATLAB和Simulink中设计并仿真一个智能建筑能效优化系统的详细步骤。通过上述步骤,我们成功设计并实现了基于Simulink的智能建筑能效优化仿真。该系统能够模拟复杂的建筑环境,验证能效优化策略的有效性,并通过优化设计提高建筑的能源利用效率和居住舒适性。
双馈风机并网系统宽频振荡机理与抑制方法研究
双馈风机并网系统宽频振荡分析与抑制 摘要:本文研究了双馈风机(DFIG)接入弱电网引发的宽频振荡问题。通过建立DFIG并网系统阻抗模型,分析了锁相环带宽、电流环带宽等参数对阻抗特性的影响。研究揭示了DFIG与电网阻抗交互导致交截频率处相位差超过180°的振荡机理。提出基于锁相环优化的阻抗重塑抑制策略,采用电压补偿和陷波器改善系统稳定性。仿真结果表明,该方法能有效降低相位差约10°-168°,显著抑制宽频振荡。代码实现了阻抗建模、稳定性分析和抑制策略验证,为工程应用提供了理论依据。
python| asyncio、aiohttp、aiofiles下载视频
记录一次异步爬取视频数据的过程。 主要步骤: 1、拿到页面源代码,找到iframe 2、从iframe页面源代码中找到m3u8文件地址 3、下载第一层m3u8文件 ===>下载第二层m3u8文件 4、下载ts文件 5、解密 6、合并文件 以下为具体代码: import asyncio import requests from bs4 import BeautifulSoup import re import asyncio import aiohttp imp...
PCL:实现 PPF估计(附完整源码)
PCL:实现 PPF估计(附完整源码)
自动采集全网图片小程序(异步版)~
想找配图不知道用啥咋办,不想上网搜咋办,不想面对哪些烦人的广告咋办!!觉得不错了下载又稍稍有点麻烦咋办!~~它,来了~~~
通过Simulink搭建一个智能微电网能量管理系统(Energy Management System, EMS)
通过上述代码实现,您可以逐步创建一个智能微电网能量管理系统。多源能量集成:整合光伏、风力发电、柴油发电机、电池储能等多种能源资源。负荷预测与调度:基于历史数据和天气预报,预测未来负荷和可再生能源输出,进行优化调度。储能系统优化:设计合理的充放电策略,确保储能系统的高效利用和寿命延长。经济性分析:评估不同运行模式下的经济性,考虑电价、维护成本等因素。环境影响评估:分析微电网对环境的影响,如减少碳排放、提高可再生能源利用率等。硬件在环仿真(HILS)
计算机控制技术及应用
《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。
Python异步爬虫之协程抓取妹子图片(aiohttp、aiofiles)
本文主要介绍使用协程进行异步爬虫,提高爬取效率以及资源的最大化利用率
假人有限元模型
假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用
python使用asyncio和aiohttp模块异步下载图片
本文主要讲述使用协程来下载图片,使用到的模块有asyncio和aiohttp,注意一定不能使用了asyncio后再使用requests去请求数据,因为requests是一个同步模块,在执行时候还是会进入阻塞状态,必须要使用配套的aiohttp模块 # -*- coding:utf-8 """ 作者: Jia 日期: 2022年05月27日 描述: 使用协程来下载图片 """ import aiohttp import asyncio urls = [ "http://img.netbian.co
LinePhone3.2.7(android端最新版本) sip客户端
SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/
Data-Structures-and-Algorithm-Analysis-in-Java.pdf
作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...
初学爬虫,对aiohttp和aiofiles模块有些困惑
为什么图片地址,请求都通过了,aiofiles写入文件图片为空啊。试了response.content.read(),还是空。
asyncio+aiohttp+aiofiles实现异步下载妹子图片
因为不熟悉的缘故,总觉得写的不好,一种异步代码与同步代码参杂着的感觉,希望能够得到指点。 import os import re import aiofiles import aiohttp import asyncio from lxml import etree # 发请求获取html文本 async def fetch(session, url): async with ses...
【无标题】
异步操作类AIOFILES封装
python爬虫之多线程threading、多进程multiprocessing、协程aiohttp 批量下载图片
对于多任务爬虫来说,多线程、多进程、协程这几种方式处理效率的排序为:aiohttp协程 > 多线程 > 多进程。但是aiohttp协程难度有点复杂,需要了解,而且本人目前没有解决协程下载大尺寸图片不完整的情况,还需要后续继续学习。
python&[aiohttp , aiofiles]案例
aiohttp , aiofiles 安装 网址 图片链接 # aiohttp , aiofiles import asyncio import aiohttp import aiofiles """ 复制图片地址 'https://img2.baidu.com/it/u=1395158804,2693158229&fm=253&fmt=auto&app=138&f=JPEG?w=775&h=500', 'https://img0.baidu.com/it
python asyncio文件操作_aiofiles是一个用Python编写,用于处理asyncio应用程序中的本地磁盘文件...
aiofiles: file support for asyncio aiofiles is an Apache2 licensed library, written in Python, for handling local disk files in asyncio applications.Ordinary local file IO is blocking, and cannot e...
Python线程池ThreadPoolExecutord,aiohttp两种方法光速下载图片
第一种方法:aiohttp异步请求:缺点是加代理IP不太方便,但是可以自己限制并发下载数量,以免爬崩网站或者被封禁 IP。第二种方法:ThreadPoolExecutord:缺点是没那么快,但其实已经够用了。优点是设置代理IP和请求头很方便。
python异步爬虫下载_Python 异步网络爬虫 II
上一部分(Python 异步网络爬虫 I)整理了如何利用 aiohttp 和 asyncio 执行异步网络请求,接下来我们将在此基础上实现一个简洁、普适的爬虫框架。一般网站抓取的流程是这样的:从入口页面开始提取一组下一级页面的链接,然后递归地执行下去,直到最后一层页面为止。唯一不同的是对每一级页面所要抓取的信息,也就是需要的正则表达式不同,除此之外,请求页面、分析内容、正则匹配的步骤是重复的,因此...
Python 异步操作文件 aiofiles
# 异步文件操作 # pip install aiofiles # 基本用法 import asyncio import aiofiles async def wirte_demo(): # 异步方式执行with操作,修改为 async with async with aiofiles.open("text.txt","w",encoding="utf-8") as fp: await fp.write("hello world ") print("数据写
2692



被折叠的 条评论
为什么被折叠?



