如何用Python从网上抓取图片

654 阅读5分钟

Python图像采集器不仅仅是一个磨练你的编程技巧的工具。你也可以用它来为机器学习项目提供图片,或者生成网站缩略图。虽然可能有其他方法来做类似的事情,但没有什么能比使用你自己建立的工具的控制力更强。

了解如何使用Python和BeautifulSoup库从任何网站刮取图片。

图片刮取是合法的吗?

更普遍的网络搜刮一样,图片搜刮是一种下载网站内容的方法。这并不违法,但有一些规则和最佳做法你应该遵循。首先,如果一个网站明确表示不希望你这样做,你应该避免搜刮。你可以通过查找目标网站上的/robots.txt 文件来了解这一点。

大多数网站允许网络抓取,因为他们希望搜索引擎能够索引其内容。你可以抓取这样的网站,因为它们的图片是公开的。

然而,仅仅因为你可以下载图片,这并不意味着你可以把它当作自己的图片来使用。大多数网站授权他们的图像,以防止你重新发布它们或以其他方式重新使用它们。除非有特定的豁免权,否则总是认为你不能重复使用图片。

Python软件包的设置

在开始之前,你需要安装一些软件包。如果你的电脑上没有安装Python,请访问python.org官方网站,下载并安装最新版本。

接下来,打开你的终端到你的项目文件夹,并激活Python虚拟环境以隔离你的依赖关系。

最后,使用 pip 安装requestsBeautifulSoup包。

pip install bs4 requests

使用Python进行图像抓取

在这个图像抓取教程中,你将使用requests 库来获取包含目标图像的网页。然后,你将把该网站的响应传递给BeautifulSoup,从img标签中抓取所有图片链接地址。然后,你将把每个图片文件写进一个文件夹,以下载图片。

如何用Python的BeautifulSoup获取图片URLs

现在继续,在你的项目根目录下创建一个Python文件。确保你在文件名后面加上**.py**扩展名。

本教程中的每个代码片段都是前一个代码片段的延续。

任何好的代码编辑器打开Python文件,使用下面的代码来请求一个网页。

import requests
URL = "imagesiteURL" # Replace this with the website's URL
getURL = requests.get(URL, headers={"User-Agent":"Mozilla/5.0"})
print(getURL.status_code)

如果上面的程序输出一个200的响应代码,说明请求是成功的。否则,你可能要确保你的网络连接是稳定的。同时,确保你提供了一个有效的URL。

现在使用BeautifulSouphtml_parser的帮助下读取网页的内容。

from bs4 import BeautifulSoup
soup = BeautifulSoup(getURL.text, 'html.parser' )
images = soup.find_all('img')
print(images)

这段代码创建了一个对象的列表,每个对象代表网页中的一张图片。然而,你需要的是这些数据中每个图片的src属性的文本。

要从每个img标签中提取来源。

imageSources = []
 
for image in images:
    imageSources.append(image.get('src'))
 
print(imageSources)

重新运行你的代码,现在图像地址应该出现在一个新的列表中**(imageSources**)。你已经成功地从目标网页上提取了每个图像源。

如何用Python保存图片

首先,在你的项目根目录下创建一个下载目标文件夹,并将其命名为images

为了让Python成功地下载图片,它们的路径需要是完整的绝对URL。换句话说,它们需要包括 "http://"或 "https://"的前缀,加上网站的完整域名。如果网页使用相对的URL引用它的图像,你将需要把它们转换成绝对的URL。

在简单的情况下,当URL是绝对的,启动下载只是从早期提取的来源中请求每个图像。

for image in imageSources:
    webs = requests.get(image)
    open('images/' + image.split('/')[-1], 'wb').write(webs.content)

**image.split('/')[-1]**关键字在每个正斜杠(/)处分割图像链接。然后它从最后一个元素中检索图像文件名(包括任何扩展名)。

请记住,在少数情况下,图像文件名可能会发生冲突,导致下载被覆盖。请自由探索这个问题的解决方案,作为这个例子的延伸。

绝对URL可能会变得相当复杂,有很多边缘情况需要处理。幸运的是,在request.compat包中有一个有用的方法,叫做urljoin。这个方法返回一个完整的URL,给出一个基本的URL和一个可能是相对的URL。它允许你解决你将在hrefsrc属性中发现的值。

最后的代码看起来像这样。

from bs4 import BeautifulSoup
URL = "imagesiteURL" # Replace this with the website's URL
getURL = requests.get(URL, headers={"User-Agent":"Mozilla/5.0"})
soup = BeautifulSoup(getURL.text, 'html.parser')
 
images = soup.find_all('img')
resolvedURLs = []
 
for image in images:
    src = image.get('src')
    resolvedURLs.append(requests.compat.urljoin(URL, src))
 
for image in resolvedURLs:
    webs = requests.get(image)
    open('images/' + image.split('/')[-1], 'wb').write(webs.content)

不要缺少图像数据

许多图像识别项目由于没有足够的图像来训练模型而碰壁。但是你可以随时从网站上搜刮图片来增加你的数据库。值得庆幸的是,Python是一个强大的图像采集器,你可以连续使用,而不用担心会被淘汰。

如果你对从网络上获取其他类型的数据感兴趣,你可能想了解如何使用Python进行一般的网络搜刮。