在本篇博文中,我们将指导您使用 Python 从网站中抓取图片。您将学习如何使用流行的库入门,如何处理潜在的陷阱,甚至探索高级技术,将您的网络搜索技能提升到新的水平。
要开始使用 Python 搜刮图像,您需要熟悉一些关键库,它们能让这项任务变得更容易。最常用的是 BeautifulSoup、Scrapy 和 Requests。
BeautifulSoup 是一个用于解析 HTML 和 XML 文档的 Python 库。它从页面源代码中创建解析树,可用于轻松提取数据。
下面是一个如何使用 BeautifulSoup 提取图片 URL 的简单示例:
pipinstall bs4 requests
导入请求
从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.
提取图片 URL 后,下一步就是下载它们。Requests 库简单易用,非常适合这项任务。
以下是使用请求下载图像的方法:
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 是一个开源的 Python 协作式网络抓取框架。它的设计旨在提高速度和效率,因此非常适合大规模的抓取项目。
pipinstall scrapy
scrapy startproject image_scraper
cdimage_scraper
创建一个包含以下内容的蜘蛛文件(`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就是其中之一。
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 操作系统中,Crontab 是一个功能强大的工具,用于调度任务,即在指定时间自动运行的"cron 作业"。让我们看看如何使用 Crontab 调度任务。
crontab 文件由命令行组成,每行代表一个单独的任务。语法如下
分钟 小时多伦多 星期一 下班 cmd
下面是每天 8:00PM 运行 python 脚本的示例
0 20* * */usr/bin/python3/path/to/Image_Scraper.py
在这篇博文中,我们探讨了如何使用 Python 从网站上抓取图片。我们介绍了使用 BeautifulSoup 和 Requests 的基础知识、使用 Scrapy 的高级技术以及符合道德规范的搜刮实践。此外,我们还讨论了如何使用 API 和自动化工具(如 Windows 任务调度程序)来增强您的搜刮项目。
图像扫描是一项强大的技能,它可以增强你的数据采集能力,为你的项目开辟新的可能性。
刮图愉快