Python爬虫帮你自建无版权图片素材库!
电脑硬盘里的图片
收藏夹的照片(硬盘里的女神)看了又删,去年夏天后就没聊过天
一盏一盏街灯烘焙了夜,只有手中烟在寂寞地渲染。
很久前有这么一首歌很火,不知道大家听过没,只是括号里的歌词被改成了现在的样子。那么,你们以为我今晚要开车?NONONO...
每天做公众号,最愁的两件事,一是选题,二是公众号配图。不知道写什么,比写代码遇到坑更让人发愁。那么配图呢?配图的坑主要在于,选择的图首先要有美感或者和文章主题有所关联,最重要的是你选择的图必须是没有版权的。不然容易遭到投诉...网上推荐了很多免费的床图网站,我一直用的是pixabay:https://pixabay.com
很多床图网站为什么选择它?一个是这个网站有百度云加速,虽然速度还是很卡( 同样这里也是个坑,一会儿解释),而且预览图片时,不会添加网站的水印,你可以通过f12获取url的方式去下载图片,而无需注册后点进行下载,但是每次通过f12获取url的方式下载图片,有点太耗费时间了,所以今天就教大家通过python自动下载网站的所有图片,并巧妙实现网站的搜索引擎功能。
先来填个坑
大坑解析
上面说到了,网站支持百度云加速,但同样的百度为了判断你是否为爬虫访问,会对浏览器进行监测。首次访问网站(有的运气好会访问几次后出现验证...),需要填写验证码确认非程序爬虫。之后才能正常使用。
但如果是拿requests进行url访问下载,怎么去破解?网上很多说什么js获取验证的,对于requests来说都不靠谱,当然你可以换成selenium前台模拟浏览器操作解析验证码然后去下载,先不说这验证码解析成果率多低,selenium的爬虫速度能和requests比?
我们该如何解决这个问题?我们先老老实实的输入验证码,然后看下面这张图:
pixabay.com网站存在7个cookie(显示9个是另外一个网站的...),然后一个一个查每个cookie的详细信息,连蒙带猜+验证,最后确定了,控制百度云的cookie有效期是通过 cf_clearance时间来控制的,有效时长为 一个半小时!
喜欢钻研的朋友可以考虑怎么修改这个时间,但对我来说,一个半小时够做太多东西了...
requests跳过百度云监测
知道了是由于cookie验证导致的访问异常,那我们该怎么做?通过headers添加cookie!
# -*- coding: utf-8 -*-
# @Author : 王翔
# @JianShu : 清风Python
# @Date : 2019/7/25 23:55
# @Software : PyCharm
# @version :Python 3.7.3
# @File : picture_download.pyimport requests
from bs4 import BeautifulSoupheaders = {"User-Agent": "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36","cookie":"__cfduid=dd2de4b5c79a4979c835e6925d31ad9741563739527; lang=zh; _ga=GA1.2.1567947853.1563739352; is_human=1; _gid=GA1.2.366594473.1564068124; cf_clearance=bb9e4a5a869c0a90e552c4a1f4e1dccc67dc021f-1564074082-1800-250; client_width=1903"
}
#
r =requests.get('https://pixabay.com/zh/images/search/',headers=headers)
print(r.text)
网站爬虫分析
再来个坑
刚才说了网站的图片是动态加载的,这个有什么坑呢?代码说话:
import requests
from bs4 import BeautifulSoupheaders = {"User-Agent": "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36","cookie": "____cfduid=dd2de4b5c79a4979c835e6925d31ad9741563739527; lang=zh; _ga=GA1.2.1567947853.1563739352; is_human=1; _gid=GA1.2.366594473.1564068124; cf_clearance=2dfa6eddfa8309a53f97f2682d2fccf03ec6d4e2-1564078000-1800-250; client_width=1028"
}
#
r = requests.get('https://pixabay.com/zh/images/search/%E4%B9%A6/?pagi=4', headers=headers)
soup = BeautifulSoup(r.text, 'lxml')
items = soup.find("div", {"class": "search_results"}).find_all("div", {"class": "item"})
for item in items:img = item.a.imgprint(img.attrs)
我们会发现前十几张的url链接保存在 srcset中,而之后的80+张图片他的url包裹在 data-lazy-srcset中,后者的src也是默认的 blank.gif的空白幕布,还么来得及把图片刷出来...
所以爬虫的时候我们需要小心了…如何快捷的判断到底使用哪个 attr?这里用到一个python的 or方法,举个例子:
b = None or "abc"
b
>>> 'abc'
b = "abc" or None
b
>>> 'abc'
这样大家明白了吧,我们只需要 img.attrs.get('srcset')即可。
只有你抠细节,才能成长!所以我问你,srcset放在or前还是data-lazy-srcset放在or前?再看一个例子:
b = "abc" or 0/0
b
>>> 'abc'
b = 0/0 or 'abc'
>>> Traceback (most recent call last):File "<input>", line 1, in <module>
ZeroDivisionError: division by zero
当python遇到or运算时,如果第一个条件成立,那么直接返回数值,而不关注or后的表达式了!所以data-lazy-srcset有80+个,我们应该把它放在or的左边。够不够抠细节?细节决定成败!
小技巧1:指定内容检索
如何将我们的图片进行分类呢,网站的url也比较简单:
https://pixabay.com/zh/images/search/%E4%B9%A6/?pagi=2
search后的编码,通过from urllib.parse import quote即可获取,然后就是page的数字通过for循环匹配即可。
小技巧2:保存图片索引
这里可是一个彩蛋了!大家都知道img一般都有一个alt的选项,即当图片显示不出来时,通过alt告诉大家这个图片是干嘛的!比如这些:
如果我们在保存图片的时候将图片名字中添加alt索引,之后我们通过windows自带的查找不就可以进行模拟网站的检索功能了么?是不是很鸡贼?哈哈...
小技巧3:获取高像素的图片
刚才我们看到了,默认的url是__340.jpg,像素比较低,但如果我们点击每个a标签的链接进入每个单张图的地址,会看到720p的中品质图片,那么要改链接一个一个解析?不用那么麻烦,这个网站的中品质图片link对比如下:
https://cdn.pixabay.com/photo/2019/07/22/09/02/landscape-4354610__340.jpg
https://cdn.pixabay.com/photo/2019/07/22/09/02/landscape-4354610_960_720.jpg
所以我们只需要将__340替换为_960_720即可获取高像素的图片了,聪明吧....
代码实现
提前强调一句,对于这种福利性的网站,大家还是下手轻一点,善待它吧!
# -*- coding: utf-8 -*-
# @Author : 王翔
# @微信号 : King_Uranus
# @公众号 : 清风Python
# @GitHub : https://github.com/BreezePython
# @Date : 2019/11/28 23:23
# @Software : PyCharm
# @version :Python 3.7.3
# @File : CareForCoders.pyimport os
import time
import requests
from bs4 import BeautifulSoup
from urllib.parse import quote, urljoin, urlsplit
import threadingclass PictureDownload:BaseUrl = "https://pixabay.com/zh/images/search/"DefaultPages = 5Path = os.path.dirname(os.path.abspath(__file__))def __init__(self):# cookie大家在使用的时候,记得替换...self.headers = {"cache-control":"Cache-control: private, max-age=0, no-cache","cf-ray":"4fc0bf640b4e20be-LAX","set-cookie":"lang=zh; expires=Sun, 22-Jul-2029 20:05:15 GMT; Max-Age=315360000; Path=/","User-Agent": "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36","cookie": "__cfduid=db4c7fedc0b42d0ba4df71f0a6bb61b001564084956; lang=zh; _ga=GA1.2.314030298.1564084752; _gid=GA1.2.2023032267.1564084752; is_human=1; client_width=1903; cf_clearance=65c758669b4c70b8d7300c06185fc16df3861533-1564085107-1800-250; _gat_UA-20223345-1=1"}self.url, self.download_path = self.set_basic()def set_basic(self):_url = urljoin(self.BaseUrl, quote(keyword))_download_Path = os.path.join(self.Path, keyword)if not os.path.exists(_download_Path):os.mkdir(_download_Path)return _url, _download_Pathdef get_url(self):for page in range(self.DefaultPages + 1):parameter = {'pagi': page}r = requests.get(self.url, params=parameter, headers=self.headers, timeout=10)soup = BeautifulSoup(r.text, 'lxml')items = soup.find("div", {"class": "search_results"}).find_all("div", {"class": "item"})for item in items:_img = item.a.img.attrslink = _img.get("data-lazy-srcset") or _img.get("srcset")alt = _img.get('alt')t = threading.Thread(target=self.save_picture, args=(link, alt))t.start()time.sleep(0.2)def save_picture(self, link, alt):_url = link.split(' 1x')[0].replace('__340', '_960_720')_file_name = os.path.join(self.download_path, alt + _url.split('/')[-1])r = requests.get(_url, headers=self.headers, timeout=5)try:with open(_file_name, 'wb') as f:f.write(r.content)print("图片{}下载完成".format(_file_name))except:print("图片{}下载失败".format(_file_name))if __name__ == '__main__':keyword = str(input("请输入所需下载图片的关键字:"))main = PictureDownload()main.get_url()
来看看下载的效果,分别下载了图书、编程分类的图片,默认每个类型下载5页共1000张图片,:
由于部分图片链接失效,最终下载成功989张,总计内存165MB....
另外,刚才让保存alt的用处,现在就可以展示出来了,因为网站的图片检索也是通过关键字的,所以利用windows检索功能就实现了类似网站的检索操作:
是不是很炫酷?
The End
今天的内容就到这里,期待你关注我的公众号清风Python
,如果觉得不错,希望能动动手指转发给你身边的朋友们。
Python帮助万千程序员远离猝死悲剧
将安卓手机打造成你的python全栈开发利器
寒冬袭来,带你使用Flask开发一款天气查询软件吧
程序员的自我救赎,使用python开发性格分析工具
使用python假装黑客,批量破解朋友的网站密码
Python爬虫帮你自建无版权图片素材库!相关推荐
- 6个商用、无版权图片素材网站
很多朋友不知道去哪里找图片素材,网上找的质量不高先不说,就怕使用不当造成侵权.今天给大家分享5个免费.可商用,还高质量的图片素材网站,以后放心大胆的使用,不会侵权. 1.菜鸟图库 https://ww ...
- 商用、无版权图片素材网站,赶紧马住。
很多朋友不知道去哪里找图片素材,网上找的质量不高先不说,就怕使用不当造成侵权.今天给大家分享6个可商用,还高质量的图片素材网站. 1.菜鸟图库 https://www.sucai999.com/pic ...
- 【2022图片素材】免费无版权图片素材网站 | PPT素材 | Word素材 | 吊打百度图片
无侵权风险
- 免费可商用图片素材、高清无版权图片、免费可个人和商业用途图片
1. Unsplash Beautiful, free photos. Gifted by the world's most generous community of photographers. ...
- 【转发】程序员和设计师必备:全球高清无版权图片网站推荐
因为最近做小专栏,然后经常会给自己文章或者小专栏的里面的其他文章挑选一些高清符合文章方向的题图,今天特意整理了下收藏的免费高清无版权图片素材网站,没有聊到多少技术的东西但是足够实用.虽然题目里面写了是 ...
- 买不到口罩怎么办?Python爬虫帮你时刻盯着自动下单!| 原力计划
作者 | 菜园子哇 编辑 | 唐小引 来源 | CSDN 博客 马上上班了,回来的路上,上班地铁上都是非常急需口罩的. 目前也非常难买到正品.发货快的口罩,许多药店都售完了. 并且,淘宝上一些新店口罩 ...
- python爬虫怎么挣钱_买不到口罩怎么办?Python爬虫帮你时刻盯着自动下单!| 原力计划...
作者 | 菜园子哇编辑 | 唐小引来源 | CSDN 博客马上上班了,回来的路上,上班地铁上都是非常急需口罩的.目前也非常难买到正品.发货快的口罩,许多药店都售完了.并且,淘宝上一些新店口罩库存写着非 ...
- 买不到口罩怎么办?Python 爬虫帮你时刻盯着自动下单!| 原力计划
作者 | 菜园子哇 责编 | 唐小引 头图 | 下载自东方 IC 出品 | CSDN 博客 马上上班了,回来的路上,上班地铁上都是非常急需口罩的. 目前也非常难买到正品.发货快的口罩,许多药店都售完了 ...
- Python爬虫帮你抢秒杀
什么是爬虫? 网络爬虫又被称为网页蜘蛛,网络机器人,是一种按照一定的规则,自动地抓取网络信息的程序或者脚本,另外一些不常使用的名字还有蚂蚁.自动索引.模拟程序或者蠕虫. 简单来讲,爬虫就是一个探测机器 ...
最新文章
- 如何给Apache添加虚拟路径和虚拟主机?
- My first App EncryptWheel is in WAITING FOR REVIEW status
- mysql视图_mysql之视图详解
- 华为手机asph啥机型_华为正式宣布!19款机型开启新系统内测,你的手机榜首有名吗?...
- 通过委托增强Spring数据存储库
- uva 138——Street Numbers
- 【原创】软件测试工程师基础技能+
- android滚动条布局平分,让你的布局滚动起来—ScrollView
- python后端开发书籍_后端书籍推荐
- 计算机中如何取消家长控制用户,电脑怎么设置家长控制? 家长控制功能的使用技巧...
- 交叉25码是什么条码
- 抖音热门音乐整理合集歌曲打包分享
- Word论文用的各级标题大小
- matlab 采样开关,UPS单模块10kVA单相电压型SPWM逆变器的Simulink模型建立及仿真分析...
- 软件测试,2019.2.15中移物联网面试心路历程。
- 用turtle作画玩一玩吧
- 第五 python中格式化输入input()函数的使用
- 看完何同学的这期B站视频,我做了个决定...
- Ubuntu18.04运行校园网客户端
- python3 下载.m3u8, 合并视频.ts 文件并合成为mp4格式的视频