Python Selenium 图片资源自动搜索保存 项目实践

实现访问首页

from os.path import dirnamefrom selenium import webdriverclass ImageAutoSearchAndSave:"""图片自动搜索保存"""def __init__(self):"""初始化"""self.driver = webdriver.Chrome(executable_path=dirname(__file__) + "/chromedriver.exe")def run(self):"""开始运行"""print("=======开始=======")# 访问首页self.driver.get("https://pixabay.com/")print("=======结束=======")if __name__ == '__main__':ImageAutoSearchAndSave().run()

启动后会自动打开一个页面
在这里插入图片描述

实现图片自动欧索

from os.path import dirnamefrom selenium import webdriver
from selenium.webdriver.common.keys import Keysclass ImageAutoSearchAndSave:"""图片自动搜索保存"""def __init__(self, keyword):"""初始化"""self.keyword = keywordself.driver = webdriver.Chrome(executable_path=dirname(__file__) + "/chromedriver.exe")def run(self):"""开始运行"""print("=======开始=======")# 访问首页self.driver.get("https://pixabay.com/")# 搜索图片self._search_image()print("=======结束=======")def _search_image(self):'''搜索图片'''elem = self.driver.find_element_by_css_selector("input[name]")elem.send_keys(self.keyword + Keys.ENTER)if __name__ == '__main__':keyword = "cat"ImageAutoSearchAndSave(keyword).run()

遍历所有图片列表页面

页面分析

第一页
在这里插入图片描述
第二页
在这里插入图片描述
由此可得出变化的只有这里,根据pagi= 展示不同页面
在这里插入图片描述
红色箭头定位到页数,绿色的不要使用 是反爬虫的限制,不断变化的
在这里插入图片描述

from os.path import dirnamefrom selenium import webdriver
from selenium.webdriver.common.keys import Keysclass ImageAutoSearchAndSave:"""图片自动搜索保存"""def __init__(self, keyword):"""初始化"""self.keyword = keywordself.driver = webdriver.Chrome(executable_path=dirname(__file__) + "/chromedriver.exe")def run(self):"""开始运行"""print("=======开始=======")# 访问首页self.driver.get("https://pixabay.com/")# 搜索图片self._search_image()# 遍历所有页面self._iter_all_page()print("=======结束=======")def _search_image(self):'''搜索图片'''elem = self.driver.find_element_by_css_selector("input[name]")elem.send_keys(self.keyword + Keys.ENTER)def _iter_all_page(self):'''遍历所有页面'''# 获取总页面elem = self.driver.find_element_by_css_selector("input[class^=pageInput]")page_total = int(elem.text.strip("/ "))# 遍历所有页面base_url = self.driver.current_urlfor page_num in range(1,page_total+1):if page_num>1:self.driver.get(f"{base_url}?pagi={page_num}&")
if __name__ == '__main__':keyword = "sunflower"ImageAutoSearchAndSave(keyword).run()

获取所有图片详情页链接

在这里插入图片描述

from os.path import dirnamefrom lxml.etree import HTML
from selenium import webdriver
from selenium.webdriver.common.keys import Keysclass ImageAutoSearchAndSave:"""图片自动搜索保存"""def __init__(self, keyword):"""初始化"""self.keyword = keywordself.all_detail_link = []self.driver = webdriver.Chrome(executable_path=dirname(__file__) + "/chromedriver.exe")def run(self):"""开始运行"""print("=======开始=======")# 访问首页self.driver.get("https://pixabay.com/")# 搜索图片self._search_image()# 遍历所有页面self._iter_all_page()print("=======结束=======")def _search_image(self):'''搜索图片'''elem = self.driver.find_element_by_css_selector("input[name]")elem.send_keys(self.keyword + Keys.ENTER)def _iter_all_page(self):'''遍历所有页面'''# 获取总页面elem = self.driver.find_element_by_css_selector("input[class^=pageInput]")page_total = int(elem.text.strip("/ "))# 遍历所有页面base_url = self.driver.current_urlfor page_num in range(1, page_total + 1):if page_num > 1:self.driver.get(f"{base_url}?pagi={page_num}&")# href 属性root = HTML(self.driver.page_source)# a标签中的href属性detail_links = root.xpath("//div[start-with(@class,'result')]//a[start-with(@class,'link')]/@href")for detail_link in detail_links:self.all_detail_link.append(detail_link)if __name__ == '__main__':keyword = "sunflower"ImageAutoSearchAndSave(keyword).run()

增加下载数量的限制

在这里插入图片描述

from os.path import dirnamefrom lxml.etree import HTML
from selenium import webdriver
from selenium.webdriver.common.keys import Keysclass ImageAutoSearchAndSave:"""图片自动搜索保存"""def __init__(self, keyword,limit=0):"""初始化"""self.keyword = keywordself.all_detail_link = []self.limit=limit #0表示没有限制self.count = 0 #用来计数self.driver = webdriver.Chrome(executable_path=dirname(__file__) + "/chromedriver.exe")def run(self):"""开始运行"""print("=======开始=======")# 访问首页self.driver.get("https://pixabay.com/")# 搜索图片self._search_image()# 遍历所有页面self._iter_all_page()print("=======结束=======")def _search_image(self):'''搜索图片'''elem = self.driver.find_element_by_css_selector("input[name]")elem.send_keys(self.keyword + Keys.ENTER)def _iter_all_page(self):'''遍历所有页面'''# 获取总页面elem = self.driver.find_element_by_css_selector("input[class^=pageInput]")# page_total = int(elem.text.strip("/ "))page_total = 5# 遍历所有页面base_url = self.driver.current_urlfor page_num in range(1, page_total + 1):if page_num > 1:self.driver.get(f"{base_url}?pagi={page_num}&")# href 属性root = HTML(self.driver.page_source)is_reach_limit = False# 获取每一页详情链接   a标签中的href属性detail_links = root.xpath("//div[start-with(@class,'result')]//a[start-with(@class,'link')]/@href")for detail_link in detail_links:self.all_detail_link.append(detail_link)self.count += 1if self.limit >0 and self.count == self.limit:is_reach_limit = Truebreakif is_reach_limit:break
if __name__ == '__main__':keyword = "sunflower"limit = 3ImageAutoSearchAndSave(keyword,limit).run()

获取所有图片详情、获取图片下载链接

在这里插入图片描述

from os.path import dirnamefrom lxml.etree import HTML
from selenium import webdriver
from selenium.webdriver.common.keys import Keysclass ImageAutoSearchAndSave:"""图片自动搜索保存"""def __init__(self, keyword, limit=0):"""初始化"""self.keyword = keywordself.all_detail_link = []self.limit = limit  # 0表示没有限制self.count = 0  # 用来计数self.all_download_link = [] # 图片详情的下载链接self.driver = webdriver.Chrome(executable_path=dirname(__file__) + "/chromedriver.exe")def run(self):"""开始运行"""print("=======开始=======")# 访问首页self.driver.get("https://pixabay.com/")# 搜索图片self._search_image()# 遍历所有页面self._iter_all_page()# 访问图片详情页self._visit_image_detail()# 释放资源self.driver.close()del self.all_detail_linkprint("=======结束=======")def _search_image(self):'''搜索图片'''elem = self.driver.find_element_by_css_selector("input[name]")elem.send_keys(self.keyword + Keys.ENTER)def _iter_all_page(self):'''遍历所有页面'''# 获取总页面elem = self.driver.find_element_by_css_selector("input[class^=pageInput]")# page_total = int(elem.text.strip("/ "))page_total = 5# 遍历所有页面base_url = self.driver.current_urlfor page_num in range(1, page_total + 1):if page_num > 1:self.driver.get(f"{base_url}?pagi={page_num}&")# href 属性root = HTML(self.driver.page_source)is_reach_limit = False# 获取每一页详情链接   a标签中的href属性detail_links = root.xpath("//div[start-with(@class,'result')]//a[start-with(@class,'link')]/@href")for detail_link in detail_links:self.all_detail_link.append(detail_link)self.count += 1if self.limit > 0 and self.count == self.limit:is_reach_limit = Truebreakif is_reach_limit:breakdef _visit_image_detail(self):'''访问图片详情页'''for detail_link in self.all_detail_link:self.driver.get(detail_link)elem = self.driver.find_element_by_css_selector("#media_container > picture > img")download_link = elem.get_attribute("src")self.all_download_link.append(download_link)if __name__ == '__main__':keyword = "sunflower"limit = 3ImageAutoSearchAndSave(keyword, limit).run()

下载所有图片

from io import BytesIO
from os import makedirs
from os.path import dirname
from time import strftimeimport requests
from PIL import Image
from lxml.etree import HTML
from selenium import webdriver
from selenium.webdriver.common.keys import Keysclass ImageAutoSearchAndSave:"""图片自动搜索保存"""def __init__(self, keyword, limit=0):"""初始化"""self._keyword = keywordself.all_detail_link = []self._limit = limit  # 0表示没有限制self._count = 0  # 用来计数self.all_download_link = [] # 图片详情的下载链接self._driver = webdriver.Chrome(executable_path=dirname(__file__) + "/chromedriver.exe")def run(self):"""开始运行"""print("=======开始=======")# 访问首页self._driver.get("https://pixabay.com/")# 搜索图片self._search_image()# 遍历所有页面self._iter_all_page()# 访问图片详情页self._visit_image_detail()# 释放资源self._driver.close()del self.all_detail_link# 下载所有图片self._download_all_image()print("=======结束=======")def _search_image(self):'''搜索图片'''elem = self._driver.find_element_by_css_selector("input[name]")elem.send_keys(self._keyword + Keys.ENTER)def _iter_all_page(self):'''遍历所有页面'''# 获取总页面elem = self._driver.find_element_by_css_selector("input[class^=pageInput]")# page_total = int(elem.text.strip("/ "))page_total = 5# 遍历所有页面base_url = self._driver.current_urlfor page_num in range(1, page_total + 1):if page_num > 1:self._driver.get(f"{base_url}?pagi={page_num}&")# href 属性root = HTML(self._driver.page_source)is_reach_limit = False# 获取每一页详情链接   a标签中的href属性detail_links = root.xpath("//div[start-with(@class,'result')]//a[start-with(@class,'link')]/@href")for detail_link in detail_links:self.all_detail_link.append(detail_link)self._count += 1if self._limit > 0 and self._count == self._limit:is_reach_limit = Truebreakif is_reach_limit:breakdef _visit_image_detail(self):'''访问图片详情页 获取对应的图片链接'''for detail_link in self.all_detail_link:self._driver.get(detail_link)elem = self._driver.find_element_by_css_selector("#media_container > picture > img")download_link = elem.get_attribute("src")self.all_download_link.append(download_link)def _download_all_image(self):'''下载所有图片'''download_dir = f"{dirname(__file__)}/download/{strftime('%Y%m%d-%H%M%S')}-{self._keyword}"makedirs(download_dir)#下载所有图片count = 0for download_link in self.all_download_link:response = requests.get(download_link)count += 1# response.content 二进制内容  response.text 文本内容image = Image.open(BytesIO(response.content))# rjust  000001.pngfilename = f"{str(count).rjust(6,'0')}.png"file_path = f"{download_dir}/{filename}"image.save(file_path)if __name__ == '__main__':keyword = "sunflower"limit = 3ImageAutoSearchAndSave(keyword, limit).run()

可以适当的进行优化,使用selnium的页面加载策略

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/224861.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【c++|SDL】二、读取图片、显示图片、动画制作

every blog every motto: You can do more than you think. https://blog.csdn.net/weixin_39190382?typeblog 0. 前言 读取图片,显示图片,动画 SDL中有两种在屏幕上显示的方法 SDL_Surface: 使用软件渲染处理SDL_Texture: 使用硬件加速渲染处理 1.…

Windows10-用户账户控制、Windows远程桌面

Windows10用户账户控制怎么设置白名单 问题引出: 安装低版本搜狗输入法后经常弹出用户账户控制 解决方案: 全局模式: UAC控制最早出现在Windows Vista中,用户帐户控制(UAC)是一项旨在防止对您的计算机…

【网络安全】-常见的网站攻击方式详解

文章目录 介绍1. SQL 注入攻击攻击原理攻击目的防范措施 2. 跨站脚本攻击(XSS)攻击原理攻击目的防范措施 3. CSRF 攻击攻击原理攻击目的防范措施 4. 文件上传漏洞攻击原理攻击目的防范措施 5. 点击劫持攻击原理攻击目的防范措施 结论 介绍 在数字时代&a…

hello vtk 圆柱

VTK 可视化的流程及步骤 标题引入VTK库和初始化: 引入 VTK 库和 AutoInit 模块,以便使用 VTK 的渲染和交互功能 设置背景颜色和颜色对象: 使用 vtkNamedColors 设置背景颜色和演员颜色。 创建圆柱体源: 使用 vtkCylinderSou…

图书管理系统源码,图书管理系统开发,图书借阅系统源码四TuShuManager应用程序MVC控制器Controllers

Asp.net web应用程序MVC之Controllers控制器 Controller在ASP.NET MVC中负责控制所有客户端与服务器端的交互,并且负责协调Model与View之间的数据传递,是ASP.NET MVC的核心。 撰写Controller的基本要求: 1、Controller必须为公开类别; 2、Controller名称必须以Controller结…

【C++】哈希(位图、布隆过滤器)

一、哈希的应用(位图和布隆过滤器) 1、位图(bitset) (1)位图概念 【题目】 给 40亿 个不重复的无符号整数,没排过序。给一个无符号整数,如何快速判断一个数是否在这 40亿 个数中。…

UserWarning: FigureCanvasAgg is non-interactive, and thus cannot be shown

一个奇怪的BUG 这个代码会报下面的错: 但是把模型导入部分注释掉之后就没有这个错误了(第六行) 解决办法:在模型加载后面加入一行代码 matplotlib.use( TkAgg’),这个bug的问题就是模型加载改变了matplotlib使用的终端…

【Dockerfile】将自己的项目构建成镜像部署运行

目录 1.Dockerfile 2.镜像结构 3.Dockerfile语法 4.构建Java项目 5.基于Java8构建项目 1.Dockerfile 常见的镜像在DockerHub就能找到,但是我们自己写的项目就必须自己构建镜像了。 而要自定义镜像,就必须先了解镜像的结构才行。 2.镜像结构 镜…

在VMcentos7上用docker部署SELKS(IDS系统)

基本安装所需环境: 2核(至少)10 GB 可用 RAM(经测试,4GB也能运行但会卡)至少 30 GB 可用磁盘空间(实际磁盘占用情况主要取决于规则数量和网络流量)。建议使用 200GB SSD 级别。git,…

【Linux】:信号在内核里的处理

信号的发送和保存 一.内核中的信号处理二.信号集操作函数1.一些信号函数2.sigprocmask3.sigpending4.写代码 三.信号在什么时候处理的四.再谈地址空间 一.内核中的信号处理 1.实际执行信号的处理动作称为信号递达(Delivery )2.信号从产生到递达之间的状态,称为信号未决(Pending…

深度学习18

卷积层 查看每个数据 使用tensorboard查看 池化层 使用数据集进行训练 创建实例,使用tensorboard进行显示 最大池化保留了图片信息,神经网络训练的数据量大大减小,可以加快训练 非线性激活 非线性激活为神经网络加入了一些非线性的特质…

【密码学】【安全多方计算】浅析隐私求交PSI

文章目录 隐私求交的定义隐私求交方案介绍1. 基于DH的PSI方案2. 基于OT的PSI方案3.基于OPRF的PSI方案 总结 隐私求交的定义 隐私集合求交使得持有数据参与方通过计算得到集合的交集数据,而不泄露任何交集以外的数据信息。 隐私求交方案介绍 1. 基于DH的PSI方案 …