30分钟编写一个抓取 Unsplash 图片的 Python爬虫

我一直想用 Python and Selenium 创建一个网页爬虫,但从来没有实现它。 几天前, 我决定尝试一下,这听起来可能是挺复杂的, 然而编写代码从 Unsplash 抓取一些美丽的图片还是挺容易的。

PS:很多人在学习Python的过程中,往往因为遇问题解决不了或者没好的教程从而导致自己放弃,为此我整理啦从基础的python脚本到web开发、爬虫、django、数据挖掘等【PDF等】需要的可以进Python全栈开发交流.裙 :一久武其而而流一思(数字的谐音)转换下可以找到了,里面有最新Python教程项目可拿,不懂的问题有老司机解决哦,一起相互监督共同进步!

简易图片爬虫的组成部分

简易图片爬虫的制作

把所有东西都安装好了么?不错!跟着我们的代码,我将开始解释我们每一个爬虫原料的作用。

第一件事情,我们将 把 Selenium webdriver 和 geckodriver 结合起来去打开一个为我们工作的浏览器窗口。首先,在 Pycharm 里创建一个项目,根据你的系统下载最新的 geckodriver , 打开下载的压缩文件然后把 geckodriver 文件放到你的项目文件夹里。 Geckodriver 是 Selenium 控制 Firefox 的基础, 因此我们需要把它放到我们项目的文件夹里面,来让我们能使用浏览器。

接下来我们要做的就是在代码中导入 Selenium 的 webdriver 并且连接我们想要连接的 URL,所以让我们这样做吧:


from selenium import webdriver
# 你想打开的url地址
url = "https://unsplash.com"
# 用Selenium的webdriver去打开页面
driver = webdriver.Firefox(executable_path=r‘geckodriver.exe‘)
driver.get(url)

一个远程控制的 Firefox 窗口

很简单,是吧? 如果你每一步都操作正确, 你已经度过了困难的一部分,你应该看到和上面展示图片类似的浏览器窗口。

接下来,我们应该下滑页面,这样在我们下载图片之前可以加载更多的图片。我们还需要等待几秒钟,以防万一网络连接缓慢,图片加载不全。由于 Unsplash 是基于 React 构建的, 等待 5 秒钟似乎是合适的时间,因此我们使用 time 包来进行等待的操作。我们还需要使用一些 Javascript 代码来滚动页面 。
---?我们将使用 window.scrollTo() 来完成这个。把它们放到一起, 你应该得到这样的代码:

unscrape.py

import time
from selenium import webdriver

url = "https://unsplash.com"

driver = webdriver.Firefox(executable_path=r‘geckodriver.exe‘)
driver.get(url)
# 滚动页面,然后等待5秒
driver.execute_script("window.scrollTo(0,1000);")
time.sleep(5)

滚动页面,然后等待 5 秒

在测试上面的代码后,你应该看到浏览器向下滚动一些,下一件我们需要做的事情是在网页上找到那些我们想要下载的图片。在解析 recat 生成代码后,我发现我们能用 CSS 选择器在页面代码里面定位我们想要的图片。也许页面具体的布局和代码在未来可能会改变, 但是在我写代码的这个时候我们可以用 #gridMulti img 选择器来获取所有出现在屏幕里面的  <img> 标签元素

我们能用 find_elements_by_css_selector() 得到这些标签元素的 list 集合,但是我们想要的却是是每个标签元素的 src 的属性。所以,我们可以遍历 list 集合然后抓取它们:

unscrape.py

import time
from selenium import webdriver

url = "https://unsplash.com"

driver = webdriver.Firefox(executable_path=r‘geckodriver.exe‘)
driver.get(url)

driver.execute_script("window.scrollTo(0,1000);")
time.sleep(5)
# 选择图片标签元素,打印它们的URL
image_elements = driver.find_elements_by_css_selector("#gridMulti img")
for image_element in image_elements:
    image_url = image_element.get_attribute("src")
    print(image_url)

选择图片标签元素,打印它们的 URL

现在,为了真正得到我们找到的图片,我们将使用 requests 包和一部分 PIL 包,即 Image。我们还需要使用 io 包里面的 BytesIO 来把图片写入一个 ./images/ 的文件夹,我们要在我们的项目文件夹里面创建这个文件。 这样,把所有东西组合在一起,我们需要给每个图片的 URL 发送一个 HTTP 的 GET 请求,然后使用 Image 和 BytesIO,我们可以在我们得到的响应里面存储图片,这里是一个方法来实现这一步骤 :

unscrape.py

import requests
import time
from selenium import webdriver
from PIL import Image
from io import BytesIO

url = "https://unsplash.com"

driver = webdriver.Firefox(executable_path=r‘geckodriver.exe‘)
driver.get(url)

driver.execute_script("window.scrollTo(0,1000);")
time.sleep(5)
image_elements = driver.find_elements_by_css_selector("#gridMulti img")
i = 0

for image_element in image_elements:
    image_url = image_element.get_attribute("src")
    # 发送一个HTTP的GET请求,在响应里面获取并存储图片
    image_object = requests.get(image_url)
    image = Image.open(BytesIO(image_object.content))
    image.save("./images/image" + str(i) + "." + image.format, image.format)
    i += 1

下载图片

下载一大堆免费的图片几乎是你的所有需求了。显而易见的,除非你想设计图片原型或者仅仅需要得到随机的图片,这个小爬虫是没有多大用处的。 因此,我花了一些时间,通过增加了更多的特性来提升它:

  • 允许用户使用命令行参数来指定搜索查询的内容,同时使用滚动数值参数,这样允许页面为下载展示更多的图片。
  • 可定制化的 CSS 选择器。
  • 根据搜索查询定制结果的文件夹。
  • 根据需要裁剪缩略图的网址以获得全高清图像。
  • 基于图片的 URL 给图片命名。
  • 在程序结束后关闭浏览器窗口。

你可以 (也可能应该) 尝试自己去实现其中的一些功能。可用的完整版的网页爬虫 这里。 记得去单独下载 geckodriver 并将其连接到你的项目,就像文章开头说明的那样 。

限制,思考和未来的改进

这个整体项目都是一个非常简单的概念验证,来看看网页爬虫是怎么实现完成的,意味着有很多事情可以做,来改善这个小工具:

  • 没有记录这些图片的原始上传者是一个很不好的主意,Selenium 是绝对有能力来做这些事情的,所以让每个图片都带着作者的名字。
  • Geckodriver 不应该被放置在项目的文件夹内,而更应该全局安装,并成为 PATH 系统环境变量的一部分。
  • 搜索功能很容易地扩展到包括多个查询,从而可以简化下载大量图片的过程。
  • 默认的浏览器可以从 Firefox 变成 Chrome 或者甚至 PhantomJS 对这类项目来说会好很多。

    总结:很多人在学习Python的过程中,往往因为遇问题解决不了或者没好的教程从而导致自己放弃,为此我整理啦从基础的python脚本到web开发、爬虫、django、数据挖掘等【PDF等】需要的可以进Python全栈开发交流.裙 :一久武其而而流一思(数字的谐音)转换下可以找到了,里面有最新Python教程项目可拿,不懂的问题有老司机解决哦,一起相互监督共同进步
    本文的文字及图片来源于网络加上自己的想法,仅供学习、交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理。

原文地址:https://www.cnblogs.com/chengxuyuanaa/p/12304555.html

时间: 2024-08-29 04:10:24

30分钟编写一个抓取 Unsplash 图片的 Python爬虫的相关文章

从urllib和urllib2基础到一个简单抓取网页图片的小爬虫

urllib最常用的两大功能(个人理解urllib用于辅助urllib2) 1.urllib.urlopen() 2. urllib.urlencode()   #适当的编码,可用于后面的post提交数据 import urllib Dict = {'name' : 'Michael Foord', 'location' : 'Northampton', 'language' : 'Python'} print urllib.urlencode(Dict) urllib2常用的函数 1.最基本的

自动抓取163新闻的Python爬虫源码

Python爬虫的学习,自动抓取163新闻的Python爬虫源码,这是一个用Python语言编写的,自动抓取网易新闻的python爬虫实现方法一文. Python爬虫的抓取思路是:(1)通过分析目标新闻网址 ,分析其中以News.xxx.com 开头的链接(2)获取每一个链接的内容,并做整理合并到事前准备好的.txt 文本中,以便查看各新闻.但是需要注意的是:由于今天的测试对象,网易新闻的格式不是非常统一,所有会有部分漏掉的情况,还能大家见谅.也希望有能力的朋友们帮着改进一下. 自动抓取163新

Python -- 网络编程 -- 抓取网页图片 -- 图虫网

字符串(str)编码成字节码(bytes),字节码解码为字符串 获取当前环境编码:sys.stdin.encoding url编码urllib.parse.quote() url解码urllib.parse.unquote() 列表去重:pages = list(set(pages)) 创建文件夹(可多级创建):os.makedirs(folder)  os.mkdir()只能单级创建 首先分析网页(图虫网)的URL规律: 根网页地址形如: http://tuchong.com/tags/人像/

用nodejs库cheerio抓取网页图片

之前都是PHP(phpQuery)抓取,但jQuery更强大, 于是用nodejs. 只是node-jquery的依赖太多,只好用cheerio 下面是一个抓取脚本: var http = require('http'); var fs = require('fs'); var cheerio = require("cheerio"); var bufferhelper = require("bufferhelper"); var Iconv = require(&

java 抓取网页图片

? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86

5分钟编写一个PHP留言板程序

1.创建数据库 以下为sql代码,推荐采用phpmyadmin创建数据库. CREATE DATABASE IF NOT EXISTS db_liuyan; USE db_liuyan; CREATE TABLE ly( id INTEGER UNSIGNED NOT NULL AUTO_INCREMENT, username VARCHAR(20) NOT NULL, email VARCHAR(100) NOT NULL, content TEXT NOT NULL, date TIMEST

Python3简单爬虫抓取网页图片

现在网上有很多python2写的爬虫抓取网页图片的实例,但不适用新手(新手都使用python3环境,不兼容python2),所以我用Python3的语法写了一个简单抓取网页图片的实例,希望能够帮助到大家,并希望大家批评指正. 1 import urllib.request 2 import re 3 import os 4 import urllib 5 #根据给定的网址来获取网页详细信息,得到的html就是网页的源代码 6 def getHtml(url): 7 page = urllib.r

抓取MM图片的爬虫

刚学python,试着写了个非常简单的爬虫,爬一些MM的鲍照下来.记录一下 #coding=utf-8 import urllib,time import re global x x=0 def getHtml(url): page = urllib.urlopen(url) html = page.read() return html def getImg(html): global x reg = r'original=\'(.+?.jpg)\' width' imgre = re.comp

Python爬虫抓取网页图片

本文通过python 来实现这样一个简单的爬虫功能,把我们想要的图片爬取到本地. 下面就看看如何使用python来实现这样一个功能. # -*- coding: utf-8 -*- import urllib import re import time import os #显示下载进度 def schedule(a,b,c): ''''' a:已经下载的数据块 b:数据块的大小 c:远程文件的大小 ''' per = 100.0 * a * b / c if per > 100 : per =