分步教程:如何使用 Python 抓取图片

指南, 如何, 搜索, 9月05日-2024年5 分钟阅读

在本篇博文中,我们将指导您使用 Python 从网站中抓取图片。您将学习如何使用流行的库入门,如何处理潜在的陷阱,甚至探索高级技术,将您的网络搜索技能提升到新的水平。

使用 Python 搜索图像的基础知识

要开始使用 Python 搜刮图像,您需要熟悉一些关键库,它们能让这项任务变得更容易。最常用的是 BeautifulSoup、Scrapy 和 Requests。

用于提取图片 URL 的 BeautifulSoup

BeautifulSoup 是一个用于解析 HTML 和 XML 文档的 Python 库。它从页面源代码中创建解析树,可用于轻松提取数据。

下面是一个如何使用 BeautifulSoup 提取图片 URL 的简单示例:

步骤 1:安装 BeautifulSoup 和 Requests:

 pipinstall bs4 requests

第 2 步:提取图片 URL:

 导入请求
bs4导入BeautifulSoup

 url ='https://books.toscrape.com/'

 response = requests.get(url)

 soup = BeautifulSoup(response.text,'html.parser')
 images = soup.find_all('img')

This code fetches the HTML content of the specified URL, parses it with BeautifulSoup, and then finds all the `<img>` tags, printing out their `src` attributes.

用 Python 下载图像

提取图片 URL 后,下一步就是下载它们。Requests 库简单易用,非常适合这项任务。

使用请求下载图像

以下是使用请求下载图像的方法:

从 URL 下载图片:

for ind, img in enumerate(images):
   img_data = requests.get(url+img['src']).content
   with open(f'image_{ind+1}.jpg', 'wb') as handler:
       handler.write(img_data)

该脚本会向图片 URL 发送 GET 请求,并将图片的二进制内容写入文件。

处理错误和异常

重要的是要处理错误和异常,以确保脚本在出现问题时也能顺利运行。下面是之前脚本的增强版:

错误处理:

for ind, img in enumerate(images):
   try:
       img_data = requests.get(url+img['src']).content
       with open(f'image_{ind+1}.jpg', 'wb') as handler:
           handler.write(img_data)
   except Exception as e:
       print(f"An error occurred during the extraction of image \n Image Url: {img['src']} \n Error: {e}")

该代码片段包含一个 try-except 块,用于捕捉下载过程中可能出现的任何错误。

图像扫描高级技术

对于更复杂的刮擦任务,例如刮擦多个页面或整个网站,Scrapy 是一个功能强大的库,可以高效地处理这些情况。

使用 Scrapy 完成复杂任务

Scrapy 是一个开源的 Python 协作式网络抓取框架。它的设计旨在提高速度和效率,因此非常适合大规模的抓取项目。

步骤 1:安装 Scrapy:

 pipinstall scrapy

步骤 2:创建 Scrapy 项目:

 scrapy startproject image_scraper
cdimage_scraper

步骤 3:定义蜘蛛:

创建一个包含以下内容的蜘蛛文件(`spiders/image_spider.py`):

import scrapy
class ImageSpider(scrapy.Spider):
   name = 'imagespider'
   start_urls = ['https://books.toscrape.com/']
   def parse(self, response):
       # Extract image URLs and convert them to absolute if necessary
       for img in response.css('img::attr(src)').getall():
           abs_img_url = response.urljoin(img)
           yield {'image_url': abs_img_url}
      
       # Find the link to the next page and create a request for it
       next_page = response.css('a.next::attr(href)').get()
       if next_page is not None:
           next_page_url = response.urljoin(next_page)
           yield response.follow(next_page_url, self.parse)

这个简单的 Scrapy 蜘蛛从给定的 URL 开始,提取所有图片 URL,并跟随下一页链接继续搜索。

改进图像抓取项目

为进一步改进您的搜索项目,请考虑使用应用程序接口(API)访问高质量图像,并自动执行任务以提高效率。

使用应用程序接口进行图像抓取

应用程序接口(API)为访问图片提供了一种可靠、合法的方式。许多网站都提供 API,允许您以编程方式搜索和下载图片。Unsplash API就是其中之一。

使用 Unsplash API 的示例:

import requests
# Replace 'YOUR_ACCESS_KEY' with your actual Unsplash Access Key
api_url = "https://api.unsplash.com/photos/random"
headers = {"Authorization": "Client-ID YOUR_ACCESS_KEY"}
params = {"query": "nature"}
try:
   response = requests.get(api_url, headers=headers, params=params)
   response.raise_for_status()  # This will raise an exception for HTTP errors
   data = response.json()
   image_url = data['urls']['full']
   print(image_url)
except requests.exceptions.HTTPError as err:
   print(f"HTTP error occurred: {err}")
except Exception as err:
   print(f"An error occurred: {err}")

该脚本使用 Unsplash API 随机获取自然图片。

自动执行图像抓取任务

自动化可节省时间,并确保您的刮擦任务顺利运行,而无需人工干预。Unix 系统上的 cron 作业或 Windows 系统上的任务调度程序等工具可以安排脚本定时运行。

Unix 系统上的 Cron 作业 - Crontab:

在类 Unix 操作系统中,Crontab 是一个功能强大的工具,用于调度任务,即在指定时间自动运行的"cron 作业"。让我们看看如何使用 Crontab 调度任务。

了解 Crontab 语法

crontab 文件由命令行组成,每行代表一个单独的任务。语法如下

分钟 小时多伦多 星期一 下班 cmd
  • MIN:分钟字段(0 至 59)
  • 小时小时字段(0 至 23)
  • DOM:月日(1 至 31)
  • MON: 月份字段(1 至 12)
  • DOW:星期(0 至 7,其中 0 和 7 代表星期日)
  • CMD:要运行的命令(在本例中,它将是 python 脚本的可执行文件)

下面是每天 8:00PM 运行 python 脚本的示例

0 20* * */usr/bin/python3/path/to/Image_Scraper.py

使用任务计划程序(Windows):

  • 打开任务计划程序(使用 Windows 的搜索栏搜索 "任务计划程序)
  • 点击"创建基本任务
  • 提供名称和描述,然后点击"下一步"。
  • 选择粒度或运行该任务所需的时间间隔,然后单击"下一步"。
  • 现在确保选中"启动程序",然后点击"下一步"。
  • 点击"浏览",提供 python 脚本的路径。如果需要为 python 脚本提供参数,可选择在"添加参数"字段中添加参数,然后点击"下一步"。
  • 最后一步,只需点击"完成",这项任务就可以在指定的时间间隔内运行了。

结论

在这篇博文中,我们探讨了如何使用 Python 从网站上抓取图片。我们介绍了使用 BeautifulSoup 和 Requests 的基础知识、使用 Scrapy 的高级技术以及符合道德规范的搜刮实践。此外,我们还讨论了如何使用 API 和自动化工具(如 Windows 任务调度程序)来增强您的搜刮项目。

图像扫描是一项强大的技能,它可以增强你的数据采集能力,为你的项目开辟新的可能性。

刮图愉快