Python简单实现批量下载无版权图片
时间:2022-07-28
本文章向大家介绍Python简单实现批量下载无版权图片,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
有时候我们有一些获取图片素材的需求,比如写博客或者公众号文章时,需要的插图和封面,当然这些图片必须是没有版权的免费图片,比较常用网站有pexels、pixabay等,今天再给大家介绍一个新的网站 :http://alana.io/。
由于是国外的网站,访问速度比较慢,一页一页找,非常费时间,所以想到用Python爬取下载到本地,然后使用关键词进行归类,后期直接预览使用。
首先,我们要了解下爬取数据的基本流程:
发起请求: 通过url向服务器发起request请求。
获取响应内容: 响应的内容网页包含HTML,Json字符串或者二进制的数据(视频、图片)等。
解析内容: 可以通过正则、BeautifulSoup、xpath等解析响应的数据。
保存数据: 可以保存到本地文件,也可以保存到数据库(MySQL,Redis,Mongodb等)
准备工作
通过浏览器访问http://alana.io/,并搜索关键词(例如:computer),在F12中查看请求的URL。
翻到第二页,查看页码的URL规则:
点击Response,查看图片URL的规则,大多数图片是以<img width="548" height="365" src=开头的。
下面,就是批量爬取并下载图片的代码组成。
1.创建下载目录
创建关键词目录,便于后期查找。
def create_dirs(search_words):
# 创建关键词目录
if not os.path.exists('./{}'.format(search_words)):
os.mkdir('./{}'.format(search_words))
2.请求并解析数据
def save_urls(url):
# 请求并解析数据
headers = {
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_6) AppleWebKit/537.36 (KHTML, like Gecko)
Chrome/76.0.3809.100 Safari/537.36'}
html = requests.get(url,headers=headers).text # 获取响应的文本信息
urls = re.compile(r'<img width="548" height="365" src="(.*?)"') #正则提取图片的URL列表
res = re.findall(urls, html)
return res
3.保存图片数据到本地
def save_pics(search_words,urls):
# 根据图片的URL地址进行循环下载
headers = {
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_6) AppleWebKit/537.36 (KHTML, like Gecko)
Chrome/76.0.3809.100 Safari/537.36'}
for i in urls:
filename = './{}/'.format(search_words)+i.split('/')[-1]
try:
with open(filename,'wb+') as f:
f.write(requests.get(i,headers=headers).content)# 将请求响应的二进制文件写入文件
print("图片下载成功")
except:
print("图片下载失败")
time.sleep(5)
4.主函数(按页循环下载)
if __name__ == '__main__':
search_words=input("下载图片关键词:")
search_page=int(input("下载页数:"))
# 按页循环下载
for page in range(1,search_page+1):
url = 'http://alana.io/page/{}/?s={}&post_type=download'.format(page,search_words)
create_dirs(search_words)
urls = save_urls(url)
save_pics(search_words,urls)
time.sleep(2)
大功告成:
注意,仅供学习使用,建议不要密集大数量采集,避免服务器压力过大。
- CSS魔法堂:重拾Border之——图片作边框
- Mobile Web中URL设计问题
- 使用root用户连接Ubuntu16.04时,提示SSH连接被拒绝
- CSS魔法堂:Box-Shadow没那么简单啦:)
- java操作redis: 将string、list、map、自定义的对象保存到redis中
- 运行第一个Docker容器-Docker for Web Developers(1)
- 手动实现jQuery Tools里面tab功能
- Angular企业级开发(9)-前后端分离之后添加验证码
- 基于thrift的微服务框架
- Sublime Text 快速格式化
- HTML中拖放介绍
- 打造高效前端工作环境 - tmux
- 基于thrift的微服务框架
- thrift中的超时(timeout)坑
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- React-Redux 100行代码简易版探究原理。
- Ansible-免密登录与主机清单Inventory
- 安装Ambari和HDP
- React中引入Vue3的@vue/reactivity 实现响应式状态管理
- Ansible Ad-Hoc与常用模块
- Ansible Playbook 初识
- Ansible Playbook 变量与 register 详解
- 初探 Spark ML 第一部分
- Ansible Facts 变量详解 添加用户账号Ansible 配置清单Inventory
- Ansible playbook 编程
- 前端工程师自检清单73答
- Ansible playbook Vault 加密
- MySQL主从复制
- Ansible Jinja2 模板使用
- 自动化运维工具Ansible之Tests测验详解