图像抓取器使用完全指南–NetNut
简介
各种规模的公司都依赖准确和最新的数据来做出有关运营、投资和营销战略的重要决策。因此,他们利用网络抓取技术在几分钟内收集大量数据,同时消除人为错误,确保数据的完整性和相关性。网络抓取的一个重要方面是图像抓取–图像抓取器从网络上收集照片而不是文本。
使用图像抓取工具收集数据已成为影响企业如何处理视觉内容的关键。因此,本指南将探讨如何使用 Python 抓取图像、图像抓取的应用以及为什么需要 NetNut 代理。
图像抓取(Image Scraping)是指通过编写脚本自动从网站中提取图像的过程。这些脚本通常使用任何一种适合网页抓取的编程语言。图像抓取通常涉及访问网站的HTML源代码,识别图像URL(这些URL通常位于<img>标签中),并将图像下载到设备上的文件中。图像抓取对于图像的收集、分析和归档在研究、内容创作等应用中至关重要。
你选择的图像抓取方法取决于你的技术知识和需求。对于技术知识较少的用户,可以选择无需编程的图像抓取工具,这些工具使用起来简单方便。另一方面,如果需要定制化的抓取工具,用户可以使用像Python、JavaScript或R等编程语言构建抓取机器人——可以参考有关使用R进行网页抓取的指南。
使用 Python 进行图像抓取
本节将介绍如何使用 Python 和 Selenium 从网站抓取图像。通常,过程包括连接到目标网站、识别 HTML 代码、提取图像 URL,并下载图像。我们以目标网站“https://unsplash.com/s/photos/cats”为例。
安装 Python
由于我们选择的编程语言是 Python,第一步是访问官方网站并下载 Python。确保获取最新版本,因为这些版本通常带有可以提高编程效率的更新。我们还需要通过使用 IDE(集成开发环境)来准备编码环境,IDE 是一种可以构建、测试和编辑代码的工具,从而提高开发者的生产力。PyCharm 和 Microsoft Visual Studio 都是常见的 Python IDE。
接下来,我们需要初始化 Python 项目,使用以下代码:
bash
复制编辑
mkdir image-scrapercd image-scraper
python -m venv env
上述代码将在你的设备上创建一个 image-scraper 文件夹,并在其中添加一个 Python 虚拟环境。然后,你可以使用你喜欢的 Python IDE 打开该项目文件夹,创建一个 scraper.py 文件,并初始化它:
python
复制编辑
print(‘Hello, World!’)
此时,文件中只有一段简单的脚本,会打印出“Hello, World!”。接下来,我们需要验证脚本是否正常工作,你可以通过点击 IDE 的运行按钮,或者在命令行中使用以下代码来验证:
bash
复制编辑
python scraper.py
如果终端中出现“Hello, World!”的字样,说明 Python 项目已经成功运行,你可以开始实现从网站抓取图像的代码了。
安装 Selenium
Selenium 是一个广泛使用的抓取框架,因为它不仅可以处理静态网站,还能处理动态网站。这个浏览器自动化工具能够渲染需要执行 JavaScript 的页面。你可以参考这篇关于 Selenium 无头浏览器如何工作的指南。
与像 BeautifulSoup 这样的 HTML 解析器不同(它也是一个流行的网页抓取框架),Selenium 可以处理更多的网页,并且具有更广泛的应用。对于图像抓取来说,Selenium 是一个很好的选择,因为许多网站需要用户交互才能加载新图像。
然而,在安装 Selenium 之前,我们需要先激活 Python 虚拟环境。不同操作系统的步骤不同。
对于 Windows:
bash
复制编辑
env\Scripts\activate
对于 Linux 和 macOS:
bash
复制编辑
source env/bin/activate
在虚拟环境终端中,使用以下命令安装 Selenium WebDriver 包:
bash
复制编辑
pip install Selenium
请注意,安装过程可能需要一些时间,耐心等待。
连接到目标网站
导入 Selenium 和需要控制 Chrome 实例的类,在 scraper.py 文件中添加以下代码:
python
复制编辑
from selenium import webdriverfrom selenium.webdriver.chrome.service import Service as ChromeServicefrom selenium.webdriver.chrome.options import Options
接下来,初始化一个无头(headless)Chrome WebDriver 实例,使用以下代码:
python
复制编辑
# 以无头模式运行 Chrome
options = Options()
options.add_argument(“–headless”) # 开发时可以注释掉此行
# 初始化一个 Chrome WebDriver 实例# 并使用指定的选项
driver = webdriver.Chrome(
service=ChromeService(),
options=options
)
如果你希望 Selenium 启动一个带有图形用户界面的 Chrome 窗口,可以去掉 –headless 选项。这样,你可以实时查看脚本在页面上的操作,方便调试。然而,如果项目较大,可能需要保持 –headless 选项启用,以节省资源。
通过这种方式,你就能使用 Selenium 控制浏览器,访问目标网站,抓取图像数据。
关闭浏览器
在抓取完图像后,为了释放资源,重要的是要关闭浏览器窗口。可以通过在脚本的末尾添加以下行来实现这一点:
python
复制编辑
# 关闭浏览器并释放其资源
driver.quit()
最大化浏览器窗口
由于某些页面可能会根据用户设备的屏幕尺寸显示不同的图像,因此需要避免响应式内容的问题。为此,可以通过以下代码最大化 Chrome 浏览器窗口:
python
复制编辑
# 最大化浏览器窗口
driver.maximize_window()
连接到目标页面
此时,我们可以通过 Selenium 指示 Chrome 连接到目标页面,使用 get() 方法:
python
复制编辑
url = “https://unsplash.com/s/photos/cats”
driver.get(url)
运行图像抓取代码时,你会看到消息 “Chrome is being controlled by automated test software”,这表示窗口正在被 Selenium 按预期控制。
检查目标网站
这一阶段,我们需要检查目标网站的 HTML 源代码。页面检查是理解 HTML 元素、定义有效的节点选择逻辑以及如何提取所需数据的必要步骤。我们可以通过访问目标网站,在浏览器中右键单击图像并选择“检查”选项,打开开发者工具(DevTools)。
目标网站中的图像
图像被包含在 <img> HTML 元素中,这意味着选择图像节点的 CSS 选择器是:
css
复制编辑
[data-test=”photo-grid-masonry-img”]
此外,图像元素有 src 和 srcset 属性(srcset 指定多个源图像,并附带帮助浏览器选择合适图像的提示)。srcset 的格式如下:
php
复制编辑
<image_source_1_url> <image_source_1_size>, <image_source_2_url> <image_source_2_size>, …
其中:
- <image_source_1_url>, <image_source_2_url>等是不同大小的图像的 URL。
- <image_source_1_size>, <image_source_2_size>等是每个图像源的尺寸。允许的值包括像素宽度(如 150w)或像素比率(如 0x)。
因此,你可以通过 srcset 属性来提取不同分辨率和尺寸的图像链接。
从页面中提取所有图像的 URL
为了从网页中提取所有图像的 URL,我们可以使用 find_elements() 方法来选择页面上的所有 HTML 图像节点。代码如下:
python
复制编辑
image_html_nodes = driver.find_elements(By.CSS_SELECTOR, “[data-test=’photo-grid-masonry-img’]”)
但是,这段代码需要 Selenium WebDriver 才能正常工作,因此需要导入 By 模块:
python
复制编辑
from selenium.webdriver.common.by import By
初始化一个 URL 列表
接下来,我们需要初始化一个列表,用于存储从图像元素中提取的 URL。代码如下:
python
复制编辑
image_urls = []
遍历图像节点并提取图像 URL
此时,迭代 image_html_nodes 中的每个节点,提取 src 中的 URL 或者 srcset 中最大图像的 URL(如果有),并将其添加到 image_urls 列表中。代码如下:
python
复制编辑
for image_html_node in image_html_nodes:
try:
# 使用“src”中的 URL 作为默认行为
image_url = image_html_node.get_attribute(“src”)
# 如果存在“srcset”属性,提取最大图像的 URL
srcset = image_html_node.get_attribute(“srcset”)
if srcset is not None:
# 获取“srcset”值的最后一个元素
srcset_last_element = srcset.split(“, “)[-1]
# 获取该元素的第一个值,即图像的 URL
image_url = srcset_last_element.split(” “)[0]
# 将图像 URL 添加到列表中
image_urls.append(image_url)
except StaleElementReferenceException as e:
continue
处理动态页面中的元素
由于 Unsplash 是一个动态网站,某些图像在代码执行时可能不再存在于页面上。因此,需要添加对 StaleElementReferenceException 的处理,以避免出现错误。我们可以通过以下方式导入该异常:
python
复制编辑
from selenium.common.exceptions import StaleElementReferenceException
打印结果
为了查看抓取到的图像 URL,需要添加一行代码来打印列表:
python
复制编辑
print(image_urls)
运行脚本
当你运行上述代码时,脚本将输出包含所有提取到的图像 URL 的列表。这些 URL 可以用于进一步的下载或处理。
完整的代码示例:
python
复制编辑
from selenium import webdriverfrom selenium.webdriver.chrome.service import Service as ChromeServicefrom selenium.webdriver.chrome.options import Optionsfrom selenium.webdriver.common.by import Byfrom selenium.common.exceptions import StaleElementReferenceException
# 设置无头模式
options = Options()
options.add_argument(“–headless”)
# 初始化 WebDriver
driver = webdriver.Chrome(service=ChromeService(), options=options)
# 访问目标页面
url = “https://unsplash.com/s/photos/cats”
driver.get(url)
# 获取图像 HTML 元素
image_html_nodes = driver.find_elements(By.CSS_SELECTOR, “[data-test=’photo-grid-masonry-img’]”)
# 初始化图像 URL 列表
image_urls = []
# 遍历图像节点,提取 URLfor image_html_node in image_html_nodes:
try:
# 默认使用“src”中的 URL
image_url = image_html_node.get_attribute(“src”)
# 如果存在“srcset”属性,提取最大图像的 URL
srcset = image_html_node.get_attribute(“srcset”)
if srcset is not None:
srcset_last_element = srcset.split(“, “)[-1]
image_url = srcset_last_element.split(” “)[0]
# 将图像 URL 添加到列表
image_urls.append(image_url)
except StaleElementReferenceException as e:
continue
# 打印图像 URLprint(image_urls)
# 关闭浏览器
driver.quit()
结果
运行脚本后,你会看到打印出的图像 URL 列表。这些 URL 就是网页上所有图像的地址,可以进一步下载和处理。
下载图像
为了下载从页面中抓取到的图像,我们可以使用 Python 标准库中的 urlretrieve() 方法,来自 urllib.request 包。该方法通过复制由 URL 指定的网络对象到本地文件来实现图像下载。
导入 urllib.request
首先,在 scraper.py 文件的顶部添加以下代码,导入 urllib.request:
python
复制编辑
import urllib.request
创建保存图像的目录
在你的项目文件夹中创建一个名为 images 的目录,这是保存下载图像的地方。你可以在命令行中运行以下命令:
bash
复制编辑
mkdir images
下载图像
接下来,遍历之前抓取的图像 URL 列表,生成每个图像的增量文件名,并使用 urlretrieve() 方法下载图像。代码如下:
python
复制编辑
image_name_counter = 1
# 遍历每个图像 URL,下载图像并保存在本地“/images”文件夹for image_url in image_urls:
print(f”downloading image no. {image_name_counter} …”)
# 为每个图像生成文件名
file_name = f”./images/{image_name_counter}.jpg”
# 下载图像
urllib.request.urlretrieve(image_url, file_name)
print(f”Image downloaded successfully to \”{file_name}\”\n”)
# 增加图像计数器
image_name_counter += 1
运行代码
将所有代码合并后,你可以通过以下命令运行脚本:
bash
复制编辑
python scraper.py
结果
脚本将按顺序下载每个图像,并将其保存在本地的 images 文件夹中。下载成功后,控制台会显示每个图像下载的位置。
通过这个过程,你已经成功地使用 Python 抓取并下载了图像。
完整代码示例
python
复制编辑
import urllib.requestfrom selenium import webdriverfrom selenium.webdriver.chrome.service import Service as ChromeServicefrom selenium.webdriver.chrome.options import Optionsfrom selenium.webdriver.common.by import Byfrom selenium.common.exceptions import StaleElementReferenceException
# 设置无头模式
options = Options()
options.add_argument(“–headless”)
# 初始化 WebDriver
driver = webdriver.Chrome(service=ChromeService(), options=options)
# 访问目标页面
url = “https://unsplash.com/s/photos/cats”
driver.get(url)
# 获取图像 HTML 元素
image_html_nodes = driver.find_elements(By.CSS_SELECTOR, “[data-test=’photo-grid-masonry-img’]”)
# 初始化图像 URL 列表
image_urls = []
# 遍历图像节点,提取 URLfor image_html_node in image_html_nodes:
try:
# 默认使用“src”中的 URL
image_url = image_html_node.get_attribute(“src”)
# 如果存在“srcset”属性,提取最大图像的 URL
srcset = image_html_node.get_attribute(“srcset”)
if srcset is not None:
srcset_last_element = srcset.split(“, “)[-1]
image_url = srcset_last_element.split(” “)[0]
# 将图像 URL 添加到列表
image_urls.append(image_url)
except StaleElementReferenceException as e:
continue
# 创建保存图像的目录import osif not os.path.exists(‘./images’):
os.makedirs(‘./images’)
# 下载图像
image_name_counter = 1for image_url in image_urls:
print(f”downloading image no. {image_name_counter} …”)
file_name = f”./images/{image_name_counter}.jpg”
urllib.request.urlretrieve(image_url, file_name)
print(f”Image downloaded successfully to \”{file_name}\”\n”)
image_name_counter += 1
# 关闭浏览器
driver.quit()
这个完整的脚本将从指定的页面抓取图像,保存它们到本地,并确保有一个干净的结构用于存储下载的图像。
以下是改进 Python 图像抓取脚本的一些要点:
将图片 URL 导出到 CSV 或存储到数据库中,以备不时之需。
避免下载文件夹中已有的图片,以便有效管理资源。
记住要抓取元数据信息,因为它们可能有助于获取下载图片的完整信息。
如果需要抓取更多图片,可以模拟无限滚动交互来加载更多图片并下载它们。
图像抓取的应用图像抓取的应用
图像抓取与网络数据提取一样,已成为多个行业的重要工具。因此,我们将探讨图像抓取在某些行业中的应用。
数字营销和视觉内容
数字营销是电子商务业务的一个重要方面,图像抓取可用于为社交媒体和营销活动收集和创建可视化内容。营销人员可以从各种来源抓取图片,收集吸引人的图片,作为内容创建策略的一部分。随着对具有视觉吸引力的内容的需求增加,图像搜索将继续成为影响商业决策的最前沿,从而产生成功的数字营销活动。
例如,数字营销人员可以使用图像抓取为客户的社交媒体活动收集高质量的图像。他们可以根据特定的主题和关键词搜索图片,在多个社交媒体平台上创建具有视觉吸引力的内容。这种方法可以优化品牌知名度、提高参与度并改善营销活动的效果。随后,图片抓取可提供有价值的见解,使企业能够优化其内容策略,从而显著改善其运营。
电子商务
在电子商务领域,图片搜索对于收集和分析竞争对手的产品图片至关重要。通过搜索图片及其元数据,企业可以深入了解市场趋势、产品展示和定价。随后,这些信息有助于电子商务企业优化产品列表,在竞争激烈的行业中保持领先地位。
例如,在线卖家可以使用图片搜索来监控竞争对手的产品图片和元描述。通过分析图片,企业可以确定可以优化的领域,以确保最大的生产力。因此,他们可以提高客户参与度和销售额。
房地产
通过图像抓取,可以自动收集和分析多个上市网站上的房产图像,从而改变了房地产行业。此外,房地产公司还可以利用图像抓取技术收集与室内外设计以及楼层设计相关的数据。分析这些数据对于向潜在买家或租户提供可视化信息至关重要,从而提高客户满意度。
为图像搜索选择最佳代理服务器–NetNut为图像搜索选择最佳代理服务器–NetNut
与图像抓取相关的一些最常见挑战包括 IP 禁止、验证码和地理限制。为确保图像抓取器的最佳性能,您需要选择可靠的解决方案–网络抓取代理服务器,以应对所有这些挑战。然而,选择像 NetNut 这样可靠的供应商至关重要。凭借分布在 195 个国家/地区的超过 8500 万个旋转住宅代理和分布在 100 多个国家/地区的 500 万个移动 IPS,在全球范围内进行图像抓取成为可能。
NetNut 提供各种代理解决方案,旨在克服图像抓取的挑战。旋转式住宅代理是您的自动化解决方案,可确保您从世界任何地方访问实时图像。它允许您绕过地理限制,让您不受任何阻碍地访问相关图像。
可扩展性是图像搜索器运行的一个重要方面。NetNut 代理具有高度可扩展性,可提供高速度,确保您在几分钟内完成图片检索。
NetNut 代理服务器可隐藏您的实际 IP 地址,以避免 IP 屏蔽,并保持安全性和匿名性。这些代理带有智能 A1-CAPTCHA 解码器,可确保您的图像抓取不会受到这些旨在区分人类和机器人的挑战的阻碍。
此外,如果您需要定制的图像抓取解决方案,可以使用 NetNut 移动代理。请务必查看我们的内部解决方案–NetNut Scraper API,它允许您访问来自不同网站的数据。
结论
图像抓取工具是一种从不同网站自动收集图像的工具。本指南介绍了如何使用 Python 从网页上自动下载图片。 只需几行代码,用户就能在几分钟内创建一个能检索图片的刮板机器人。
尽管 Selenium 是一个优秀的网络数据检索框架,但它并不能提供针对反机器人系统的保护。因此,集成一个像 NetNut 这样可靠的解决方案至关重要,它能提供安全性和匿名性,并允许用户绕过验证码和 IP 禁止。
立即联系我们,开始使用。
常见问题
从网站上抓取图片合法吗?
一般来说,网络抓取不是非法活动,这也适用于图片抓取。不过,重要的是只下载公开可用的图片,遵守网站的使用条款并尊重 robots.txt 文件。 未经许可抓取受版权保护的图片可能违法或违反网站使用条款,从而导致 IP 封禁。因此,最好只抓取免费图片或获得图片所有者的许可。
什么是图片搜索器?
图像抓取器是一种程序或工具,可自动执行从网站抓取图像的过程。它可以是一个从指定网页下载图片的简单脚本,也可以是能够抓取多个网站、浏览动态内容并根据预先指定的指令下载图片的高级工具。此外,还可以使用 Python 和 JavaScript 等编程语言构建图像抓取工具。此外,用户还可以利用无需编码的现成搜索工具从网络中提取图片。
使用图像抓取工具有哪些最佳实践?
检查图像格式和大小,确保图像抓取工具可以处理这些格式和大小,以避免获得不一致和不完整的输出。
通过在搜索脚本中增加延迟来限制图片搜索请求的频率。此外,用户还可以利用缓存技术避免多次下载相同的图片。
遵守要抓取的网站提供的道德和法律规定。如果提取图片违反了版权法,那么该活动可能是非法的。此外,最好遵守网站规定的任何速率限制,以免被屏蔽。