点击上方蓝色字体,关注程序员zhenguo

你好,我是 zhenguo

这是我的第498篇原创

这是第六个Python小项目,做一个图片下载器。

之前项目:

我的第五个项目:实现一个文本定位器

我的第四个项目:Python自动生成密码

爬取网易云音乐每日推荐歌单,然后定时自动发送到朋友邮箱

我的第二个Python趣味项目,来了!

我的第一个Python实用项目,来了!

输入关键词,即可批量下载对应关键词的图片。

项目环境

使用osjson内置模块,分别用于下载图片后文件系统建立,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:

看到大部分参数是空的,wordqueryWord就是我们输入的关键词,ie是编码。

至于pn参数是最重要的一个参数,当不断滚动鼠标,依次加载图片时,发现pn参数以30步长累加,因此判断是分页相关的参数。

rngsm等参数先按照默认值取值。

有了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

不用打赏,点个赞或在看

就心满意足了

我的第六个项目:实现一个任意图片下载器相关推荐

  1. Python3爬虫——用selenium获取歌曲id,做一个音乐下载器

    我们之前已经学习了selenium的简单实用,现在就来实战下,我们通过selenium获取歌曲的id,然后通过网易云音乐的外链地址来下载音乐,做一个音乐下载器(此项目仅供教学使用),下面我们先来看一下 ...

  2. python tkinter下载器_下载小说还要去找网站?Python使用tkinter打造一个小说下载器...

    前言 今天教大家用户Python GUI编程--tkinter 打造一个小说下载器,想看什么小说,就下载什么小说 先看下效果图 Tkinter 是使用 python 进行窗口视窗设计的模块.Tkint ...

  3. python下载论文_Python实现一个论文下载器的过程

    在科研学习的过程中,我们难免需要查询相关的文献资料,而想必很多小伙伴都知道SCI-HUB,此乃一大神器,它可以帮助我们搜索相关论文并下载其原文.可以说,SCI-HUB造福了众多科研人员,用起来也是&q ...

  4. 【Python】实现一个小说下载器,可以打包成exe(附原码)

    前言 闲的无聊,现在没得什么好剧追(你们或许可以给我推荐推荐) 朋友都在看小说,那我就来用Python搞一个小说下载器吧 顺便打包一下 实现步骤 爬虫基本四个步骤: 采集一章小说内容 发送请求, 模拟 ...

  5. Python实现一个论文下载器

    在科研学习的过程中,我们难免需要查询相关的文献资料,而想必很多小伙伴都知道SCI-HUB,此乃一大神器,它可以帮助我们搜索相关论文并下载其原文.可以说,SCI-HUB造福了众多科研人员,用起来也是&q ...

  6. python 小说下载工具_使用tkinter打造一个小说下载器,想看什么小说,就下什么...

    前言 今天教大家用户Python GUI编程--tkinter 打造一个小说下载器,想看什么小说,就下载什么小说 先看下效果图 Tkinter 是使用 python 进行窗口视窗设计的模块.Tkint ...

  7. python批量下载文件只有1kb_详解如何用python实现一个简单下载器的服务端和客户端...

    话不多说,先看代码: 客户端: import socket def main(): #creat: download_client=socket.socket(socket.AF_INET,socke ...

  8. 利用python自己动手制作一个音乐下载器,想听什么歌自己下就好了。

    本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理 一.前言 之前大家有没有过从电脑上下载歌曲MP3文件放到手机内存卡的经历,随着时代 ...

  9. 如何用python创建一个下载网站-详解如何用python实现一个简单下载器的服务端和客户端...

    话不多说,先看代码: 客户端: import socket def main(): #creat: download_client=socket.socket(socket.AF_INET,socke ...

最新文章

  1. 原子变量、锁、内存屏障,写得非常好!
  2. STL 之随机访问迭代器
  3. crontab简单小结(实用)
  4. bootstrap table列宽设置无效解决
  5. 如何通过网页方式将jar包上传到nexus?
  6. 服装商品销售数据分析
  7. 软件测试——测试分类及测试工具的简介
  8. 解决PageHelper版本不匹配,结果可能全部返回问题
  9. 一文学明白数据库系统--数据库系统期末复习--从入门到入考场--考前抄ppt系列
  10. 阿里云本地SSD型实例i2gne云服务器配置性能详解
  11. 尚硅谷前端-京东左侧导航栏及网易新闻列表练习——CSS
  12. Django中关于模板的查找顺序
  13. 国外有哪些比较好的电子技术方面的网站论坛推荐? - 知乎
  14. 如何在python中表示微分_Python实现自动微分(Automatic Differentiation)
  15. c语言中有裁剪字符串的函数吗,C语言中的字符串截取函数
  16. C#中“public string Name { get; set; }”什么意思?
  17. 成功把Ubuntu安装到U盘完整教程!
  18. 百家姓姓名头像图标素材, 无复姓, 近500个姓名汉字图 持续更新中
  19. 如何有效地与开发人员一起工作(二)
  20. 计算机英语2000字论文范文,★计算机专业英语论文参考文献_计算机专业英语参考资料范文_计算机专业英语外文参考文献...

热门文章

  1. 关于把文章分享到facebook,google,twtter,whatsapp的总结
  2. MLDN —— Java学习圣经
  3. 《AI Utopia or Dystopia (DAC‘20)》阅读笔记
  4. 玩转扑克,基于MobileNetV2-YOLO-Fastest目标检测模型实现puke检测识别
  5. 何山无石,何水无鱼,何女无夫,何子无父,何树无枝,何城无市
  6. 大二之前此博客不会有太多的更新
  7. ValueError: module functions cannot set METH_CLASS or METH_STATIC 的快速处理方法
  8. python类的继承,白月黑羽笔记01
  9. python爬虫免费python课程
  10. java 指定垃g1圾收集_java垃圾回收G1收集器