30 分钟编写一个抓取 unsplash 图片的 python 爬虫 | python优质外文翻译 | python 技术论坛-金年会app官方网

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

简易图片爬虫的组成部分

  •  (3.6.3 或者更新版本)
  •  (community edition 版本就可以)
  •  
  •  
  •  (阅读下面的说明)
  •  (如果你没有,去安装一下)
  • 有效的网络连接 (显而易见的)
  • 你的 30 分钟 (可能更少)

简易图片爬虫的制作

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

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

接下来我们要做的就是在代码中导入seleniumwebdriver并且连接我们想要连接的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 代码来滚动页面 。
--- 我们将使用 来完成这个。把它们放到一起, 你应该得到这样的代码:

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 选择器来获取所有出现在屏幕里面的   标签元素

我们能用 得到这些标签元素的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给图片命名。
  • 在程序结束后关闭浏览器窗口。

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

限制, 思考和未来的改进

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

  • 没有记录这些图片的原始上传者是一个很不好的主意,selenium 是绝对有能力来做这些事情的,所以让每个图片都带着作者的名字。
  • geckodriver 不应该被放置在项目的文件夹内,而更应该全局安装,并成为 path 系统环境变量的一部分。
  • 搜索功能很容易地扩展到包括多个查询,从而可以简化下载大量图片的过程。
  • 默认的浏览器可以从 firefox 变成 chrome 或者甚至 对这类项目来说会好很多。
本文中的所有译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接
我们的翻译工作遵照 cc 协议,如果我们的工作有侵犯到您的权益,请及时联系金年会app官方网。

原文地址:

译文地址:https://learnku.com/python/t/22975/30-mi...

本文为协同翻译文章,如您发现瑕疵请点击「改进」按钮提交优化建议
讨论数量: 3

其实selenium的用处还是挺多的,还可以去模拟登陆一些网站,来进行数据的爬取

6年前
destiny

试了一下很不错。扒了很多图片

6年前

good jobs

5年前

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!
网站地图