需求说明
以上为不相同的图片的地址,如果手动下载需要一个一个的打开网站,但是使用python既可以一键完成.
- 多个图片;
- 需要登陆验证,网站有防机器人措施,无法使用循环下载;
- 图片地址在csv文件中.
实现
读取csv文件
一、 导入csv模块
import csv
二、读取csv文件
import csv
import os
csv_file = csv.reader(open('D:\\数据.csv','r',encoding='utf-8'))
for info in csv_file:
url_1 = info[4] # 4代表url所在csv文件中的列索引,从0开始
调用浏览器下载图片
这里以谷歌浏览器为例,如果使用其他浏览器请找度娘寻找相应的教程.
一、下载浏览器驱动
- 地址栏输入:chrome://settings/help,查找当前浏览器的版本;
- 根据对应版本下载chromedriver驱动;
- 驱动下载地址1:http://npm.taobao.org/mirrors/chromedriver/
- 驱动下载地址2:http://chromedriver.storage.googleapis.com/index.html
下载之后解压到谷歌浏览器的安装目录即可.
二、安装python的selenium模块
pip install selenium
三、调用浏览器输入密码后自动循环下载图片
修改之前的代码:
import csv
import requests
import os
from selenium import webdriver
import time
# 读取csv文件
csv_file = csv.reader(open('D:\\数据.csv','r',encoding='utf-8'))
# 调用刚刚下载的驱动
browser = webdriver.Chrome('C:\Program Files (x86)\Google\Chrome\Application\chromedriver.exe')
# 遍历csv文件每行链接
i = 0 # 判断是第几次进入网站
for info in csv_file:
url_1 = info[4] # 4代表url所在csv文件中的列索引,从0开始
# 第一次进入需要输入用户名与密码验证
browser.get(url_1) # 第一次进入
if i == 0:
# 这里需要打开网站的登陆界面,按F12查看网站登陆表单的元素
browser.find_element_by_id("UserName").send_keys("用户名")
browser.find_element_by_id("Password").send_keys("密码")
browser.find_element_by_id("LoginButton").click() # 点击登陆按钮
# 防止网速有延时,导致抢一个还未访问到即开始访问下一个链接,设置休眠5s,
time.sleep(5)
运行代码,这样就可以看到一个新的浏览器打开然后自动下载所需要的图片了.
可直接下载的链接
import csv
import requests
import os
# 读取csv文件
csv_file = csv.reader(open('D:\\数据.csv','r',encoding='utf-8'))
root = 'D:\\下载图片\\' # 保存的路径
headers = {
'User-Agent': "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.71 Safari/537.36"
}
for info in csv_file:
file_name = info[1] + '_' + info[2] + '.jpg' #命名文件
path_1 = root + file_name # 文件名称
try:
# 判断目录是否存在
if not os.path.exists(root):
os.mkdir(root)
# 如果存在
if os.path.exists(path_1):
r1 = requests.get(url_1,headers = headers)
r1.raise_for_status()
# #使用with语句可以不用自己手动关闭已经打开的文件流
with open(path_1,"wb") as f1: #开始写文件,wb代表写二进制文件
f1.write(r1.content)
print(file_name)
else:
print("文件已存在")
except Exception as e:
print("下载失败:" + str(e))
可能会遇到下载的图片无法打开的问题,这样你可以将图片的格式更改为txt
文本格式打开看看,一般网站都有反机器人设置,导致一键下载的图片都无法打开.