Python编程快速上手(七)Unsplash批量下载器

首发于个人博客:http://rhinoc.top/post/python_7.html

程序描述

V1.0
输入关键字搜索图片,模拟页面下拉获取更多图片,页面加载完成后获取图片链接并下载至指定文件夹。

V2.0
解决了V1.0版本存在的两个严重问题。更改为深入二级链接获取图片,从而不再需要等待一级页面加载完毕。

涉及知识点

  • selenium
  • bs4
  • iter_content()
  • javascript

V1.0存在的问题 & V2.0的解决方法

  • 获取图片链接需要预先对页面进行加载,下载图片时相当于进行了二次加载,造成了不必要的网络和时间占用。
  • 即便给予充足的加载时间,页面也不能完全加载,导致捕获到的图片有一千余张而实际有效的图片不足十张。

对于一个图片爬虫来说,连图片都爬不下来得是件多羞耻的事情。所以在面对V1.0版本的诸多不足时,我的当务之急是解决第二个问题,其次再是对程序进行优化。幸运的是,就像问题总是相伴而生一样,解决了第二个问题时,我恰巧也把第一个问题解决了。

首先,疑惑于明明加载了那么久页面却会「获取不到图片链接」,我将加载出来的页面保存下来查看。

page = open(os.path.join(‘pics‘, ‘saved.html‘),‘wb‘)
page.write(soup.encode(‘utf-8‘))

打开saved.html后,我发现虽然图片链接未能加载出来,但是图片所指向的二级链接却赫然在目。

打开二级链接,不出意外,就是我求之而不得的图片。
自然,我就想到,如果在当前这个一级页面不能得到图片链接,是不是可以通过进入二级链接获取图片,而且由于二级链接所指向的页面只有一张图片,图片加载的成功率必然也很高。

如此这般,problems solved ????。

第一版代码

#! python3

import os, bs4, requests, re, time
from selenium.webdriver.chrome.options import Options
from selenium import webdriver

def scroll_down(driver, times):
    print(‘Loading‘,end=‘‘)
    for i in range(times):
        print(‘.‘,end=‘‘)
        driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
        time.sleep(60)
    print(‘‘)

os.makedirs(‘pics‘,exist_ok=True)

keyword = input()
url = ‘https://unsplash.com/search/photos/‘ + keyword

chrome_options = Options()
chrome_options.add_argument(‘--headless‘)
chrome_options.add_argument(‘--disable-gpu‘)
print(‘Setting up the driver‘)
driver = webdriver.Chrome(options=chrome_options, executable_path=‘/usr/local/bin/chromedriver‘)
driver.get(url)
print(‘Driver prepared‘)

scroll_down(driver,3)
soup = bs4.BeautifulSoup(driver.page_source, ‘lxml‘)
page = open(os.path.join(‘pics‘, ‘saved.html‘),‘wb‘)
page.write(soup.encode(‘utf-8‘))
link = soup.find_all(‘img‘,{‘class‘:‘_2zEKz‘})
amount = str(soup.find(‘p‘,{‘class‘:‘_1u88E _1iWCF _27Bp2‘}))
rr = re.compile(r‘.*>(.*?)free.*‘)
amount = rr.findall(amount)[0].strip()
amount = int(amount.replace(‘,‘,‘‘))
print(‘Total: ‘+ str(amount))
print(‘Captured: ‘+ str(len(link)))

count = 0
for piece in link:
    #
    picLk = str(piece.get(‘src‘))
    rr = re.compile(r‘(.* ?)\?‘)
    filename = str(piece.get(‘alt‘)) + ‘.png‘
    if picLk != ‘None‘:
        count += 1
        picLk = rr.findall(picLk)[0]
        print(‘Download from ‘ + picLk + ‘: ‘ + filename )
        picRes = requests.get(picLk)
        if filename == ‘None.png‘:
            imageFile = open(os.path.join(‘pics‘, os.path.basename(picLk)+‘.png‘),‘wb‘)
        else:
            imageFile = open(os.path.join(‘pics‘, filename),‘wb‘)
        for chunk in picRes.iter_content(100000):
             imageFile.write(chunk)
        imageFile.close()

print(‘Valid:‘ + str(count))

  

第二版代码

#! python3

import os, bs4, requests, re, time
from selenium.webdriver.chrome.options import Options
from selenium import webdriver

def scroll_down(driver, times):
    print(‘Loading‘,end=‘‘)
    for i in range(times):
        print(‘.‘,end=‘‘)
        driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
        time.sleep(3)
    print(‘‘)

os.makedirs(‘pics‘,exist_ok=True)

keyword = input()
url = ‘https://unsplash.com/search/photos/‘ + keyword

chrome_options = Options()
chrome_options.add_argument(‘--headless‘)
chrome_options.add_argument(‘--disable-gpu‘)
print(‘Setting up the driver‘)
driver = webdriver.Chrome(options=chrome_options, executable_path=‘/usr/local/bin/chromedriver‘)
driver.get(url)
print(‘Driver prepared‘)

scroll_down(driver,3)
soup = bs4.BeautifulSoup(driver.page_source, ‘lxml‘)
link = soup.find_all(‘a‘,{‘class‘:‘_2Mc8_‘})
amount = str(soup.find(‘p‘,{‘class‘:‘_1u88E _1iWCF _27Bp2‘}))
rr = re.compile(r‘.*>(.*?)free.*‘)
amount = rr.findall(amount)[0].strip()
amount = int(amount.replace(‘,‘,‘‘))
print(‘Total: ‘+ str(amount))
print(‘Captured: ‘+ str(len(link)))

count = 0
for piece in link:
    deepLk = ‘https://unsplash.com‘ + str(piece.get(‘href‘))
    headers = {
        ‘Accept‘: ‘application/json, text/javascript, */*; q=0.01‘,
        ‘Origin‘: ‘http://www.zimuzu.tv‘,
        ‘User-Agent‘: ‘Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36‘,
        ‘Content-Type‘: ‘application/x-www-form-urlencoded‘,
    }
    deepRes = requests.get((deepLk), headers=headers)
    deepSoup = bs4.BeautifulSoup(deepRes.text, "html.parser")
    pic = deepSoup.find(‘img‘,{‘class‘:‘_2zEKz‘})
    try:
        picLk = str(pic.get(‘src‘))
    except:
        print(‘download failed‘)
    rr = re.compile(r‘(.* ?)\?‘)
    filename = str(pic.get(‘alt‘)) + ‘.png‘
    if picLk != ‘None‘:
        count += 1
        picLk = rr.findall(picLk)[0]
        print(‘Download from ‘ + deepLk + ‘: ‘ + filename )
        picRes = requests.get(picLk)
        if filename == ‘None.png‘:
            imageFile = open(os.path.join(‘pics‘, os.path.basename(picLk)+‘.png‘),‘wb‘)
        else:
            imageFile = open(os.path.join(‘pics‘, filename),‘wb‘)
        for chunk in picRes.iter_content(100000):
                imageFile.write(chunk)
        imageFile.close()

  

原文地址:https://www.cnblogs.com/RhinoC/p/10350862.html

时间: 2024-11-06 09:38:08

Python编程快速上手(七)Unsplash批量下载器的相关文章

Python编程快速上手 让繁琐工作自动化 PDF下载

网盘下载地址:Python编程快速上手 让繁琐工作自动化 PDF下载 – 易分享电子书PDF资源网 作者: Albert Sweigart 出版社: 人民邮电出版社 副标题: 让繁琐工作自动化 原作名: Automate the Boring Stuff with Python: Practical Programming for Total Beginners 译者: 王海鹏 出版年: 2016-7-1 页数: 391 内容简介 · · · · · · 如今,人们面临的大多数任务都可以通过编写

入门python:《Python编程快速上手让繁琐工作自动化》中英文PDF+代码

入门推荐学习<python编程快速上手>前6章是python的基础知识,通俗易懂地讲解基础,初学者容易犯错的地方,都会指出来.从第三章开始,每章都有一个实践项目,用来巩固前面所学的知识. 从第七章开始就是书名中的后半部:让繁琐工作自动化.每个章节都可独立出来.每看完一个章节,你都能将其中的知识点融会贯通,用到自己的日常工作中,提高效率.第九章 组织文件对系统管理员非常有用,能够指挥程序完成复制 备份文件(夹)操作.第十一章是web抓取信息,介绍了主流的request beautifulSoup

《Python编程快速上手 让繁琐工作自动化》pdf

<div id="article_content" class="article_content tracking-ad" data-mod="popu_307" data-dsm="post"> <p><br></p><p>下载地址:<a target="_blank" href="https://page74.ctfile.co

Python编程快速上手 让繁琐工作自动化 云图

图书封面 本书简介 本书的第一部分介绍了基本 Python 编程概念,第二部分介绍了一些不同的任务,你可以让计算机自动完成它们.第二部分的每一章都有一些项目程序,供你学习.下面简单介绍一下每章的内容.第一部分: Python 编程基础"第 1 章: Python 基础"介绍了表达式. Python 指令的最基本类型,以及如何使用 Python 交互式环境来尝试运行代码."第 2 章:控制流"解释了如何让程序决定执行哪些指令,以便代码能够智能地响应不同的情况.&quo

《Python编程快速上手:让繁琐工作自动化》【高清中文版PDF+高清英文版PDF+源代码】

下载:https://pan.baidu.com/s/1qs1ETO6yTG8xpdPPzb5dPw Python编程快速上手:让繁琐工作自动化[高清中文版PDF+高清英文版PDF+源代码] 久负盛名的python书籍. 高清中文版412页,高清英文版505 页,配套源代码. 中文和英文两版对比学习, 带书签,可复制粘贴:讲解详细并配有源代码. 一块儿学习探讨,支持正版书籍. 其中,高清中文版如图: 原文地址:http://blog.51cto.com/3215120/2306904

分享《Python编程快速上手:让繁琐工作自动化》【高清中文版PDF+高清英文版PDF+源代码】

下载:https://pan.baidu.com/s/1qs1ETO6yTG8xpdPPzb5dPw Python编程快速上手:让繁琐工作自动化[高清中文版PDF+高清英文版PDF+源代码] 久负盛名的python书籍. 高清中文版412页,高清英文版505 页,均带目录和书签,文字可复制粘贴: 中文和英文两版对比学习:讲解详细并配有源代码.其中高清中文版如图: 原文地址:http://blog.51cto.com/14050767/2311312

Python编程快速上手-让繁琐工作自动化-第二章习题及其答案

Python编程快速上手-让繁琐工作自动化-第二章习题及其答案 1.布尔数据类型的两个值是什么?如何拼写? 答:True和False,使用大写的T和大写的F,其他字母是小写. 2.3个布尔操作符是什么? 答:and.or和not. 3.写出每个布尔操作符的真值表(也就是操作数的每种可能组合,以及操作的结果) 答:and:True and True  -> True True and False -> FalseFalse and True -> FalseFasle and False

Python 编程快速上手 让繁琐工作自动化-第十一章实践项目 11.11.1命令行邮件程序

11.11.1 命令行邮件程序 编写一个程序,通过命令行接受电子邮件地址和文本字符串.然后利用selenium登录到你的邮件账号,将该字符串作为邮件,发送到提供的地址(你也许希望为这个程序建立一个独立的邮件账号).这是为程序添加通知功能的一种好方法.你也可以编写类似的程序,从Facebook 或Twitter 账号发送消息.这个项目弄了好几天,头都快炸了,终于弄好了代码如下:#!/usr/bin/env python#encoding:utf-8 '''@author:Kevinbr/>@aut

Python编程快速上手 让繁琐工作自动化pdf

[下载地址] 如今,人们面临的大多数任务都可以通过编写计算机软件来完成.Python是一种解释型.面向对象.动态数据类型的高级程序设计语言.通过Python编程,我们能够解决现实生活中的很多任务. 本书是一本面向实践的Python编程实用指南.本书的目的,不仅是介绍Python语言的基础知识,而且还通过项目实践教会读者如何应用这些知识和技能.本书的首部分介绍了基本Python编程概念,第二部分介绍了一些不同的任务,通过编写Python程序,可以让计算机自动完成它们.第二部分的每一章都有一些项目程

每周一书《Python编程快速上手 让繁琐工作自动化》分享!

内容简介如今,人们面临的大多数任务都可以通过编写计算机软件来完成.Python是一种解释型.面向对象.动态数据类型的高级程序设计语言.通过Python编程,我们能够解决现实生活中的很多任务. 本书是一本面向实践的Python编程实用指南.本书的目的,不仅是介绍Python语言的基础知识,而且还通过项目实践教会读者如何应用这些知识和技能.本书的首部分介绍了基本Python编程概念,第二部分介绍了一些不同的任务,通过编写Python程序,可以让计算机自动完成它们.第二部分的每一章都有一些项目程序,供