如何使用Python从网站上抓取图片

您是否希望使用Python从网页上下载图像?借助python语言语法及其关联的库,使该过程变得容易。在此页面上停留足够长的时间,以学习如何使用Python在线抓取图像。

我们正处于数据变得比以往任何时候都重要的时代,并且对数据的追求只会在未来增加。事实证明,互联网是最大的数据来源之一。从文本到可下载的文件,包括互联网上的图像,都有大量的数据。

互联网上的许多教程都着重于如何抓取文本,而忽略了有关如何抓取图像和其他可下载文件的指南。但是,这是可以理解的。大多数指南都不是很深入,并且没有很多Web抓取程序对抓取图像感兴趣,因为大多数处理文本数据的方法。如果您是对抓取图像感兴趣的少数人之一,则本指南已为您编写。


图像抓取比您想象的要容易

对于许多初学者来说,他们认为图像抓取与常规Web抓取不同。从实际意义上讲,实际上是相同的,差异很小。实际上,除了要处理大文件的图像外,您会发现您所需要的只是Web抓取和文件处理知识。

如果您尚不具备链接的抓取能力,则您的网页抓取技能将帮助您抓取图像的链接。有了链接,您只需要向链接发送HTTP请求以下载图像,然后创建文件以将其写入。

虽然很容易,但我知道分步指南将帮助您更好地了解如何完成此操作。为此,我们将在一个项目上工作-到项目结束时,您将了解从网页上抓取图像所需的操作。


项目构想一:从静态站点抓取图像

静态网站是一些最容易从中抓取图像的网站。这是因为当您将Web请求发送到请求静态页面的服务器时,所有组件都作为响应返回给您,而您所需要做的就是抓取链接,然后开始向每个链接发送HTTP请求。

对于依赖JavaScript渲染图像和其他内容的动态页面,您将需要采用其他方法才能在其上剪贴图像。

为了向您展示如何从静态页面上抓取图像,我们将研究一种通用的图像抓取工具,该工具可以在静态页面上抓取所有图像。该脚本接受页面的URL作为参数,并将页面上的所有图像下载到脚本文件夹中。


使用Python刮取静态页面的要求

Python使抓取变得非常简单而直接。有很多用于抓取图像的工具,您将必须根据用例,目标站点和个人喜好进行选择。对于本指南,您将需要以下内容。

  • 要求

Requests是一个用于HTTP请求的优雅python库。它被称为HTTP for Humans。作为网络抓取工具,“请求”是您应该熟悉的工具之一。虽然您可以使用标准库中附带的URL库,但是您需要知道Requests使很多事情变得简单。

  • Python Web爬网库和框架

  • BeautifulSoup

解析是Web抓取的关键方面之一,这可能很困难也很容易,具体取决于页面的结构。使用BeautifulSoup(一个用于Python的解析库),解析变得很容易。

  • Scrapy . Beautifulsoup . Selenium用于Web抓取cra
  • 涉及什么数据解析和解析技术?

  • 文件处理

抓取图像需要您知道如何处理文件。有趣的是,我们不需要像Python Imaging Library(PIL)这样的特殊库,因为我们所做的只是保存图像。


抓取图像的编码步骤

根据上述要求,您可以开始从网页中抓取图像。如果尚未安装Requests和BeautifulSoup,则需要安装它们,因为它们是Python标准库中未捆绑的第三方库。您可以使用pip命令安装它们。以下是用于安装这些库的命令。

pip install requests
pip install beautifulsoup4

现在到正确的编码。


  • 导入所需的库

第一步是导入所需的库,其中包括Requests和BeautifulSoup。

from urllib.parseimport urlparse
import requests
from bs4 import BeautifulSoup

从上面可以看到

urlparse

库也已导入。这是必需的,因为我们需要从URL中解析出域,并将其附加到具有相对URL的图像的URL中。


  • 在页面上刮取图像的链接
url = "https://ripple.com/xrp"
domain = urlparse(url).netloc
req = requests.get(url)
soup = BeautifulSoup(req.text, "html.parser")
raw_links = soup.find_all("img")
links = []
for iin raw_links:
    link = i['src']
if link.startswith("http"):
links.append(link)
else:
modified_link = "https://" + domain + link
links.append(modified_link)

查看上面的代码,您会注意到它执行3个任务-发送请求,解析URL,并将URL保存在links变量中。您可以将url变量更改为您选择的任何URL。

在第三行中,使用Requests发送HTTP请求-在第4行和第5行中,BeautifulSoup用于解析URL。

如果查看循环部分,将观察到只有具有绝对路径(URL)的图像会被添加到链接列表中。具有相对URL的URL需要进一步处理,而代码的else部分用于此目的。进一步的处理将域名URL添加到相对URL。


  • 下载并保存图像
for x in range(len(links)):
downloaded_image = requests.get(links[x]).content
with open(str(x) + ".jpg", "wb") as f:
f.write(downloaded_image)
print("Images scraped successfully... you can now check this script folder for your images")

上面我们要做的就是循环浏览图像URL列表,并使用请求下载每个图像的内容。随手准备好内容,然后为每个文件创建一个JPG文件,并将内容写入其中。它是如此简单。对于命名,我使用数字来表示每个图像。

这样做是因为脚本被编写为简单的概念证明。您可以决定对每个图像使用alt值-但要记住,有些图像对此不具有任何值为此,您必须提出一个命名公式。


  • 完整代码
from urllib.parseimport urlparse
import requests
from bs4 import BeautifulSoup

url = "https://ripple.com/xrp"
domain = urlparse(url).netloc
req = requests.get(url)
soup = BeautifulSoup(req.text, "html.parser")
raw_links = soup.find_all("img")
links = []
for iin raw_links:
    link = i['src']
if link.startswith("http"):
links.append(link)
else:
modified_link = "https://" + domain + link
links.append(modified_link)
# write images to files
for x in range(len(links)):
downloaded_image = requests.get(links[x]).content
with open(str(x) + ".jpg", "wb") as f:
f.write(downloaded_image)
print("Images scraped successfully... you can now check this script folder for your images")


项目构想二:使用Selenium进行图像抓取

并非所有站点都是静态站点。许多现代网站都是交互式的,并且具有丰富的JavaScript。对于这些网站,页面上的所有内容在发送HTTP请求时不会加载-大量内容是通过JavaScript事件加载的。

对于这样的站点,请求和beautifulsoup没用,因为它们不遵循静态站点方法,而请求和beautifulsoup是为之而用的。硒是完成这项工作的工具。

Selenium是一种浏览器自动化工具,最初是为测试Web应用程序而开发的,但已经看到了其他用途,包括Web抓取和常规Web自动化。使用Selenium,将启动真正的浏览器,并触发页面和JavaScript事件以确保所有内容均可用。我将向您展示如何使用Selenium从Google抓取图像。

  • Scrapy . Beautifulsoup . Seleniumy有什么区别
  • 无头浏览器,用于自动化测试

Selenium需求和设置

为了使Selenium正常工作,您将必须安装Selenium软件包并下载要使用的特定浏览器的浏览器驱动程序。在本指南中,我们将使用Chrome。要安装Selenium,请使用以下代码。

pip install selenium

安装了Selenium后,如果您的系统上尚未安装Chrome,则可以访问Chrome下载页面并进行安装。还需要下载Chrome驱动程序。

访问此页面以下载适用于您的Chrome浏览器版本的驱动程序。下载的文件是一个zip文件,其中包含chromedriver.exe文件。将chromedriver.exe文件解压缩到您的硒项目文件夹中。在同一文件夹中,放置了cghromedriver.exe文件,创建一个名为SeleImage.py的新python文件。


使用Selenium抓取图像的编码步骤

我将逐步指导您如何使用Selenium和Python编写Google Image scraper

  • 导入所需的库
from selenium import webdriver
from selenium.webdriver.chrome.optionsimport Options

webdriver类是我们将在本指南的Selenium包中使用的主要类。Options类用于设置webdriver选项,包括使其以无头模式运行。


keyword = "Selenium Guide"
driver = webdriver.Chrome()
driver.get("https://www.google.com/")
driver.find_element_by_name("q").send_keys(keyword)
driver.find_element_by_name("btnK").submit()

上面的代码对于任何Python编码器都是不言自明的。第一行包含我们要为其下载图像的搜索关键字。第二个节目,我们将使用Chrome来执行自动化任务。第三行发送对Google主页的请求。

使用element.find_element_by_name,我们能够使用名称属性“ q”访问搜索输入元素。使用send_keys方法填充了关键字,然后我们使用最后一行提交了查询。如果运行代码,您将看到Chrome将以自动化模式启动,填写查询表单,然后带您进入结果页面。


  • 切换到图片并下载前2张图片
driver.find_elements_by_class_name("hide-focus-ring")[1].click()
images = driver.find_elements_by_tag_name('img')[0:2]

for x in range(len(images)):
downloaded_image = requests.get(images[x].get_attribute('src')).content
with open(str(x) + ".jpg", "wb") as f:
f.write(downloaded_image)

上面的代码也是不言自明的。第一行找到图像搜索链接并单击它,将焦点从所有结果移到仅图像。第二个图像仅找到前两个图像。使用for循环,下载图像。


  • 完整代码
import requests
from selenium import webdriver

keyword = "Selenium Guide"
driver = webdriver.Chrome()
driver.get("https://www.google.com/")
driver.find_element_by_name("q").send_keys(keyword)
driver.find_element_by_name("btnK").submit()

driver.find_elements_by_class_name("hide-focus-ring")[1].click()
images = driver.find_elements_by_tag_name('img')[0:2]

for x in range(len(images)):
downloaded_image = requests.get(images[x].get_attribute('src')).content
with open(str(x) + ".jpg", "wb") as f:
f.write(downloaded_image)


从网上抓取图像的合法性

与过去无法明确判断网络抓取是否合法不一样,法院裁定支持网络抓取的合法性,前提是您不是在认证墙后面抓取数据,违反任何规则或对您的目标网站产生不利影响。

另一个可能导致网络抓取非法的问题是版权,并且您知道,Internet上的许多图像都已获得版权。这最终可能会给您带来麻烦。我不是律师,您不应该接受我所说的法律建议。我建议您就在互联网上抓取公开图像的合法性寻求律师服务。

结论

从上面的内容中,您发现了抓取Internet上公开可用的图像是多么容易。只要您不处理需要流式传输的大图像文件,该过程就很简单。

您可能会遇到的另一个问题是设置的反抓取技术问题,使您难以抓取Web数据。您还必须考虑相关的合法性,我建议您在这方面征询经验丰富的律师的意见。


  • 避免验证码:如何更有效地避免验证码?
  • 如何使用Javascript从网站抓取HTML?
  • Google Scraper 101:如何清除Google SERP
  • 搜寻没有封锁码和验证码的搜索引擎!