我的第六个项目:实现一个任意图片下载器
点击上方蓝色字体,关注程序员zhenguo
你好,我是 zhenguo
这是我的第498篇原创
这是第六个Python小项目,做一个图片下载器。
之前项目:
我的第五个项目:实现一个文本定位器
我的第四个项目:Python自动生成密码
爬取网易云音乐每日推荐歌单,然后定时自动发送到朋友邮箱
我的第二个Python趣味项目,来了!
我的第一个Python实用项目,来了!
输入关键词,即可批量下载对应关键词的图片。
项目环境
使用os
、json
内置模块,分别用于下载图片后文件系统建立,API的参数以json串封装。
requests
模块是爬虫最常用的,用于建立session,下载对应url的图片资源。
Python版本是3.7.2
import os
import json
import requests
项目功能
图片下载器使用方便,只需执行下面一行代码,即可启动模块,在控制台输入:
python baidu_img.py
启动后,提示:请输入搜索关键词,按q退出:
,输入关键词:美景;
又提示:请输入下载图片数量,默认200(回车即取默认值):
,此处直接回车,即默认下载200张;
最后提示:请输入图片保存路径,默认为img(回车即取默认值)
,此处也直接回车。
然后开始下载,控制台打印信息如下,截取部分信息:
开始下载.....
正在下载第1张图片,图片地址:https://img2.baidu.com/it/u=2384681520,223097820&fm=253&fmt=auto&app=138&f=JPEG?w=500&h=281
正在下载第2张图片,图片地址:https://img1.baidu.com/it/u=3647422399,1785273059&fm=253&fmt=auto&app=120&f=JPEG?w=1280&h=800
正在下载第3张图片,图片地址:https://img2.baidu.com/it/u=470784270,1455700935&fm=253&fmt=auto&app=138&f=JPEG?w=748&h=500
正在下载第4张图片,图片地址:https://img1.baidu.com/it/u=2917570607,1493521935&fm=253&fmt=auto&app=138&f=JPEG?w=667&h=500
正在下载第5张图片,图片地址:https://img2.baidu.com/it/u=1135644150,2997736855&fm=253&fmt=auto&app=138&f=JPEG?w=500&h=704
正在下载第6张图片,图片地址:https://img2.baidu.com/it/u=4088752237,542958201&fm=253&fmt=auto&app=138&f=JPEG?w=500&h=625
正在下载第7张图片,图片地址:https://img1.baidu.com/it/u=2570849327,1146996939&fm=253&fmt=auto&app=138&f=JPEG?w=800&h=500
正在下载第8张图片,图片地址:https://img1.baidu.com/it/u=2056884040,2357342393&fm=253&fmt=auto&app=120&f=JPEG?w=1280&h=800
正在下载第9张图片,图片地址:https://img1.baidu.com/it/u=4240260370,854376853&fm=253&fmt=auto&app=120&f=JPEG?w=1281&h=800
正在下载第10张图片,图片地址:https://img1.baidu.com/it/u=3916717742,3432876503&fm=253&fmt=auto&app=138&f=JPEG?w=500&h=332
正在下载第11张图片,图片地址:https://img1.baidu.com/it/u=2664935602,3318592316&fm=253&fmt=auto&app=138&f=JPEG?w=700&h=494
正在下载第12张图片,图片地址:https://img1.baidu.com/it/u=1914896228,578565857&fm=253&fmt=auto&app=138&f=JPEG?w=658&h=434
正在下载第13张图片,图片地址:https://img0.baidu.com/it/u=1749953353,1887143918&fm=253&fmt=auto&app=138&f=JPEG?w=500&h=313
正在下载第14张图片,图片地址:https://img1.baidu.com/it/u=912155388,1485322457&fm=253&fmt=auto&app=138&f=JPEG?w=658&h=439
正在下载第15张图片,图片地址:https://img1.baidu.com/it/u=1947167601,443342984&fm=253&fmt=auto&app=138&f=JPEG?w=889&h=500
正在下载第16张图片,图片地址:https://img0.baidu.com/it/u=1511507281,552216865&fm=253&fmt=auto&app=138&f=JPEG?w=500&h=209
正在下载第17张图片,图片地址:https://img1.baidu.com/it/u=3342591022,1114316885&fm=253&fmt=auto&app=138&f=JPEG?w=500&h=375
正在下载第18张图片,图片地址:https://img0.baidu.com/it/u=1620554767,3986196061&fm=253&fmt=auto&app=138&f=PNG?w=499&h=341
正在下载第19张图片,图片地址:https://img0.baidu.com/it/u=1795137323,1400650075&fm=253&fmt=auto&app=138&f=JPEG?w=858&h=500
很快下载完成后,默认保存到img
文件夹,同时以关键词命名的文件夹中。
查看后应该会有200张美景图片,下面是前三张美景图:
输入关键词晚霞
,输入1000,即下载1000张晚霞图,前五张晚霞图:
输入关键词高圆圆
,输入100,前三张图:
你可以输入任意其他关键词,一次批量下载对应数量的图片。
下面介绍这个下载器的代码,完整代码见文末。
项目原理
输入美景,出来网页中,再点击百度图片,就会出现下面网页:
对应的url为:
https://image.baidu.com/search/index?ie=utf-8&tn=baiduimage&word=%E7%BE%8E%E6%99%AF
点击右键,选择检查,再选择Network
,再刷新下网页,就可以看到使用的所有资源。
根据上面url,在左上角筛选框里,输入search
,尝试筛选出真正请求的API,找到对应的参数:
在左侧不断滚动鼠标,看到下面图所示的acjson链接不断增多,这就是在不断请求服务器:
再点击右侧的payload,如下图所示,看到发送的json串参数:
tn: resultjson_com
logid: 11341948550389857636
ipn: rj
ct: 201326592
is:
fp: result
fr:
word: 美景
queryWord: 美景
cl:
lm:
ie: utf-8
oe: utf-8
adpicid:
st:
z:
ic:
hd:
latest:
copyright:
s:
se:
tab:
width:
height:
face:
istype:
qc:
nc:
expermode:
nojc:
isAsync:
pn: 90
rn: 30
gsm: 5a
1642323736936:
看到大部分参数是空的,word
和queryWord
就是我们输入的关键词,ie
是编码。
至于pn
参数是最重要的一个参数,当不断滚动鼠标,依次加载图片时,发现pn
参数以30步长累加,因此判断是分页相关的参数。
rn
,gsm
等参数先按照默认值取值。
有了API,再根据返回的数据,解析之即可。
代码解释
代码框架只有一个baidu_img
模块组成,模块里主要有BaiduImgDownloader
类。
BaiduImgDownloader类
类包括1个对外公开方法:downloader
,用于下载图片,里面引用2个自定义方法:
其中__get_img_url
用于获取每个图片文件的url,__download_img
用于下载每张图片。
__get_img_url
方法
主要包括构造发送的参数,返回得到图片数据data
:
def __get_img_url(self):print('开始下载.....')imgs_per_page = 30page_nos = max(1, self.max_scrape_img_n // imgs_per_page + 1)parameters = [{'tn': 'resultjson_com','ipn': 'rj','ct': 201326592,'is': '','fp': 'result','fr': '','word': self.keyword,'queryWord': self.keyword,'cl': '','lm': '','ie': 'utf-8','oe': 'utf-8','adpicid': '','st': '','z': '','ic': '','hd': '','latest': '','copyright': '','s': '','se': '','tab': '','width': '','height': '','face': '','istype': '','qc': '','nc': '','expermode': '','nojc': '','isAsync': '','pn': 30 * (page_no + 1),'rn': 30,'gsm': '5a','1642323736936': ''} for page_no in range(page_nos)]urls = []for param in parameters:try:data = self.__sess.get(self.__original_url, params=param).json().get('data')img_urls = [d['thumbURL'] for d in data[:imgs_per_page]]urls.extend(img_urls)except json.decoder.JSONDecodeError:print("解析错误")return urls
main
启动一次模块,支持多次对应关键词的图片批量下载:
if __name__ == '__main__':bid = BaiduImgDownloader()while True:keyword = input("请输入搜索关键词,按q退出:")if keyword == 'q':breakimg_n = input("请输入下载图片数量,默认200(回车即取默认值):")img_n = 200 if not img_n else int(img_n)save = input("请输入图片保存路径,默认为img(回车即取默认值):")save = 'img' if not save else savebid.downloader(keyword, img_n, save)
项目测试
截止2021年1月16日,测试未发现bug。
完整代码下载
上面完整py代码文件,可以在我的公众号后台回复:c,之前的所有项目代码也都在这个文件夹里:
长按关注,回复c
不用打赏,点个赞或在看
就心满意足了
我的第六个项目:实现一个任意图片下载器相关推荐
- Python3爬虫——用selenium获取歌曲id,做一个音乐下载器
我们之前已经学习了selenium的简单实用,现在就来实战下,我们通过selenium获取歌曲的id,然后通过网易云音乐的外链地址来下载音乐,做一个音乐下载器(此项目仅供教学使用),下面我们先来看一下 ...
- python tkinter下载器_下载小说还要去找网站?Python使用tkinter打造一个小说下载器...
前言 今天教大家用户Python GUI编程--tkinter 打造一个小说下载器,想看什么小说,就下载什么小说 先看下效果图 Tkinter 是使用 python 进行窗口视窗设计的模块.Tkint ...
- python下载论文_Python实现一个论文下载器的过程
在科研学习的过程中,我们难免需要查询相关的文献资料,而想必很多小伙伴都知道SCI-HUB,此乃一大神器,它可以帮助我们搜索相关论文并下载其原文.可以说,SCI-HUB造福了众多科研人员,用起来也是&q ...
- 【Python】实现一个小说下载器,可以打包成exe(附原码)
前言 闲的无聊,现在没得什么好剧追(你们或许可以给我推荐推荐) 朋友都在看小说,那我就来用Python搞一个小说下载器吧 顺便打包一下 实现步骤 爬虫基本四个步骤: 采集一章小说内容 发送请求, 模拟 ...
- Python实现一个论文下载器
在科研学习的过程中,我们难免需要查询相关的文献资料,而想必很多小伙伴都知道SCI-HUB,此乃一大神器,它可以帮助我们搜索相关论文并下载其原文.可以说,SCI-HUB造福了众多科研人员,用起来也是&q ...
- python 小说下载工具_使用tkinter打造一个小说下载器,想看什么小说,就下什么...
前言 今天教大家用户Python GUI编程--tkinter 打造一个小说下载器,想看什么小说,就下载什么小说 先看下效果图 Tkinter 是使用 python 进行窗口视窗设计的模块.Tkint ...
- python批量下载文件只有1kb_详解如何用python实现一个简单下载器的服务端和客户端...
话不多说,先看代码: 客户端: import socket def main(): #creat: download_client=socket.socket(socket.AF_INET,socke ...
- 利用python自己动手制作一个音乐下载器,想听什么歌自己下就好了。
本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理 一.前言 之前大家有没有过从电脑上下载歌曲MP3文件放到手机内存卡的经历,随着时代 ...
- 如何用python创建一个下载网站-详解如何用python实现一个简单下载器的服务端和客户端...
话不多说,先看代码: 客户端: import socket def main(): #creat: download_client=socket.socket(socket.AF_INET,socke ...
最新文章
- 原子变量、锁、内存屏障,写得非常好!
- STL 之随机访问迭代器
- crontab简单小结(实用)
- bootstrap table列宽设置无效解决
- 如何通过网页方式将jar包上传到nexus?
- 服装商品销售数据分析
- 软件测试——测试分类及测试工具的简介
- 解决PageHelper版本不匹配,结果可能全部返回问题
- 一文学明白数据库系统--数据库系统期末复习--从入门到入考场--考前抄ppt系列
- 阿里云本地SSD型实例i2gne云服务器配置性能详解
- 尚硅谷前端-京东左侧导航栏及网易新闻列表练习——CSS
- Django中关于模板的查找顺序
- 国外有哪些比较好的电子技术方面的网站论坛推荐? - 知乎
- 如何在python中表示微分_Python实现自动微分(Automatic Differentiation)
- c语言中有裁剪字符串的函数吗,C语言中的字符串截取函数
- C#中“public string Name { get; set; }”什么意思?
- 成功把Ubuntu安装到U盘完整教程!
- 百家姓姓名头像图标素材, 无复姓, 近500个姓名汉字图 持续更新中
- 如何有效地与开发人员一起工作(二)
- 计算机英语2000字论文范文,★计算机专业英语论文参考文献_计算机专业英语参考资料范文_计算机专业英语外文参考文献...
热门文章
- 关于把文章分享到facebook,google,twtter,whatsapp的总结
- MLDN —— Java学习圣经
- 《AI Utopia or Dystopia (DAC‘20)》阅读笔记
- 玩转扑克,基于MobileNetV2-YOLO-Fastest目标检测模型实现puke检测识别
- 何山无石,何水无鱼,何女无夫,何子无父,何树无枝,何城无市
- 大二之前此博客不会有太多的更新
- ValueError: module functions cannot set METH_CLASS or METH_STATIC 的快速处理方法
- python类的继承,白月黑羽笔记01
- python爬虫免费python课程
- java 指定垃g1圾收集_java垃圾回收G1收集器