这个例子网上很多,我主要参考了:
https://www.geek-share.com/detail/2788246674.html
https://www.zhihu.com/question/27621722/answers/updated
https://blog.csdn.net/weixin_44318830/article/details/102807980
https://www.jianshu.com/p/33bee611fa7d
很多这类的例子,本次实验是根据输入的内容,来自动下载百度搜索的图片。
1、导入库
# -*- encoding: utf-8 -*-
import requests
import re
import os
2、定义自动下载函数
# 定义下载图片的方法
def downloadPic(url, path):
i = 0 #计算和图片命名
html = requests.get(url).text
pic_url = re.findall('"objURL":"(.*?)",', html, re.S)
for each in pic_url:
print("正在下载第" + str(i) + "张图片,图片地址:" + each)
try:
# 可能有些图片存在网址打不开的情况,这里设置一个5秒的超时控制
pic = requests.get(each, timeout=5)
except Exception: # 出现异常直接跳过
print("Error! 当前图片无法下载")
continue # 跳过本次循环
# 定义变量保存图片的路径
string = path + "/" + str(i) + ".jpg"
fp = open(string, 'wb')
fp.write(pic.content)
fp.close()
i += 1
html = requests.get(url).text
上面这句话表示获取网页内容
pic_url = re.findall('"objURL":"(.*?)",', html, re.S)
这句话表示用正则表达式去匹配图片的链接,为什么要这么写呢?https://juejin.im/post/5a75c4cd5188257a814ce496,这个链接有解释。意思就是说,通过开发者F12工具很难找到图片下载的链接,我们需要网页源代码来寻找,就很方便,因为前面都是"objURL"
,直接搜索就可以。例如,我自己查看网页源代码如下:
此时最好用源代码来查看,如果用开发者模式F12,用bs4来查找就很困难。
3、程序入口
if __name__ == '__main__': # 主程序
name = input("请输入您想要下载的图片:")
# 先根据搜索的关键字判断存放该类别的文件夹是否存在,不存在则创建
path = r"C:/spyder/baiduImg/imges/" + name
if not os.path.exists(path):
os.mkdir(path)
# 根据输入的内容构建url列表推导式,百度图片搜索每页20张图片
urls = [
'http://image.baidu.com/search/flip?tn=baiduimage&ie=utf-8&word=' + name +
'&ct=201326592&v=flip&pn={}'.format(str(i)) for i in range(0,100,20)] #这里自己定义
for url in urls:
downloadPic(url, path)
print("下载完成!")
最后便可以在电脑上看下载的图片了。