如何使用python批量下载-使用 Python + Selenium 批量下载素材

原文首发于CSDN,略有增删

使用 Python + Selenium 批量下载素材

本文简单介绍使用 Python + Selenium 从ManyPixels线上图库批量下载素材的方法。截止到现在(2020/3/13),ManyPixels 上一共有 19 页的插图素材, 437 个文件。手工点击逐个下载是很不实际的,手指都可能点断,有必要使用代码实现程序自动批量下载。

ManyPixels 线上图库

ManyPixels,是一个免费线上图库,主要以收录插图素材为主。插图还可以自定义颜色。提供 PNG,SVG 格式下载。根据许可,ManyPixels 发布于此插图图库的所有素材皆可免费使用,无论是用于非商业或商业用途,无需向创作者或原发布商获得许可,下载后的插图可自由修改、编辑或复制。

e06215b0257b

ManyPixels Illustration Gallery.png

Selenium

Selenium 是一个用于 Web 应用程序测试的工具。支持多平台:windows、linux、MAC ,支持多浏览器:ie、ff、safari、opera、chrome,多语言 C、 java、ruby、python、或者是 C#。「Selenium 测试直接运行在浏览器中,就像真正的用户在操作一样」。嗯,看中的就是:

就像真正的用户在操作一样

初看「批量下载」应该是一个爬虫任务,但为什么要用一个测试工具呢?因为通过右键查看 ManyPixels 的源码和普通的页面很不一样,根本看不到图片的标签。这就不能用传统的urllib.request或者是Scrapy了。在这里我不需要效率,只作为业余使用的工具,怎么方便怎么来,也懒得去深入urllib.request或者是Scrapy,就像用户去一个一个图片点击下载一样,那就是 Selenium 了。要在 Python 中使用 Selenium,先通过pip安装:pip install selenium,然后还得配合chromedriver才能使用(如果是 Chrome 浏览器),而且得是对应的版本。

2020/3/14 更新,为方便 selenium 初学者使用,特上传到 CSDN 资源供各位下载,版本为 chromedriver win32,匹配最新的 Chrome81,下载地址为:https://download.csdn.net/download/chenbingcai/12247260

代码实现

因为我的工作语言不是 Python,作为工具,可能有点乱,完全不是Pythonic,这里只是提供一种思路。代码在运行中出现了以下几个问题,经调试在我本机环境上可成功运行。在这里我是下载 SVG 版本,而不是 PNG 版本,因为 SVG 在后期还可以通过svg-inject等 JS 库在网页中动态修改。

ssl_client_socket_impl.cc(941)] handshake failed

解决办法:ChromeOptions添加一个参数:opt.add_argument('--ignore-certificate-errors')

HTML 元素无法执行click事件

解决办法:通过 JS 选择这个元素,然后执行这段 JS,driver.execute_script(js)

gcm_channel_status_request.cc(145) GCM channel request failed

解决办法:这个错误暂时无法解决,但并不影响本次运行功能。

no such element

解决办法:可能是元素的xpath不正确,或页面没加载完成。在 Chrome 开发者工具中选中元素,右键Copy XPath;等待页面加载完成,until(),在这里我偷懒,简单粗暴的用了time.sleep(),不可取。这里通通清一式用find_element_by_xpath()可能也不是一个好的方法,只是目前刚好能成功运行。另外,判断元素是否存在,我是用了try except实现,或者还有更好的方法吧。

最后,抛砖引玉,以下是本功能的全部代码:

# -*- coding: utf-8 -*-

from selenium import webdriver

import time

import random

def sleep_by_time(seconds=3):

sleep_time=random.random()*seconds

time.sleep(sleep_time)

def download_SVG(xpath,driver):

driver.find_element_by_xpath(xpath).click()

def save_SVG():

opt = webdriver.ChromeOptions()

opt.add_argument('--ignore-certificate-errors')

driver = webdriver.Chrome(options=opt)

driver.maximize_window()

driver.implicitly_wait(30)

driver.get('https://www.manypixels.co/gallery/')

page_count = int(driver.find_element_by_xpath('//*[@id="body"]/div[1]/div/div[2]/ul/li[last()-1]').text) + 1

for i in range(1,page_count):

js = 'document.querySelector("#body > div.style__ContainerIllustrations-sc-1olxldb-2.irWJZG > div > div.style__ContainerGallery-sc-3zib4p-1.bdbuba > div.style__Container-sc-3zib4p-0.iYHiIc > div:nth-child(1)").click()'

driver.execute_script(js)

sleep_by_time()

j = 0

while True:

j = j+1

download_SVG('//*[@id="body"]/div[1]/div/div[1]/div[2]/div[2]/button[1]',driver)

if j == 1:

next_span = driver.find_element_by_xpath('//*[@id="body"]/div[1]/div/div[1]/div[2]/div[3]/span')

else:

try:

next_span = driver.find_element_by_xpath('//*[@id="body"]/div[1]/div/div[1]/div[2]/div[4]/span')

except :

driver.find_element_by_xpath('//*[@id="body"]/div[1]/div/div[1]/div[2]/div[1]/span').click()

break

next_span.click()

sleep_by_time(5)

# 下一页

try:

driver.find_element_by_xpath('//*[@id="body"]/div[1]/div/div[2]/ul/li[last()]').click()

except:

break

sleep_by_time()

driver.close()

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值