Python异步爬虫批量下载图片-协程


import aiofiles
import aiohttp
import asyncio
import requests
from lxml import etree
from aiohttp import TCPConnectorclass Spider:def __init__(self, value):# 起始urlself.start_url = value# 下载单个图片@staticmethodasync def download_one(url):name = url[0].split("/")[-1][:-4]print("开始下载", url, name)headers = {'Host': 'file.jiutuvip.com','User-Agent': 'Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, ''like Gecko) Chrome/124.0.0.0 Mobile Safari/537.36','Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8','Accept-Language': 'zh-CN,zh;q=0.9','Accept-Encoding': 'gzip, deflate, br, zstd','Connection': 'keep-alive','Upgrade-Insecure-Requests': '1','Sec-Fetch-Dest': 'document','Sec-Fetch-Mode': 'navigate','Sec-Fetch-Site': 'none','Sec-Fetch-User': '?1','TE': 'trailers'}# 发送网络请求async with aiohttp.ClientSession(connector=TCPConnector(ssl=False)) as session:async with session.get(url=url[0], headers=headers) as resp: # 相当于 requests.get(url=url[0], headers=head)# await resp.text() => resp.textcontent = await resp.content.read() # => resp.content# 写入文件async with aiofiles.open('./imgs/' + name + '.webp', "wb") as f:await f.write(content)print("下载完毕")# 获取图片的urlasync def download(self, href_list):for href in href_list:async with aiohttp.ClientSession(connector=TCPConnector(ssl=False)) as session:async with session.get(url=href) as child_res:html = await child_res.text()child_tree = etree.HTML(html)src = child_tree.xpath("//div[@class='article-body cate-6']/a/img/@src") # 选手图片地址 url 列表await self.download_one(src)# 获取图片详情urlasync def get_img_url(self, html_url):async with aiohttp.ClientSession(connector=TCPConnector(ssl=False)) as session:async with session.get(url=html_url) as resp:html = await resp.text()tree = etree.HTML(html)href_list = tree.xpath("//div[@class='uk-container']/ul/li/a/@href") # 选手详情页 url 列表print(href_list)await self.download(href_list)# 页面总页数@staticmethoddef get_html_url(url):page = 2response = requests.get(url=url)response.encoding = "utf-8"tree = etree.HTML(response.text)total_page = tree.xpath("//*[@class='pages']/a[12]/text()") # 页面总页数print(total_page)html_url_list = []while page <= 4: # int(total_page[0]) # 只取第 2、3、4 页next_url = f"https://www.yeitu.com/meinv/xinggan/{page}.html"html_url_list.append(next_url)page += 1print(html_url_list)return html_url_listasync def main(self):# 拿到每页url列表html_url_list = self.get_html_url(url=self.start_url) # url列表tasks = []for html_url in html_url_list:t = asyncio.create_task(self.get_img_url(html_url)) # 创建任务tasks.append(t)await asyncio.wait(tasks)if __name__ == '__main__':url = "https://www.yeitu.com/meinv/xinggan/"sp = Spider(url)# loop = asyncio.get_event_loop()# loop = asyncio.new_event_loop()# asyncio.set_event_loop(loop)# loop.run_until_complete(sp.main())asyncio.run(sp.main())
相关文章:
Python异步爬虫批量下载图片-协程
import aiofiles import aiohttp import asyncio import requests from lxml import etree from aiohttp import TCPConnectorclass Spider:def __init__(self, value):# 起始urlself.start_url value# 下载单个图片staticmethodasync def download_one(url):name url[0].spl…...
力扣 42. 接雨水
题目来源:https://leetcode.cn/problems/trapping-rain-water/description/ C题解1:双指针 按列算,一列一列的求雨水面积。使用双指针是记录当前列左右侧的最大元素。 class Solution { public:int trap(vector<int>& height) {in…...
Elastic Platform 8.14:ES|QL 正式发布、静态加密和向量搜索优化
作者:来自 Elastic Gilad Gal, Tyler Perkins, Alex Chalkias, Trevor Blackford, Ninoslav Miskovic, Fabio Busatto, Aris Papadopoulos Elastic Platform 8.14 提供了 Elasticsearch 查询语言 (ES|QL) 的正式发行版 (GA) — Elastic 中数据探索和操作的未来。它还…...
UE4获取动画序列资产的动画时长
谢谢”朝闻道“大佬的指点~...
win10怎么截图?电脑截图的3个方法分享
win10怎么截图?在Windows 10操作系统中,截图功能不仅强大而且极其便捷。无论用户需要快速捕捉整个屏幕的内容,还是精确截取屏幕上的特定区域,它都能迅速响应并满足需求。通过内置的截图工具和快捷键,我们可以轻松完成各…...
无线领夹麦克风哪个品牌性价比高?推荐领夹麦克风性价比最高品牌
当今的直播、短视频已经深深的融入到了我们的生活当中,很多小伙伴会通过拍摄短视频、Vlog来分享自己生活精彩的瞬间。不过录制视频时,如果单纯靠手机拾音,距离手机越远,声音越小越不清晰如果有噪音干扰,那更是“惨不忍…...
C语言----深入理解指针(5)
1.sizeof和strlen的对比 sizeof计算变量所占内存空间的大小的,单位是字节 sizeof只关注内存空间的大小,不在乎内存中方的什么数据 sizeof是操作符不是函数 sizeof会将\0算进去的 // sizeof计算变量所占内存空间的大小的,单位是字节int m…...
Ansible——cron模块
目录 参数总结 示例1:创建一个定时任务 示例2:删除一个定时任务 示例3:每周一早上 3 点清理临时文件 示例4:每小时运行一次日志轮转 示例5:为指定用户添加一个定时任务 Playbook (YAML 格式) 中管理定时任务。 …...
保存图片奇怪的bug
今天发现一个奇怪的bug 这个的dpi是100de ,但是我取完切片之后,发现这个结果就变了...
【Go语言精进之路】构建高效Go程序:了解map实现原理并高效使用
🔥 个人主页:空白诗 🔥 热门专栏:【Go语言精进之路】 文章目录 引言一、什么是map1.1 map的基本概念与特性1.2 map的初始化与零值问题1.3 map作为引用类型的行为 二、map的基本操作2.1 插入数据2.2 获取数据个数2.3 查找和数据读取…...
【机器人和人工智能——自主巡航赛项】进阶篇
文章目录 案例要求创建地图rviz仿真 保存地图坐标点定位识别训练主逻辑理解语音播报模块匹配二维码识别多点导航讲解视频其余篇章 案例要求 创建地图 ./1-gmapping.sh 把多个launch文件融合在sh文件里面 rviz仿真 rviz是rose集成的可视化界面,查看机器人的各项数…...
[大师C语言(第二十五篇)]C语言字符串探秘
引言 字符串是编程中不可或缺的基本数据类型之一,它用于表示和操作文本数据。在C语言中,字符串以一种独特的方式实现,与许多其他编程语言的处理方式不同。本文将深入探讨C语言字符串背后的技术,帮助你更好地理解和应用字符串。 …...
xLua(一) 环境安装笔记
为了方便查阅记录一下xLua的安装地址及方法 1.登录地址下载: https://github.com/Tencent/xLua 2.解压文件 将文件中的这些内容拷贝到项目中的Asset文件夹中 注意 : 工程项目路径不得含有中文 3.将Tools复制到Asset同级目录下 4.导入后会发现有Bug,需要导入工程 5.还有另…...
Python基础教程(十一):数据结构汇总梳理
💝💝💝首先,欢迎各位来到我的博客,很高兴能够在这里和您见面!希望您在这里不仅可以有所收获,同时也能感受到一份轻松欢乐的氛围,祝你生活愉快! 💝Ὁ…...
制造型企业图纸泄露问题,如何从根源解决核心文件资料泄露问题?
制造型企业最核心重要的文件当然是图纸,图纸在制造型企业中起到关键主导地位,如果图纸泄露与研发性企业源代码被泄露一样的严重,制造型企业如何保护核心图纸不被外泄是企业在日常经营过程中的重要组成部分,现在有很多防止泄露的产…...
英伟达最新GPU和互联路线图分析
Nvidia在计算、网络和图形领域独树一帜,其显著优势在于雄厚的资金实力及在生成式人工智能市场的领先地位。凭借卓越的架构、工程和供应链,Nvidia能够自由实施创新路线图,引领行业未来。 到 21 世纪,Nvidia 已经是一个非常成功的创…...
Github 2024-06-10 开源项目日报 Top10
根据Github Trendings的统计,今日(2024-06-10统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量C项目2Go项目2PHP项目1Blade项目1TypeScript项目1Lua项目1Dart项目1Swift项目1Cuda项目1Python项目1MDX项目1Ventoy: 100%开源的可启动USB解决方…...
前后端分离项目中Spring Boot返回的时间与前端相差8个小时
概述 今天在做一个前后端分离项目时,发现从后端获取的时间与从数据库获取的时间相差八个小时,最终排查后发现由于Springboot使用本地时区导致,修改SpringBoot时区后解决 环境 MySQL8SpringBoot 原因排查 发现从后端获取的数据总是比前端快八个小时 …...
stm32MP135裸机编程:使用USB/UART烧录程序到SD卡并从SD卡启动点亮一颗LED灯
0 参考资料 轻松使用STM32MP13x - 如MCU般在cortex A核上裸跑应用程序.pdf STM32CubeProgrammer v2.16.0 烧录需要的二进制文件1 烧录到SD卡需要哪些文件 参考《轻松使用STM32MP13x - 如MCU般在cortex A核上裸跑应用程序》,烧录需要的SD卡文件如下: &a…...
【NoSQL数据库】Redis Cluster集群(含redis集群扩容脚本)
Redis Cluster集群 Redis ClusterRedis 分布式扩展之 Redis Cluster 方案功能数据如何进行存储 redis 集群架构集群伸缩向集群中添加一个新的master节点,并向其中存储 num10 .脚本对redis集群扩容缩容,脚本参数为redis集群,固定从6001移动200…...
基于算法竞赛的c++编程(28)结构体的进阶应用
结构体的嵌套与复杂数据组织 在C中,结构体可以嵌套使用,形成更复杂的数据结构。例如,可以通过嵌套结构体描述多层级数据关系: struct Address {string city;string street;int zipCode; };struct Employee {string name;int id;…...
相机Camera日志实例分析之二:相机Camx【专业模式开启直方图拍照】单帧流程日志详解
【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了: 这一篇我们开始讲: 目录 一、场景操作步骤 二、日志基础关键字分级如下 三、场景日志如下: 一、场景操作步骤 操作步…...
SCAU期末笔记 - 数据分析与数据挖掘题库解析
这门怎么题库答案不全啊日 来简单学一下子来 一、选择题(可多选) 将原始数据进行集成、变换、维度规约、数值规约是在以下哪个步骤的任务?(C) A. 频繁模式挖掘 B.分类和预测 C.数据预处理 D.数据流挖掘 A. 频繁模式挖掘:专注于发现数据中…...
可靠性+灵活性:电力载波技术在楼宇自控中的核心价值
可靠性灵活性:电力载波技术在楼宇自控中的核心价值 在智能楼宇的自动化控制中,电力载波技术(PLC)凭借其独特的优势,正成为构建高效、稳定、灵活系统的核心解决方案。它利用现有电力线路传输数据,无需额外布…...
相机从app启动流程
一、流程框架图 二、具体流程分析 1、得到cameralist和对应的静态信息 目录如下: 重点代码分析: 启动相机前,先要通过getCameraIdList获取camera的个数以及id,然后可以通过getCameraCharacteristics获取对应id camera的capabilities(静态信息)进行一些openCamera前的…...
华硕a豆14 Air香氛版,美学与科技的馨香融合
在快节奏的现代生活中,我们渴望一个能激发创想、愉悦感官的工作与生活伙伴,它不仅是冰冷的科技工具,更能触动我们内心深处的细腻情感。正是在这样的期许下,华硕a豆14 Air香氛版翩然而至,它以一种前所未有的方式&#x…...
JAVA后端开发——多租户
数据隔离是多租户系统中的核心概念,确保一个租户(在这个系统中可能是一个公司或一个独立的客户)的数据对其他租户是不可见的。在 RuoYi 框架(您当前项目所使用的基础框架)中,这通常是通过在数据表中增加一个…...
A2A JS SDK 完整教程:快速入门指南
目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库ÿ…...
Python Ovito统计金刚石结构数量
大家好,我是小马老师。 本文介绍python ovito方法统计金刚石结构的方法。 Ovito Identify diamond structure命令可以识别和统计金刚石结构,但是无法直接输出结构的变化情况。 本文使用python调用ovito包的方法,可以持续统计各步的金刚石结构,具体代码如下: from ovito…...
云原生安全实战:API网关Kong的鉴权与限流详解
🔥「炎码工坊」技术弹药已装填! 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 一、基础概念 1. API网关(API Gateway) API网关是微服务架构中的核心组件,负责统一管理所有API的流量入口。它像一座…...
